mcu_hi3321_watch/tjd/ui/watch_face/custom/TjdUiWFPageCustom.cpp
2025-05-26 20:15:20 +08:00

426 lines
14 KiB
C++

/*----------------------------------------------------------------------------
* Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved.
*
* Description:
*
* Author: huangshuyi
*
* Create: 2024-4
*--------------------------------------------------------------------------*/
#include "TjdUiWFPageCustom.h"
#include "TjdUiAppMainPresenter.h"
#include "TjdUiImageIds.h"
#include "TjdUiMemManage.h"
#include "TjdUiMultiLanguageExt.h"
#include "TjdUiWFCustomParse.h"
#include "common/image_cache_manager.h"
#include "common/key_code.h"
#include "rtc_api.h"
#include "sql_setting.h"
#include "sys_config.h"
#include "ui_screennotify.h"
#if ENABLE_MEMORY_CHECK
#include "gfx_utils/mem_check.h"
#endif
using namespace OHOS;
namespace TJD {
#define ENABLE_PRINT_INFO 0
#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
#define IMAGE_WF_CUNSTOM_BIN_PATH TJD_IMAGE_PATH "img_main_wf.bin"
static TjdUiWFPageCustom *g_wfPageCustom = nullptr;
static TjdUiWFCustomVideoPage *g_video{nullptr};
static void ScreenStatusNotify(ScreenStatus status)
{
if (g_video == nullptr) {
return;
}
if (status == SCREEN_STATUS_OFF) {
g_video->PausePlay();
} else if (status == SCREEN_STATUS_ON) {
if (g_video->IsPaused()) {
g_video->ResumePlay();
} else if (!g_video->IsPlayed()) {
g_video->StartPlay();
}
}
}
TjdUiWFPageCustom::TjdUiWFPageCustom() : wfParse_(new TjdUiWFCustomParse())
{
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
SetPeriod(500);
registerNotifyScreenStatus(ScreenStatusNotify);
}
TjdUiWFPageCustom::~TjdUiWFPageCustom()
{
deregisterNotifyScreenStatus(ScreenStatusNotify);
if (viewiInitStatus) {
OnInactive();
ImageCacheManager::GetInstance().UnloadAllInMultiRes(IMAGE_WF_CUNSTOM_BIN_PATH);
TjdUiMemManage::DeleteChildren(mainView_);
if (mainView_) {
delete mainView_;
mainView_ = nullptr;
}
wfParse_->Unload();
viewiInitStatus = false;
}
UnLoad();
}
void TjdUiWFPageCustom::PreLoad(void)
{
static_print_debug("TjdUiWFPageCustom::PreLoad");
// MemCheck::GetInstance()->EnableLeakCheck(true);
if (!viewiInitStatus) {
ImageCacheManager::GetInstance().LoadAllInMultiRes(IMAGE_WF_CUNSTOM_BIN_PATH);
InitView();
Update();
viewiInitStatus = true;
}
}
void TjdUiWFPageCustom::UnLoad(void)
{
static_print_debug("TjdUiWFPageCustom::UnLoad");
// MemCheck::GetInstance()->EnableLeakCheck(false);
// Main clock view is commonly used page, so we do not release it's resources inner slice.
}
void TjdUiWFPageCustom::InitView(void)
{
ImageCacheManager &images = ImageCacheManager::GetInstance();
static_print_debug("TjdUiWFPageCustom::InitView");
SetCoverable(true);
mainView_ = new UIViewGroup();
mainView_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
Add(mainView_);
if (wfParse_->ParseOnlineWfData(mainView_) == false) {
static_print_error("ParseOnlineWfData failed, use default view");
bg_ = new UIImageView();
mainView_->Add(bg_);
bg_->SetPosition(0, 0);
bg_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_BG, IMAGE_WF_CUNSTOM_BIN_PATH));
}
video_ = wfParse_->GetVideoPage();
uint8_t hour = 8;
uint8_t min = 0;
uint8_t am_pm = 0;
hourHigh_ = new UIImageView();
hourHigh_->SetViewId("hourHigh");
mainView_->Add(hourHigh_);
hourHigh_->SetPosition(141, 193);
hourHigh_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_0 + hour / 10 % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
hourLow_ = new UIImageView();
mainView_->Add(hourLow_);
hourLow_->SetViewId("hourLow_");
hourLow_->AlignRightToSibling(hourHigh_->GetViewId());
hourLow_->AlignTopToSibling(hourHigh_->GetViewId());
hourLow_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_0 + hour % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
colon_ = new UIImageView();
mainView_->Add(colon_);
colon_->SetViewId("colon_");
colon_->AlignRightToSibling(hourLow_->GetViewId());
colon_->AlignTopToSibling(hourLow_->GetViewId());
colon_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_B, IMAGE_WF_CUNSTOM_BIN_PATH));
colon_->SetVisible(false);
minHigh_ = new UIImageView();
mainView_->Add(minHigh_);
minHigh_->SetViewId("minHigh_");
minHigh_->AlignRightToSibling(colon_->GetViewId());
minHigh_->AlignTopToSibling(colon_->GetViewId());
minHigh_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_0 + min / 10 % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
minLow_ = new UIImageView();
mainView_->Add(minLow_);
minLow_->SetViewId("minLow_");
minLow_->AlignRightToSibling(minHigh_->GetViewId());
minLow_->AlignTopToSibling(minHigh_->GetViewId());
minLow_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_0 + min % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
uint8_t month = 1; //获得当前的月份
uint8_t day = 1; //获得当前的日期
monthHigh_ = new UIImageView();
mainView_->Add(monthHigh_);
monthHigh_->SetViewId("monthHigh_");
monthHigh_->SetPosition(150, 256);
monthHigh_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_0 + 1 / 10 % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
monthLow_ = new UIImageView();
mainView_->Add(monthLow_);
monthLow_->SetViewId("monthLow_");
monthLow_->AlignRightToSibling(monthHigh_->GetViewId());
monthLow_->AlignTopToSibling(monthHigh_->GetViewId());
monthLow_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_0 + month % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
date_ = new UIImageView();
mainView_->Add(date_);
date_->SetViewId("date_");
date_->AlignRightToSibling(monthLow_->GetViewId());
date_->AlignTopToSibling(monthLow_->GetViewId());
date_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_A, IMAGE_WF_CUNSTOM_BIN_PATH));
dayHigh_ = new UIImageView();
mainView_->Add(dayHigh_);
dayHigh_->SetViewId("dayHigh_");
dayHigh_->AlignRightToSibling(date_->GetViewId());
dayHigh_->AlignTopToSibling(date_->GetViewId());
dayHigh_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_0 + day / 10 % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
dayLow_ = new UIImageView();
mainView_->Add(dayLow_);
dayLow_->SetViewId("dayLow_");
dayLow_->AlignRightToSibling(dayHigh_->GetViewId());
dayLow_->AlignTopToSibling(dayHigh_->GetViewId());
dayLow_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_0 + day % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
uint8_t lang = LANGUAGE_CHINESE; //获得多语言的值
uint8_t week = 1; //获得当前是星期几
week_ = new UIImageView();
mainView_->Add(week_);
week_->SetPosition(238, 253);
week_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_WEEK_CH_0 + week % 7, IMAGE_WF_CUNSTOM_BIN_PATH));
amPm_ = new UIImageView();
uint32_t imgList[2][2] = {{IMG_MAIN_WF_AM_EN, IMG_MAIN_WF_PM_EN}, {IMG_MAIN_WF_AM_CH, IMG_MAIN_WF_PM_CH}};
amPm_->SetSrc(images.LoadOneInMultiRes(imgList[lang][am_pm], IMAGE_WF_CUNSTOM_BIN_PATH));
mainView_->Add(amPm_);
amPm_->SetPosition(301, 203);
}
void TjdUiWFPageCustom::Update(void)
{
ImageCacheManager &images = ImageCacheManager::GetInstance();
if (colon_) {
if (colon_->IsVisible()) {
colon_->SetVisible(0);
} else {
colon_->SetVisible(1);
}
}
rtc_class_ops *rtc = tjd_driver_rtc_get_ops();
struct rtc_time localTime;
rtc->get_rtc_time(&localTime);
uint8_t hour = localTime.tm_hour; //获得当前的小时
uint8_t min = localTime.tm_min;
uint8_t am_pm = 0;
if (sql_setting_get_time_format() == 1) {
if (hour > 12) {
hour -= 12;
am_pm = 1;
} else if (hour == 0) {
hour = 12;
} else if (hour == 12) {
am_pm = 1;
}
}
if (hourHigh_) {
hourHigh_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_0 + hour / 10 % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
}
if (hourLow_) {
hourLow_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_0 + hour % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
}
if (minHigh_) {
minHigh_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_0 + min / 10 % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
}
if (minLow_) {
minLow_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_TIME_NUM_0 + min % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
}
uint8_t month = localTime.tm_mon; //获得当前的月份
uint8_t day = localTime.tm_mday; //获得当前的日期
uint8_t week = localTime.tm_wday; //获得当前是星期几
if (monthHigh_) {
monthHigh_->SetSrc(
images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_0 + month / 10 % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
}
if (monthLow_) {
monthLow_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_0 + month % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
}
if (dayHigh_) {
dayHigh_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_0 + day / 10 % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
}
if (dayLow_) {
dayLow_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_DATE_NUM_0 + day % 10, IMAGE_WF_CUNSTOM_BIN_PATH));
}
uint8_t lang = sql_setting_get_language(); //获得多语言的值
lang = (lang > 1) ? 1 : lang;
if (week_) {
if (lang == 0) {
week_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_WEEK_EN_0 + week % 7, IMAGE_WF_CUNSTOM_BIN_PATH));
} else {
week_->SetSrc(images.LoadOneInMultiRes(IMG_MAIN_WF_WEEK_CH_0 + week % 7, IMAGE_WF_CUNSTOM_BIN_PATH));
}
}
if (amPm_) {
uint32_t imgList[2][2] = {{IMG_MAIN_WF_AM_EN, IMG_MAIN_WF_PM_EN}, {IMG_MAIN_WF_AM_CH, IMG_MAIN_WF_PM_CH}};
amPm_->SetSrc(images.LoadOneInMultiRes(imgList[lang][am_pm], IMAGE_WF_CUNSTOM_BIN_PATH));
if (sql_setting_get_time_format() == 0) {
amPm_->SetVisible(false);
} else {
amPm_->SetVisible(true);
}
}
}
void TjdUiWFPageCustom::ScrollBegin(bool isActive)
{
static_print_debug("TjdUiWFPageCustom::ScrollBegin");
TjdUiWfBase::ScrollBegin(isActive);
if (isActive) {
DoPause();
}
}
void TjdUiWFPageCustom::ScrollEnd(bool isActive)
{
static_print_debug("TjdUiWFPageCustom::ScrollEnd");
TjdUiWfBase::ScrollEnd(isActive);
TjdUiAppMainPresenter *mainPresenter = TjdUiAppMainPresenter::GetInstance();
if ((mainPresenter == nullptr) ||
(mainPresenter->GetMainPresenterState() != TjdUiAppMainPresenter::MainPresenterState::RESUME)) {
return;
}
if (isActive) {
DoStart();
} else {
if (video_ != nullptr && !video_->IsStopped()) {
video_->StopPlay();
}
if (video_ != nullptr) {
ClearCache();
}
}
}
void TjdUiWFPageCustom::CoverBegin(bool isCovered)
{
static_print_debug("TjdUiWFPageCustom::CoverBegin");
TjdUiWfBase::CoverBegin(isCovered);
if (!isCovered) {
DoPause();
}
}
void TjdUiWFPageCustom::CoverEnd(bool isCovered)
{
static_print_debug("TjdUiWFPageCustom::CoverEnd");
TjdUiWfBase::CoverEnd(isCovered);
TjdUiAppMainPresenter *mainPresenter = TjdUiAppMainPresenter::GetInstance();
if ((mainPresenter == nullptr) ||
(mainPresenter->GetMainPresenterState() != TjdUiAppMainPresenter::MainPresenterState::RESUME)) {
return;
}
if (!isCovered) {
DoStart();
}
}
void TjdUiWFPageCustom::OnActive(void)
{
static_print_debug("TjdUiWFPageCustom::OnActive");
TjdUiWfBase::OnActive();
TjdUiAppMainPresenter *mainPresenter = TjdUiAppMainPresenter::GetInstance();
if ((mainPresenter == nullptr) ||
(mainPresenter->GetMainPresenterState() != TjdUiAppMainPresenter::MainPresenterState::RESUME)) {
return;
}
DoStart();
}
void TjdUiWFPageCustom::OnInactive()
{
static_print_debug("TjdUiWFPageCustom::OnInactive");
TjdUiWfBase::OnInactive();
DoStop();
}
void TjdUiWFPageCustom::OnCovered(void)
{
TjdUiAppMainPresenter *mainPresenter = TjdUiAppMainPresenter::GetInstance();
if ((mainPresenter == nullptr) ||
(mainPresenter->GetMainPresenterState() != TjdUiAppMainPresenter::MainPresenterState::RESUME)) {
return;
}
DoPause();
}
void TjdUiWFPageCustom::OnUncovered(void)
{
TjdUiAppMainPresenter *mainPresenter = TjdUiAppMainPresenter::GetInstance();
if ((mainPresenter == nullptr) ||
(mainPresenter->GetMainPresenterState() != TjdUiAppMainPresenter::MainPresenterState::RESUME)) {
return;
}
DoStart();
}
void TjdUiWFPageCustom::OnPause(void)
{
printf("TjdUiWFPageCustom::OnPause\n");
DoPause();
}
void TjdUiWFPageCustom::OnResume(void)
{
DoStart();
}
void TjdUiWFPageCustom::DoStop(void)
{
if (video_ != nullptr && !video_->IsStopped()) {
video_->StopPlay();
}
}
void TjdUiWFPageCustom::DoStart(void)
{
if (video_ != nullptr) {
if (video_->IsPaused()) {
video_->ResumePlay();
} else if (!video_->IsPlayed()) {
video_->StartPlay();
}
}
}
void TjdUiWFPageCustom::DoPause(void)
{
if (video_ != nullptr) {
video_->PausePlay();
}
}
} // namespace TJD