mcu_hi3321_watch/tjd/ui/app/phone/phone_app/TjdUiAppPhoneView.cpp
2025-05-26 20:15:20 +08:00

513 lines
18 KiB
C++

/*----------------------------------------------------------------------------
* Copyright (c) TJD Technologies Co., Ltd. 2025. All rights reserved.
*
* Description: TjdUiAppPhoneView.cpp
*
* Author: luziquan@ss-tjd.com
*
* Create: 2025-08-16
*--------------------------------------------------------------------------*/
#include "TjdUiAppPhoneView.h"
#include "TjdUiImageIds.h"
#include "TjdUiMemManage.h"
#include "TjdUiMultiLanguageExt.h"
#include "TjdUiUtils.h"
#include "animator/animator_manager.h"
#include "common/image_cache_manager.h"
#include "graphic_service.h"
#include "sys_config.h"
#define ENABLE_PRINT_INFO 1
#if ENABLE_PRINT_INFO
#define static_print_info(...) sys_ui_log_i(__VA_ARGS__) // 一般信息打印宏控制
#define static_print_warn(...) sys_ui_log_w(__VA_ARGS__) // 警告信息打印一般常开
#define static_print_error(...) sys_ui_log_e(__VA_ARGS__) // 错误信息打印一般常开
#define static_print_debug(...) sys_ui_log_d(__VA_ARGS__) // 调试信息打印一般常开
#else
#define static_print_info(...)
#define static_print_warn(...)
#define static_print_error(...)
#define static_print_debug(...)
#endif
namespace TJD {
static TjdUiAppPhoneView *g_phoneView = nullptr;
#define PHONE_IMAGE_BIN_PATH TJD_IMAGE_PATH "img_phone.bin"
PhoneViewIndex TjdUiAppPhoneView::currentViewIndex_ = PhoneViewIndex::PHONE_MAIN_LIST;
bool TjdUiAppPhoneView::isQuickEnter_ = false;
bool PhoneUIScrollView::OnDragStartEvent(const OHOS::DragEvent &event)
{
if (TjdUiAppPhoneView::IsQuickEnter()) {
return true;
}
if (TjdUiAppPhoneView::currentViewIndex_ != PhoneViewIndex::PHONE_UNKNOWN &&
TjdUiAppPhoneView::currentViewIndex_ != PhoneViewIndex::PHONE_MAIN_LIST) {
return true;
}
isOnStart_ = true;
return OHOS::UIScrollViewNested::OnDragStartEvent(event);
}
bool PhoneUIScrollView::OnDragEvent(const OHOS::DragEvent &event)
{
if (!isOnStart_) {
return true;
}
if (TjdUiAppPhoneView::IsQuickEnter()) {
return true;
}
if (TjdUiAppPhoneView::currentViewIndex_ != PhoneViewIndex::PHONE_UNKNOWN &&
TjdUiAppPhoneView::currentViewIndex_ != PhoneViewIndex::PHONE_MAIN_LIST) {
return true;
}
return OHOS::UIScrollViewNested::OnDragEvent(event);
}
bool PhoneUIScrollView::OnDragEndEvent(const OHOS::DragEvent &event)
{
if (!isOnStart_) {
return true;
}
isOnStart_ = false;
if (TjdUiAppPhoneView::IsQuickEnter()) {
return true;
}
if (TjdUiAppPhoneView::currentViewIndex_ != PhoneViewIndex::PHONE_UNKNOWN &&
TjdUiAppPhoneView::currentViewIndex_ != PhoneViewIndex::PHONE_MAIN_LIST) {
return true;
}
return OHOS::UIScrollViewNested::OnDragEndEvent(event);
}
TjdUiAppPhoneView::TjdUiAppPhoneView() { g_phoneView = this; }
TjdUiAppPhoneView::~TjdUiAppPhoneView() { g_phoneView = nullptr; }
TjdUiAppPhoneView *TjdUiAppPhoneView::GetInstance(void) { return g_phoneView; }
void TjdUiAppPhoneView::OnStart()
{
OHOS::ImageCacheManager::GetInstance().LoadAllInMultiRes(PHONE_IMAGE_BIN_PATH);
if (mainView_ == nullptr) {
mainView_ = new PhoneUIScrollView();
}
mainView_->SetPosition(0, 0, OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION);
// mainView_->SetOnDragListener(TjdUiAppPhonePresenter::GetInstance());
AddViewToRootContainer(mainView_);
}
void TjdUiAppPhoneView::OnStop()
{
currentViewIndex_ = PhoneViewIndex::PHONE_MAIN_LIST;
isQuickEnter_ = false;
mainView_->RemoveAll();
for (int i = 0; i < PhoneViewIndex::PHONE_UNKNOWN; i++) {
if (viewManager_[i] != nullptr) {
delete viewManager_[i];
viewManager_[i] = nullptr;
}
}
OHOS::ImageCacheManager::GetInstance().UnloadAllInMultiRes(PHONE_IMAGE_BIN_PATH);
}
void TjdUiAppPhoneView::InitTargetView(PhoneViewIndex index)
{
if (viewManager_[index] != nullptr) {
return;
}
// clang-format off
switch (index) {
case PHONE_MAIN_LIST: viewManager_[index] = new PhoneMainListView(); break;
case PHONE_CONTACT: viewManager_[index] = new PhoneContactView(); break;
case PHONE_CALL_LOG: viewManager_[index] = new PhoneCallLogView(); break;
case PHONE_DIAL: viewManager_[index] = new PhoneDialView(); break;
case PHONE_DISCONNECT: viewManager_[index] = new PhoneDisConnectView(); break;
default: break;
}
// clang-format on
if (viewManager_[index] == nullptr) {
return;
}
viewManager_[index]->SetPosition(0, 0);
viewManager_[index]->SetVisible(false);
mainView_->Add(viewManager_[index]);
}
void TjdUiAppPhoneView::ShowView(PhoneViewIndex showIndex)
{
if (showIndex < 0 || showIndex >= PhoneViewIndex::PHONE_UNKNOWN) {
return;
}
InitTargetView(showIndex);
if (currentViewIndex_ >= 0 && currentViewIndex_ < PhoneViewIndex::PHONE_UNKNOWN &&
viewManager_[currentViewIndex_] != nullptr) {
viewManager_[currentViewIndex_]->HideView();
}
if (viewManager_[showIndex] != nullptr) {
viewManager_[showIndex]->ShowView();
}
currentViewIndex_ = showIndex;
}
void TjdUiAppPhoneView::SetDialNumber(std::string &number)
{
InitTargetView(PhoneViewIndex::PHONE_DIAL);
static_cast<PhoneDialView *>(viewManager_[PhoneViewIndex::PHONE_DIAL])->SetNumber(number);
}
#pragma region 电话主界面列表选择
PhoneMainListView::PhoneMainListView()
{
auto &images = OHOS::ImageCacheManager::GetInstance();
Resize(OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION);
if (OHOS::PageTransitionMgr::GetInstance().GetTopSlideBackImage() == nullptr) {
SetOnDragListener(TjdUiAppPhonePresenter::GetInstance());
}
listInfo_.clear();
listInfo_.push_back({PHONE_CALL_LOG, OHOS::FontGlobalManager::GetInstance()->GetText(STR_ID_234), "",
images.LoadOneInMultiRes(IMG_PHONE_CALL, PHONE_IMAGE_BIN_PATH)});
listInfo_.push_back({PHONE_CONTACT, OHOS::FontGlobalManager::GetInstance()->GetText(STR_ID_235), "",
images.LoadOneInMultiRes(IMG_PHONE_CONTACTS, PHONE_IMAGE_BIN_PATH)});
listInfo_.push_back({PHONE_DIAL, OHOS::FontGlobalManager::GetInstance()->GetText(STR_ID_236), "",
images.LoadOneInMultiRes(IMG_PHONE_DIAL, PHONE_IMAGE_BIN_PATH)});
adapter_ = new TjdUITransformListGroupAdapter<PhoneListItemInfo, PhoneMainItemView, std::list<PhoneListItemInfo>>(
listInfo_);
listGroup_ = new TjdUITransformListGroup(adapter_);
title_.SetTextId(STR_ID_08);
title_.SetFont(TJD_VECTOR_FONT_FILENAME, 32);
title_.Resize(200, 100);
title_.SetX((listGroup_->GetWidth() >> 1) - (title_.GetWidth() >> 1));
title_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER);
auto titleOffset_ = ((OHOS::Screen::GetInstance().GetHeight() >> 1) - (128 >> 1) - 17 - title_.GetHeight());
listGroup_->AddCustomView(&title_, TjdUITransformListGroup::CustomViewPos::TITLE);
listGroup_->SetTitleOffset(titleOffset_);
Add(listGroup_);
}
void PhoneMainListView::ShowView()
{
SetVisible(true);
TjdUiUtils::ViewRequestFocus(*listGroup_);
}
void PhoneMainListView::HideView()
{
listGroup_->ClearFocus();
SetVisible(false);
}
#pragma endregion
#pragma region 联系人界面
PhoneContactView::PhoneContactView()
{
auto &image = OHOS::ImageCacheManager::GetInstance();
Resize(OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION);
SetOnDragListener(TjdUiAppPhonePresenter::GetInstance());
errorView_.SetPosition(0, 0, OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION);
errorViewTitle_.SetTextId(STR_ID_235);
errorViewTitle_.SetFont(TJD_VECTOR_FONT_FILENAME, 32);
errorViewTitle_.Resize(200, 100);
errorViewTitle_.SetX((errorView_.GetWidth() >> 1) - (errorViewTitle_.GetWidth() >> 1));
errorViewTitle_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER);
bg_.SetPosition(162, 127, 141, 165);
bg_.SetSrc(image.LoadOneInMultiRes(IMG_PHONE_ICON_NOCONTACT, PHONE_IMAGE_BIN_PATH));
desc_.SetFont(TJD_VECTOR_FONT_FILENAME, 32);
desc_.SetTextId(STR_ID_238);
desc_.Resize(300, 140);
desc_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_TOP);
desc_.SetPosition(((GetWidth() - desc_.GetWidth()) >> 1), bg_.GetY() + bg_.GetHeight() + 20);
errorView_.Add(&errorViewTitle_);
errorView_.Add(&bg_);
errorView_.Add(&desc_);
adapter_ =
new TjdUITransformListGroupAdapter<PhoneListItemInfo, PhoneContactItemView, std::list<PhoneListItemInfo>>(
listInfo_);
listGroup_ = new TjdUITransformListGroup(adapter_);
title_.SetTextId(STR_ID_235);
title_.SetFont(TJD_VECTOR_FONT_FILENAME, 32);
title_.Resize(200, 100);
title_.SetX((listGroup_->GetWidth() >> 1) - (title_.GetWidth() >> 1));
title_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER);
auto titleOffset_ = ((OHOS::Screen::GetInstance().GetHeight() >> 1) - (128 >> 1) - 17 - title_.GetHeight());
listGroup_->AddCustomView(&title_, TjdUITransformListGroup::CustomViewPos::TITLE);
listGroup_->SetTitleOffset(titleOffset_);
Add(&errorView_);
Add(listGroup_);
}
PhoneContactView::~PhoneContactView()
{
errorView_.RemoveAll();
RemoveAll();
if (adapter_ != nullptr) {
delete adapter_;
adapter_ = nullptr;
}
if (listGroup_ != nullptr) {
listGroup_->RemoveAll();
delete listGroup_;
listGroup_ = nullptr;
}
}
void PhoneContactView::ShowView()
{
TjdUiAppPhonePresenter *presenter = TjdUiAppPhonePresenter::GetInstance();
if (presenter->GetNeedRefreshContact()) {
RefreshContactList();
auto transformItemList_ = listGroup_->GetTransformList();
transformItemList_->RefreshList();
transformItemList_->ScrollTo(0);
presenter->SetNeedRefreshContact(false);
}
SetVisible(true);
auto list = TjdUiAppPhonePresenter::GetInstance()->GetContactListCase();
if (list.empty()) {
errorView_.SetVisible(true);
listGroup_->SetVisible(false);
} else {
errorView_.SetVisible(false);
listGroup_->SetVisible(true);
TjdUiUtils::ViewRequestFocus(*listGroup_);
}
}
void PhoneContactView::HideView()
{
SetVisible(false);
listGroup_->ClearFocus();
}
void PhoneContactView::RefreshContactList()
{
auto &image = OHOS::ImageCacheManager::GetInstance();
int index = 0;
const int resId[] = {IMG_PHONE_ICON01, IMG_PHONE_ICON02, IMG_PHONE_ICON03, IMG_PHONE_ICON04};
listInfo_.clear();
auto list = TjdUiAppPhonePresenter::GetInstance()->GetContactListCase();
for (auto &item : list) {
auto iconRes = image.LoadOneInMultiRes(resId[(index++) % 4], PHONE_IMAGE_BIN_PATH);
listInfo_.push_back({item.index, item.name, item.number, iconRes});
}
}
#pragma endregion
#pragma region 通话记录界面
PhoneCallLogView::PhoneCallLogView()
{
auto &image = OHOS::ImageCacheManager::GetInstance();
Resize(OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION);
SetOnDragListener(TjdUiAppPhonePresenter::GetInstance());
callLogStatusResId[CALL_LOG_STATUS_OUT] = IMG_PHONE_INCOMING_CAL;
callLogStatusResId[CALL_LOG_STATUS_IN] = IMG_PHONE_OUTGOING_CALL;
callLogStatusResId[CALL_LOG_STATUS_MISS] = IMG_PHONE_MISSED_CALL;
errorView_.SetPosition(0, 0, OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION);
errorViewTitle_.SetTextId(STR_ID_234);
errorViewTitle_.SetFont(TJD_VECTOR_FONT_FILENAME, 32);
errorViewTitle_.Resize(200, 100);
errorViewTitle_.SetX((errorView_.GetWidth() >> 1) - (errorViewTitle_.GetWidth() >> 1));
errorViewTitle_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER);
bg_.SetPosition(162, 127, 141, 165);
bg_.SetSrc(image.LoadOneInMultiRes(IMG_PHONE_ICON_NOCALL, PHONE_IMAGE_BIN_PATH));
desc_.SetFont(TJD_VECTOR_FONT_FILENAME, 32);
desc_.SetTextId(STR_ID_237);
desc_.Resize(300, 140);
desc_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_TOP);
desc_.SetPosition(((GetWidth() - desc_.GetWidth()) >> 1), bg_.GetY() + bg_.GetHeight() + 20);
errorView_.Add(&errorViewTitle_);
errorView_.Add(&bg_);
errorView_.Add(&desc_);
listInfo_.clear();
adapter_ =
new TjdUITransformListGroupAdapter<PhoneListItemInfo, PhoneCallLogItemView, std::list<PhoneListItemInfo>>(
listInfo_);
listGroup_ = new TjdUITransformListGroup(adapter_);
title_.SetTextId(STR_ID_234);
title_.SetFont(TJD_VECTOR_FONT_FILENAME, 32);
title_.Resize(200, 100);
title_.SetX((listGroup_->GetWidth() >> 1) - (title_.GetWidth() >> 1));
title_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER);
auto titleOffset_ = ((OHOS::Screen::GetInstance().GetHeight() >> 1) - (128 >> 1) - 17 - title_.GetHeight());
listGroup_->AddCustomView(&title_, TjdUITransformListGroup::CustomViewPos::TITLE);
listGroup_->SetTitleOffset(titleOffset_);
Add(&errorView_);
Add(listGroup_);
}
PhoneCallLogView::~PhoneCallLogView()
{
errorView_.RemoveAll();
RemoveAll();
if (adapter_ != nullptr) {
delete adapter_;
adapter_ = nullptr;
}
if (listGroup_ != nullptr) {
listGroup_->RemoveAll();
delete listGroup_;
listGroup_ = nullptr;
}
}
void PhoneCallLogView::ShowView()
{
TjdUiAppPhonePresenter *presenter = TjdUiAppPhonePresenter::GetInstance();
if (presenter->GetNeedRefreshCallLog()) {
RefreshCallLogList();
auto transformItemList_ = listGroup_->GetTransformList();
transformItemList_->RefreshList();
transformItemList_->SetReboundSize(0);
transformItemList_->ScrollBy(transformItemList_->GetHeight());
transformItemList_->SetReboundSize(transformItemList_->GetHeight() >> 1);
presenter->SetNeedRefreshCallLog(false);
}
SetVisible(true);
std::list<PhoneListCaseInfo> &list = presenter->GetCallLogListCase();
if (list.empty()) {
errorView_.SetVisible(true);
listGroup_->SetVisible(false);
} else {
errorView_.SetVisible(false);
listGroup_->SetVisible(true);
TjdUiUtils::ViewRequestFocus(*listGroup_);
}
}
void PhoneCallLogView::HideView()
{
SetVisible(false);
listGroup_->ClearFocus();
}
void PhoneCallLogView::RefreshCallLogList()
{
auto &image = OHOS::ImageCacheManager::GetInstance();
int index = 0;
listInfo_.clear();
auto list = TjdUiAppPhonePresenter::GetInstance()->GetCallLogListCase();
for (auto &item : list) {
auto iconRes = image.LoadOneInMultiRes(callLogStatusResId[item.status], PHONE_IMAGE_BIN_PATH);
listInfo_.push_back({item.index, item.name, item.number, iconRes});
}
}
#pragma endregion
#pragma region 拨号界面
PhoneDialView::PhoneDialView()
{
auto &image = OHOS::ImageCacheManager::GetInstance();
SetOnDragListener(TjdUiAppPhonePresenter::GetInstance());
Resize(OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION);
int defaultResId[12] = {IMG_PHONE_DEFAULT_01, IMG_PHONE_DEFAULT_02, IMG_PHONE_DEFAULT_03, IMG_PHONE_DEFAULT_04,
IMG_PHONE_DEFAULT_05, IMG_PHONE_DEFAULT_06, IMG_PHONE_DEFAULT_07, IMG_PHONE_DEFAULT_08,
IMG_PHONE_DEFAULT_09, IMG_PHONE_DEFAULT_10, IMG_PHONE_DEFAULT_11, IMG_PHONE_DEFAULT_12};
int triggeredResId[12] = {IMG_PHONE_DEFAULT_01_PRESS, IMG_PHONE_DEFAULT_02_PRESS, IMG_PHONE_DEFAULT_03_PRESS,
IMG_PHONE_DEFAULT_04_PRESS, IMG_PHONE_DEFAULT_05_PRESS, IMG_PHONE_DEFAULT_06_PRESS,
IMG_PHONE_DEFAULT_07_PRESS, IMG_PHONE_DEFAULT_08_PRESS, IMG_PHONE_DEFAULT_09_PRESS,
IMG_PHONE_DEFAULT_10_PRESS, IMG_PHONE_DEFAULT_11_PRESS, IMG_PHONE_DEFAULT_12_PRESS};
dialEdit_.SetPosition(75, 69, 315, 50);
dialEdit_.SetFont(TJD_VECTOR_FONT_FILENAME, 46);
dialEdit_.SetLineBreakMode(OHOS::UILabel::LINE_BREAK_CLIP);
dialEdit_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER);
int16_t startX = 35;
int16_t startY = 129;
int16_t width = 128;
int16_t height = 66;
for (int i = 0; i < 12; i++) {
dialBtn_[i].SetViewId(dialId_[i].c_str());
dialBtn_[i].SetOnTouchListener(TjdUiAppPhonePresenter::GetInstance());
dialBtn_[i].SetOnLongPressListener(TjdUiAppPhonePresenter::GetInstance());
dialBtn_[i].SetStyle(OHOS::STYLE_BACKGROUND_OPA, 0);
dialBtn_[i].SetStyleForState(OHOS::STYLE_BACKGROUND_OPA, 0, OHOS::UIButton::ButtonState::PRESSED);
dialBtn_[i].SetPosition(startX + (width + 6) * (i % 3), startY + (height + 9) * (i / 3), width, height);
auto defaultRes = image.LoadOneInMultiRes(defaultResId[i], PHONE_IMAGE_BIN_PATH);
auto triggeredRes = image.LoadOneInMultiRes(triggeredResId[i], PHONE_IMAGE_BIN_PATH);
if (defaultRes != nullptr && triggeredRes != nullptr) {
dialBtn_[i].SetImageSrc(defaultRes, triggeredRes);
}
Add(&dialBtn_[i]);
}
Add(&dialEdit_);
}
PhoneDialView::~PhoneDialView() { RemoveAll(); }
void PhoneDialView::SetNumber(std::string &number)
{
auto it = fontSizeMap.find(number.size());
if (it != fontSizeMap.end()) {
dialEdit_.SetFont(TJD_VECTOR_FONT_FILENAME, it->second);
} else if (number.size() <= 12) {
dialEdit_.SetFont(TJD_VECTOR_FONT_FILENAME, 46);
}
dialEdit_.SetText(number.c_str());
}
#pragma endregion
#pragma region 尚未连接App界面
PhoneDisConnectView::PhoneDisConnectView()
{
auto &image = OHOS::ImageCacheManager::GetInstance();
Resize(OHOS::HORIZONTAL_RESOLUTION, OHOS::VERTICAL_RESOLUTION);
SetOnDragListener(TjdUiAppPhonePresenter::GetInstance());
bg_.SetPosition(160, 126, 146, 146);
bg_.SetSrc(image.LoadOneInMultiRes(IMG_PHONE_PROMPT_FAIL, PHONE_IMAGE_BIN_PATH));
desc_.SetTextId(STR_ID_239);
desc_.SetFont(TJD_VECTOR_FONT_FILENAME, 32);
desc_.Resize(300, 140);
desc_.SetX((GetWidth() >> 1) - (desc_.GetWidth() >> 1));
desc_.SetY(bg_.GetY() + bg_.GetHeight() + 10);
desc_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_TOP);
Add(&bg_);
Add(&desc_);
}
#pragma endregion
} // namespace TJD