mcu_hi3321_watch/tjd/ui/app/screen_event/screenoff/TjdUiScreenOffView.cpp
2025-05-26 20:15:20 +08:00

241 lines
10 KiB
C++

#include "TjdUiScreenOffView.h"
#include "TjdUiImageIds.h"
#include "TjdUiOnKeyListener.h"
#include "TjdUiScreenEvent.h"
#include "common/image_cache_manager.h"
#include "common/key_code.h"
#include "dock/input_device.h"
#include "graphic_service.h"
#include "rtc_api.h"
#include "sql_setting.h"
using namespace OHOS;
namespace TJD {
#define SCREENOFF_IMAGE_BIN_PATH TJD_IMAGE_PATH "img_screenoff.bin"
enum ScreenOffImageInfoIndex
{
SCREENOFF_INFO_NUM0,
SCREENOFF_INFO_NUM1,
SCREENOFF_INFO_NUM2,
SCREENOFF_INFO_NUM3,
SCREENOFF_INFO_NUM4,
SCREENOFF_INFO_NUM5,
SCREENOFF_INFO_NUM6,
SCREENOFF_INFO_NUM7,
SCREENOFF_INFO_NUM8,
SCREENOFF_INFO_NUM9,
SCREENOFF_INFO_NUMB,
SCREENOFF_INFO_HOURHAND,
SCREENOFF_INFO_MINHAND,
SCREENOFF_INFO_SECHAND,
SCREENOFF_INFO_CENTER,
SCREENOFF_INFO_SCREENOFF,
SCREENOFF_INFO_COUNT
};
static RootView::OnKeyActListener *lastListener;
static ImageInfo *g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_COUNT]{nullptr};
static TjdUiScreenOffView *g_screenOffView = nullptr;
static void ScreenoffTimerCallback(void *param)
{
if (++(TjdUiScreenOffView::GetInstance()->timecount_) >= 10) {
TjdUiScreenOffView::GetInstance()->timecount_ = 0;
HideScreenOffClockView();
TjdUiSetScreenState(false);
return;
}
GraphicService::GetInstance()->PostGraphicEvent(std::bind(
[](void *param) { TjdUiScreenOffView::GetInstance()->UpdateTimeView(); }, TjdUiScreenOffView::GetInstance()));
}
TJD::TjdUiScreenOffView::TjdUiScreenOffView()
{
SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
InitImage();
offScreenId = sql_setting_get_off_screen_view_type();
if (offScreenId == 1) {
InitView(DIGITAL_VIEW);
} else {
InitView(ANALOG_VIEW);
}
}
TJD::TjdUiScreenOffView::~TjdUiScreenOffView()
{
timescreenoff_->Stop();
if (timescreenoff_ != nullptr) {
delete (timescreenoff_);
timescreenoff_ = nullptr;
}
RemoveAll();
ImageCacheManager::GetInstance().UnloadAllInMultiRes(SCREENOFF_IMAGE_BIN_PATH);
}
TjdUiScreenOffView *TjdUiScreenOffView::GetInstance(void) { return g_screenOffView; }
bool TJD::TjdUiScreenOffView::OnKeyAct(UIView &view, const KeyEvent &event)
{
if (event.GetState() == OHOS::InputDevice::STATE_RELEASE) {
HideScreenOffClockView();
TjdUiScreenOffEndEvent();
}
return true;
}
void TjdUiScreenOffView::InitImage()
{
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_01, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM1] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_02, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM2] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_03, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM3] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_04, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM4] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_05, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM5] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_06, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM6] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_07, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM7] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_08, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM8] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_09, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM9] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_10, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUMB] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_TIME_NUM_11, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_HOURHAND] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_HOUR_HAND, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_MINHAND] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_MIN_HAND, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_SECHAND] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_SEC_HAND, SCREENOFF_IMAGE_BIN_PATH);
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_CENTER] =
ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_SCREENOFF_CENTRAL_POINT, SCREENOFF_IMAGE_BIN_PATH);
}
void TjdUiScreenOffView::InitView(ScreenOffViewIndex type)
{
struct rtc_time localTime;
tjd_driver_rtc_get_ops()->get_rtc_time(&localTime);
uint8_t hour = localTime.tm_hour;
uint8_t min = localTime.tm_min;
uint8_t sec = localTime.tm_sec;
if (type == DIGITAL_VIEW) {
img_hour_high.SetPosition(85, 187);
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + hour / 10 % 10] != nullptr) {
img_hour_high.SetSrc(
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + hour / 10 % 10]);
}
img_hour_low.SetPosition(151, 187);
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + hour % 10] != nullptr) {
img_hour_low.SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + hour % 10]);
}
img_min_high.SetPosition(253, 187);
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + min / 10 % 10] != nullptr) {
img_min_high.SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + min / 10 % 10]);
}
img_min_low.SetPosition(319, 187);
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + min % 10] != nullptr) {
img_min_low.SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + min % 10]);
}
scroff_colon.SetPosition(217, 187);
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUMB] != nullptr) {
scroff_colon.SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUMB]);
}
this->Add(&img_hour_high);
this->Add(&img_hour_low);
this->Add(&img_min_high);
this->Add(&img_min_low);
this->Add(&scroff_colon);
} else {
sweepClock_.SetPosition(0, 0);
sweepClock_.Resize(HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
sweepClock_.SetViewId("sweepClock_");
sweepClock_.SetStyle(STYLE_BACKGROUND_COLOR, 0xff000000);
sweepClock_.SetStyle(STYLE_BACKGROUND_OPA, 0x00);
sweepClock_.SetWorkMode(UISweepClock::WorkMode::ALWAYS_ON);
Image *min_hand = new Image();
min_hand->SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_MINHAND]);
Image *hour_hand = new Image();
hour_hand->SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_HOURHAND]);
Image *circle_hand = new Image();
circle_hand->SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_CENTER]);
sweepClock_.SetHandImage(UISweepClock::HandType::MINUTE_HAND, *min_hand, {227, 8}, {11, 229});
sweepClock_.SetHandImage(UISweepClock::HandType::HOUR_HAND, *hour_hand, {227, 8}, {11, 229});
sweepClock_.SetHandCircleImage(UISweepClock::HandType::HOUR_HAND, *circle_hand, {223, 223});
sweepClock_.SetTime24Hour(hour, min, sec);
this->Add(&sweepClock_);
}
if (timescreenoff_ == nullptr) {
timescreenoff_ = new OHOS::GraphicTimer(1000, ScreenoffTimerCallback, nullptr, true);
}
timescreenoff_->Start();
}
void TjdUiScreenOffView::UpdateTimeView()
{
struct rtc_time localTime;
tjd_driver_rtc_get_ops()->get_rtc_time(&localTime);
uint8_t hour = localTime.tm_hour;
uint8_t min = localTime.tm_min;
if (offScreenId == 1) {
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + hour / 10 % 10] != nullptr) {
img_hour_high.SetSrc(
g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + hour / 10 % 10]);
}
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + hour % 10] != nullptr) {
img_hour_low.SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + hour % 10]);
}
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + min / 10 % 10] != nullptr) {
img_min_high.SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + min / 10 % 10]);
}
if (g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + min % 10] != nullptr) {
img_min_low.SetSrc(g_pv_screenoffimageInfo[ScreenOffImageInfoIndex::SCREENOFF_INFO_NUM0 + min % 10]);
}
} else {
sweepClock_.IncOneSecond();
}
}
void ShowScreenOffClockView()
{
if (g_screenOffView == nullptr) {
g_screenOffView = new TjdUiScreenOffView();
RootView::GetInstance()->AddSystemView(g_screenOffView);
TJD::TjdUiCommonOnKeyListener::GetInstance()->SetOnKeyActListener(g_screenOffView, KeyModelType::OFF_SCREEN_KEY_TYPE);
TJD::TjdUiCommonOnKeyListener::GetInstance()->SetLongPressActIntercept(true);
g_screenOffView->Invalidate();
}
}
void HideScreenOffClockView()
{
if (g_screenOffView) {
RootView::GetInstance()->RemoveSystemView(g_screenOffView);
delete g_screenOffView;
g_screenOffView = nullptr;
TJD::TjdUiCommonOnKeyListener::GetInstance()->ClearOnKeyActListener(KeyModelType::OFF_SCREEN_KEY_TYPE);
TJD::TjdUiCommonOnKeyListener::GetInstance()->SetLongPressActIntercept(false);
}
}
bool IsShowScreenOffClockView() { return g_screenOffView != nullptr; }
} // namespace TJD