mcu_hi3321_watch/tjd/ui/app/charger/TjdUiAppChargerPresenter.cpp
2025-05-26 20:15:20 +08:00

224 lines
7.6 KiB
C++

#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<uint16_t>(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