#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