#include "TjdUiAppChargerPresenter.h" #include "NativeAbility.h" #include "TjdUiAppChargerModel.h" #include "TjdUiAppChargerView.h" #include "TjdUiMsgCenter.h" #include "animator/easing_equation.h" #include "broadcast_feature.h" #include "common_pm.h" #include "dock/input_device.h" #include "draw/clip_img.h" #include "graphic_service.h" #include "notification_manager.h" #include "sys_config.h" namespace TJD { static constexpr uint16_t ANIMATOR_TIME = 300; #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 static ChargerTime GetChargerTime() { rtc_time rtcTime = TjdUiAppChargerModel::GetInstance().GetRtcTime(); ChargerTime chargerTime = { .hour = rtcTime.tm_hour, .min = rtcTime.tm_min, .date = rtcTime.tm_mday, .week = rtcTime.tm_wday}; return chargerTime; } /* 判断目前gsensor方向 */ static GsensorDir GetGsensorDir(GsensorData &xyzInfo) { if (xyzInfo.x > 1000) { return GsensorDir::RIGHT; } else if (xyzInfo.x < -1000) { return GsensorDir::LEFT; } else if (xyzInfo.y > 1000) { return GsensorDir::UP; } else if (xyzInfo.y < -1000) { return GsensorDir::DOWN; } return GsensorDir::NONE; } static bool g_isBedside_ = false; static TjdUiAppBedSideClockView *g_bedSideClockView = nullptr; static ChargerMeassageView *g_messageChargerView = nullptr; void ChargerExitAnimatorCallback::Callback(OHOS::UIView *view) { curTime_ += 25; if (g_messageChargerView != nullptr) { g_messageChargerView->SetOpa(OHOS::EasingEquation::LinearEaseNone( direction_ ? OHOS::OPA_TRANSPARENT : OHOS::OPA_OPAQUE, direction_ ? OHOS::OPA_OPAQUE : OHOS::OPA_TRANSPARENT, curTime_, animator_->GetTime())); } if (curTime_ >= animator_->GetTime()) { animator_->Stop(); } } void ChargerExitAnimatorCallback::OnStop(OHOS::UIView &view) { curTime_ = 0; if (direction_ == false) { if (TjdUiAppChargerPresenter::GetInstance() != nullptr) { TjdUiAppChargerPresenter::GetInstance()->ViewExitEvent(false); } } } static TjdUiAppChargerPresenter *g_appChargerPresenter = nullptr; TjdUiAppChargerPresenter::TjdUiAppChargerPresenter() { g_appChargerPresenter = this; SetPeriod(500); } TjdUiAppChargerPresenter::~TjdUiAppChargerPresenter() { g_appChargerPresenter = nullptr; } TjdUiAppChargerPresenter *TjdUiAppChargerPresenter::GetInstance(void) { return g_appChargerPresenter; } static void ScreenStatusNotify(screen_status_t status) { if (g_bedSideClockView == nullptr && g_messageChargerView == nullptr) { return; } TjdUiAppChargerPresenter *presenter = TjdUiAppChargerPresenter::GetInstance(); if (presenter == nullptr) { return; } if (status == screen_status_t::PM_STATUS_OFF) { // presenter->StopTimer(); } else if (status == screen_status_t::PM_STATUS_ON) { // presenter->StartTimer(); } } static void DeleteChargerView() { OHOS::NotificationManager::GetInstance()->SetNotifyPriority(TJD_UI_PRIO_LOWEST); TjdUiCommonOnKeyListener::GetInstance()->ClearOnKeyActListener(KeyModelType::SYS_KEY_TYPE); tjd_driver_common_pm_get_ops()->unregister_screen_on_event(ScreenStatusNotify); delete g_appChargerPresenter; if (g_isBedside_) { OHOS::RootView::GetInstance()->Remove(g_bedSideClockView); delete g_bedSideClockView; g_bedSideClockView = nullptr; } else { OHOS::RootView::GetInstance()->Remove(g_messageChargerView); delete g_messageChargerView; g_messageChargerView = nullptr; } RunPopOutPageCallback(); } static OHOS::UIViewGroup *ShowChargerView() { static_print_debug("TjdUiChargerMsgCenterMessageProc"); g_isBedside_ = TjdUiAppChargerModel::GetInstance().IsShowBedSideClockView(); int8_t power = TjdUiAppChargerModel::GetInstance().GetChargerValue(); /* 注册析构函数 */ OHOS::NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(DeleteChargerView); g_appChargerPresenter = new TjdUiAppChargerPresenter(); TjdUiCommonOnKeyListener::GetInstance()->SetOnKeyActListener(g_appChargerPresenter, KeyModelType::SYS_KEY_TYPE); tjd_driver_common_pm_get_ops()->register_screen_on_event(ScreenStatusNotify); if (g_isBedside_) { if (g_bedSideClockView == nullptr) { ChargerTime time = GetChargerTime(); g_bedSideClockView = new TjdUiAppBedSideClockView(power, time); g_bedSideClockView->SetPosition(0, 0); g_bedSideClockView->SetRotateView(GetGsensorDir(TjdUiAppChargerModel::GetInstance().GetGsensorInfo())); } // g_appChargerPresenter->StartTimer(); return g_bedSideClockView; } else { if (g_messageChargerView == nullptr) { g_messageChargerView = new ChargerMeassageView(power); g_messageChargerView->SetPosition(0, 0); g_messageChargerView->SetTouchable(true); g_messageChargerView->SetDraggable(true); } g_messageChargerView->StartAnimator(true); // g_appChargerPresenter->StartTimer(); return g_messageChargerView; } } void TjdUiChargerMsgCenterMessageProc(const Topic topic, Request *req) { bool show = *(bool *)req->data; if (show) { if (OHOS::NativeAbility::GetInstance().GetCurSliceId() == TJD_APP_BATTERY_SAVER) { return; } OHOS::NotificationManager::GetInstance()->SetNotifyPriority(TjdUiMsgCenterGetPriority(topic)); OHOS::NotificationManager::GetInstance()->ShowNotify(ShowChargerView, static_cast(topic), true); return; } /* 取消充电页面 */ if (g_isBedside_) { GraphicService::GetInstance()->PostGraphicEvent([]() { if (g_bedSideClockView != nullptr && TjdUiAppChargerPresenter::GetInstance() != nullptr) { TjdUiAppChargerPresenter::GetInstance()->ViewExitEvent(false); } }); } else { if (g_messageChargerView != nullptr) { GraphicService::GetInstance()->PostGraphicEvent([]() { g_messageChargerView->SetChargeHide(); g_messageChargerView->StartAnimator(false); }); } } } bool TjdUiAppChargerPresenter::OnKeyAct(OHOS::UIView &view, const OHOS::KeyEvent &event) { if (!TjdUiCommonOnKeyListener::CheckIsExitEvent(event)) { return true; } if (g_isBedside_) { ViewExitEvent(false); } else { g_messageChargerView->SetChargeHide(); g_messageChargerView->StartAnimator(false); } return true; } void TjdUiAppChargerPresenter::ViewExitEvent(bool isSwipe) { OHOS::NotificationManager::GetInstance()->StopNotify(); } void TjdUiAppChargerPresenter::Notify(void) { int8_t battery = TjdUiAppChargerModel::GetInstance().GetChargerValue(); if (g_isBedside_) { GsensorDir dir = GetGsensorDir(TjdUiAppChargerModel::GetInstance().GetGsensorInfo()); if (g_bedSideClockView != nullptr) { g_bedSideClockView->SetValue(battery); g_bedSideClockView->SetRotateView(dir); } } else { if (g_messageChargerView != nullptr) { g_messageChargerView->SetValue(battery); } } } } // namespace TJD