241 lines
10 KiB
C++
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
|