/*---------------------------------------------------------------------------- * Copyright (c) TJD Technologies Co., Ltd. 2024. All rights reserved. * * Description: TjdUiAppActivityRecognitionView.cpp * * Author: wuchangxin@ss-tjd.com * * Create: 2025-03-24 *--------------------------------------------------------------------------*/ #include "TjdUiAppActivityRecognitionView.h" #include "TjdUiAppActivityRecognitionPresenter.h" #include "TjdUiAppSportView.h" #include "TjdUiImageIds.h" #include "TjdUiMultiLanguageExt.h" #include "TjdUiScreenManage.h" #include "cmsis_os2.h" #include "common/image_cache_manager.h" #include "graphic_service.h" #include "motor.h" #include "notification_manager.h" #include #define IMAGE_BIN_PATH TJD_IMAGE_PATH "img_activity_recognition.bin" using namespace OHOS; namespace TJD { // clang-format off static inline int16_t HorizontalCenter(int16_t width, int16_t parentWidth) { return (parentWidth - width) / 2; } static inline void InitLabelHorCenter(OHOS::UILabel &label, uint8_t size, int16_t y, int16_t target, const char *text) { label.SetFont(TJD_VECTOR_FONT_FILENAME, size); label.SetText(text); label.SetLineBreakMode(OHOS::UILabel::LINE_BREAK_ADAPT); label.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER); label.SetPosition(HorizontalCenter(label.GetWidth(), target), y); } // clang-format on static void ActivityRecognitionViewTimerFunc(void *arg) { GraphicService::GetInstance()->PostGraphicEvent([]() { OHOS::NotificationManager::GetInstance()->StopNotify(); }); } ActivityRecognitionView::ActivityRecognitionView(uint8_t sportType) { SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); ImageInfo *image = nullptr; std::string tip = ""; if (sportType == static_cast(ACTIVITY_TYPE_RUNNING)) { image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_01_OUTDOOR_RUNNING, IMAGE_BIN_PATH); InitLabelHorCenter(sportName_, 36, 171, 466, "户外跑步"); tip = "检测到您可能在跑步\n是否开启运动?"; sportIcon_.SetViewIndex(ACTIVITY_TYPE_RUNNING); } else { image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_02_OUTDOOR_WALKING, IMAGE_BIN_PATH); InitLabelHorCenter(sportName_, 36, 171, 466, "户外步行"); tip = "检测到您可能在步行\n是否开启运动?"; sportIcon_.SetViewIndex(ACTIVITY_TYPE_WALKING); } InitLabelHorCenter(sportTip_, 36, 228, 466, tip.c_str()); sportIcon_.SetPosition(183, 55, 100, 100); sportIcon_.SetSrc(image); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CANCEL, IMAGE_BIN_PATH); imgCancel_.SetPosition(103, 326); imgCancel_.SetSrc(image); imgCancel_.SetTouchable(true); imgCancel_.SetViewId("Click_Cancel_"); imgCancel_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CONFIRM, IMAGE_BIN_PATH); imgConfirm_.SetPosition(271, 326); imgConfirm_.SetSrc(image); imgConfirm_.SetTouchable(true); imgConfirm_.SetViewId("Start_Sport"); imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); g_ActivityRecognitionViewTimerId = osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL); ShowView(); Add(&sportTip_); Add(&sportIcon_); Add(&sportName_); Add(&imgCancel_); Add(&imgConfirm_); } uint8_t ActivityRecognitionView::GetSportType() { return sportIcon_.GetViewIndex(); } void ActivityRecognitionView::ShowView() { TjdUiScreenManage::SetScreenKeepOnTimeout(30 * 1000); motor_param_t motorParam = {.cycle1_on = 200, .cycle1_off = 100, .cycle1_cnt = 0x1, .duty = 100}; tjd_driver_motor_user_start(&motorParam); osTimerStart(g_ActivityRecognitionViewTimerId, 30 * 1000); } ActivityRecognitionView::~ActivityRecognitionView() { TjdUiScreenManage::ResetScreenKeepOnTimeout(); tjd_driver_motor_user_stop(); osTimerStop(g_ActivityRecognitionViewTimerId); osTimerDelete(g_ActivityRecognitionViewTimerId); RemoveAll(); } MovementEndReminder::MovementEndReminder() { SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); ImageInfo *image = nullptr; InitLabelHorCenter(sportTip_, 36, 194, 466, "您已经30分钟未运动\n是否结束运动?"); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CANCEL, IMAGE_BIN_PATH); imgCancel_.SetPosition(103, 326); imgCancel_.SetSrc(image); imgCancel_.SetTouchable(true); imgCancel_.SetViewId("imgCancel_"); imgCancel_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CONFIRM, IMAGE_BIN_PATH); imgConfirm_.SetPosition(271, 326); imgConfirm_.SetSrc(image); imgConfirm_.SetTouchable(true); imgConfirm_.SetViewId("MovementEndReminderConfirm_"); imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); g_MovementEndReminderTimerId = osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL); ShowView(); Add(&sportTip_); Add(&imgCancel_); Add(&imgConfirm_); } void MovementEndReminder::ShowView() { TjdUiScreenManage::SetScreenKeepOnTimeout(5 * 1000); motor_param_t motorParam = {.cycle1_on = 200, .cycle1_off = 100, .cycle1_cnt = 0x1, .duty = 100}; tjd_driver_motor_user_start(&motorParam); osTimerStart(g_MovementEndReminderTimerId, 5 * 1000); } MovementEndReminder::~MovementEndReminder() { TjdUiScreenManage::ResetScreenKeepOnTimeout(); tjd_driver_motor_user_stop(); osTimerStop(g_MovementEndReminderTimerId); osTimerDelete(g_MovementEndReminderTimerId); RemoveAll(); } MovementForcedEndReminder::MovementForcedEndReminder() { SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); ImageInfo *image = nullptr; InitLabelHorCenter(sportTip_, 32, 136, 466, "检测到您长时间未\n产生运动数据,本次运动\n已自动结束,运动数据已\n保存至运动记录"); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_FINISH, IMAGE_BIN_PATH); imgIcon_.SetPosition(183, 26); imgIcon_.SetSrc(image); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_BJ_SUSPEND, IMAGE_BIN_PATH); imgConfirm_.SetPosition(77, 378); imgConfirm_.SetSrc(image); imgConfirm_.SetTouchable(true); imgConfirm_.SetViewId("MovementForcedEndReminderConfirm_"); imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); g_MovementForcedEndReminderTimerId = osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL); ShowView(); Add(&imgIcon_); Add(&sportTip_); Add(&imgConfirm_); } void MovementForcedEndReminder::ShowView() { TjdUiScreenManage::SetScreenKeepOnTimeout(5 * 1000); motor_param_t motorParam = {.cycle1_on = 1000, .cycle1_off = 1000, .cycle1_cnt = 0x1, .duty = 100}; tjd_driver_motor_user_start(&motorParam); osTimerStart(g_MovementForcedEndReminderTimerId, 5 * 1000); if (OHOS::NativeAbility::GetInstance().GetCurSliceId() == TJD_APP_VIEW_SPORT) { auto sportView = TjdUiAppSportView::GetInstance(); sportView->ShowTargetView(SPORT_END_DATA_VIEW); } } MovementForcedEndReminder::~MovementForcedEndReminder() { TjdUiScreenManage::ResetScreenKeepOnTimeout(); tjd_driver_motor_user_stop(); osTimerStop(g_MovementForcedEndReminderTimerId); osTimerDelete(g_MovementForcedEndReminderTimerId); RemoveAll(); } MovementTimeoutReminder::MovementTimeoutReminder(uint8_t timeStamp) { SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); ImageInfo *image = nullptr; std::string timeStr = std::string("您已运动") + std::to_string(timeStamp) + "h,请及时结束,\n注意休息\n是否立即结束运动?"; InitLabelHorCenter(sportTip_, 34, 173, 466, timeStr.c_str()); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CANCEL, IMAGE_BIN_PATH); imgCancel_.SetPosition(103, 326); imgCancel_.SetSrc(image); imgCancel_.SetTouchable(true); imgCancel_.SetViewId("imgCancel_"); imgCancel_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_CONFIRM, IMAGE_BIN_PATH); imgConfirm_.SetPosition(271, 326); imgConfirm_.SetSrc(image); imgConfirm_.SetTouchable(true); imgConfirm_.SetViewId("MovementTimeoutReminderConfirm_"); imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); g_MovementTimeoutReminderTimerId = osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL); ShowView(); Add(&sportTip_); Add(&imgCancel_); Add(&imgConfirm_); } void MovementTimeoutReminder::ShowView() { TjdUiScreenManage::SetScreenKeepOnTimeout(10 * 1000); motor_param_t motorParam = {.cycle1_on = 1000, .cycle1_off = 1000, .cycle1_cnt = 0x1, .duty = 100}; tjd_driver_motor_user_start(&motorParam); osTimerStart(g_MovementTimeoutReminderTimerId, 10 * 1000); } MovementTimeoutReminder::~MovementTimeoutReminder() { TjdUiScreenManage::ResetScreenKeepOnTimeout(); tjd_driver_motor_user_stop(); osTimerStop(g_MovementTimeoutReminderTimerId); osTimerDelete(g_MovementTimeoutReminderTimerId); RemoveAll(); } MovementTimeoutForcedEndReminder::MovementTimeoutForcedEndReminder(uint8_t timeStamp) { SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); ImageInfo *image = nullptr; std::string timeStr = std::string("您已运动") + std::to_string(timeStamp) + "h,劳逸结合,\n才能形成更好的运动效果\n运动将会在1min后结束"; InitLabelHorCenter(sportTip_, 32, 173, 466, timeStr.c_str()); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_BUTTON, IMAGE_BIN_PATH); imgConfirm_.SetPosition(187, 352); imgConfirm_.SetSrc(image); imgConfirm_.SetTouchable(true); imgConfirm_.SetViewId("MovementTimeoutForcedEndReminderConfirm_"); imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); g_MovementTimeoutForcedEndReminderTimerId = osTimerNew((osTimerFunc_t)ActivityRecognitionViewTimerFunc, osTimerOnce, NULL, NULL); ShowView(); Add(&sportTip_); Add(&imgConfirm_); } void MovementTimeoutForcedEndReminder::ShowView() { TjdUiScreenManage::SetScreenKeepOnTimeout(10 * 1000); motor_param_t motorParam = {.cycle1_on = 1000, .cycle1_off = 1000, .cycle1_cnt = 0x1, .duty = 100}; tjd_driver_motor_user_start(&motorParam); osTimerStart(g_MovementTimeoutForcedEndReminderTimerId, 10 * 1000); } MovementTimeoutForcedEndReminder::~MovementTimeoutForcedEndReminder() { tjd_driver_motor_user_stop(); TjdUiScreenManage::ResetScreenKeepOnTimeout(); osTimerStop(g_MovementTimeoutForcedEndReminderTimerId); osTimerDelete(g_MovementTimeoutForcedEndReminderTimerId); RemoveAll(); } static void CountDownTimerFunc(void *arg) { static uint8_t count = 0; OHOS::UILabel *lbCountDown = static_cast(arg); if (count == 10) { GraphicService::GetInstance()->PostGraphicEvent( []() { OHOS::NotificationManager::GetInstance()->StopNotify(); }); count = 0; } lbCountDown->SetText(std::to_string(std::stoi(lbCountDown->GetText()) - 1).c_str()); count++; } MovementAutoEndView::MovementAutoEndView() { SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION); ImageInfo *image = nullptr; InitLabelHorCenter(sportTip_, 34, 175, 466, "运动将在 s\n后自动结束!"); lbCountDown_.SetFont(TJD_VECTOR_FONT_FILENAME, 52); lbCountDown_.SetText("10"); lbCountDown_.SetLineBreakMode(OHOS::UILabel::LINE_BREAK_ADAPT); lbCountDown_.SetAlign(OHOS::TEXT_ALIGNMENT_CENTER, OHOS::TEXT_ALIGNMENT_CENTER); lbCountDown_.SetPosition(266, 156); image = OHOS::ImageCacheManager::GetInstance().LoadOneInMultiRes(IMG_ACTIVITY_RECOGNITION_BUTTON, IMAGE_BIN_PATH); imgConfirm_.SetPosition(187, 352); imgConfirm_.SetSrc(image); imgConfirm_.SetTouchable(true); imgConfirm_.SetViewId("MovementAutoEndViewConfirm_"); imgConfirm_.SetOnClickListener(TjdUiAppActivityRecognitionPresenter::GetInstance()); g_MovementAutoEndViewTimerId = osTimerNew((osTimerFunc_t)CountDownTimerFunc, osTimerPeriodic, &lbCountDown_, NULL); ShowView(); Add(&sportTip_); Add(&imgConfirm_); Add(&lbCountDown_); } void MovementAutoEndView::ShowView() { lbCountDown_.SetText("10"); TjdUiScreenManage::SetScreenKeepOnTimeout(10 * 1000); motor_param_t motorParam = {.cycle1_on = 1000, .cycle1_off = 1000, .cycle1_cnt = 0x1, .duty = 100}; tjd_driver_motor_user_start(&motorParam); osTimerStart(g_MovementAutoEndViewTimerId, 1000); } MovementAutoEndView::~MovementAutoEndView() { auto sportView = TjdUiAppSportView::GetInstance(); if (sportView != nullptr && TjdUiAppSportView::currentViewIndex_ != SPORT_END_DATA_VIEW) { sportView->ShowTargetView(SPORT_END_DATA_VIEW); } TjdUiScreenManage::ResetScreenKeepOnTimeout(); tjd_driver_motor_user_stop(); osTimerStop(g_MovementAutoEndViewTimerId); osTimerDelete(g_MovementAutoEndViewTimerId); RemoveAll(); } } // namespace TJD