From f22da6178648bb8a76327971f093c04da2db7ffc Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E7=BD=97=E6=AD=A3?= <1732036298@qq.com> Date: Wed, 26 Mar 2025 07:33:49 +0000 Subject: [PATCH] Merge #1709 into sdk650 from refs/changes/1709/head MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 查找手机slice合并提交 * refs/changes/1709/head: (6 commits squashed) - 查找手机slice合并提交 - 计时器slice合并提交 - 日历slice合并提交 - 日程slice合并提交 - 订阅消息Topic文件提交 - 遥控拍照slice合并提交 Signed-off-by: 罗正 <1732036298@qq.com> Merged-by: Caisking <3449750381@qq.com> CR-link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1709 --- .../nativelauncher/include/AppViewIDs.h | 2 +- .../nativeui/calendar/include/CalendarModel.h | 34 + .../calendar/include/CalendarPresenter.h | 42 + .../nativeui/calendar/include/CalendarView.h | 57 ++ .../nativeui/calendar/src/CalendarModel.cpp | 37 + .../calendar/src/CalendarPresenter.cpp | 89 ++ .../nativeui/calendar/src/CalendarView.cpp | 398 +++++++++ .../countdown/include/CountDownModel.h | 157 ++++ .../include/CountDownTimeConfigView.h | 44 + .../include/CountDownTimeNotNullView.h | 41 + .../include/MainCountDownPresenter.h | 65 ++ .../countdown/include/MainCountDownView.h | 80 ++ .../countdown/include/StartCountDownView.h | 67 ++ .../nativeui/countdown/src/CountDownModel.cpp | 738 ++++++++++++++++ .../countdown/src/CountDownTimeConfigView.cpp | 171 ++++ .../src/CountDownTimeNotNullView.cpp | 144 ++++ .../countdown/src/MainCountDownPresenter.cpp | 308 +++++++ .../countdown/src/MainCountDownView.cpp | 435 ++++++++++ .../countdown/src/StartCountDownView.cpp | 302 +++++++ .../findphone/include/FindPhoneModel.h | 30 + .../findphone/include/FindPhonePresenter.h | 45 + .../findphone/include/FindPhoneView.h | 51 ++ .../nativeui/findphone/src/FindPhoneModel.cpp | 56 ++ .../findphone/src/FindPhonePresenter.cpp | 137 +++ .../nativeui/findphone/src/FindPhoneView.cpp | 290 +++++++ .../nativeui/schedule/include/ScheduleData.h | 54 ++ .../schedule/include/ScheduleListAdapter.h | 32 + .../schedule/include/ScheduleListItem.h | 62 ++ .../nativeui/schedule/include/ScheduleModel.h | 56 ++ .../schedule/include/SchedulePresenter.h | 42 + .../nativeui/schedule/include/ScheduleView.h | 129 +++ .../schedule/src/ScheduleListAdapter.cpp | 88 ++ .../schedule/src/ScheduleListItem.cpp | 157 ++++ .../nativeui/schedule/src/ScheduleModel.cpp | 299 +++++++ .../schedule/src/SchedulePresenter.cpp | 159 ++++ .../nativeui/schedule/src/ScheduleView.cpp | 802 ++++++++++++++++++ .../takephotos/include/TakephotosModel.h | 28 + .../takephotos/include/TakephotosPresenter.h | 35 + .../takephotos/include/TakephotosView.h | 96 +++ .../takephotos/src/TakephotosModel.cpp | 180 ++++ .../takephotos/src/TakephotosPresenter.cpp | 136 +++ .../takephotos/src/TakephotosView.cpp | 368 ++++++++ .../broadcast/include/broadcast_feature.h | 58 +- .../broadcast/src/broadcast_implement.c | 55 ++ 44 files changed, 6654 insertions(+), 2 deletions(-) create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarModel.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarPresenter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarModel.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownModel.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeConfigView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeNotNullView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/StartCountDownView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownModel.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeConfigView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeNotNullView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/StartCountDownView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneModel.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhonePresenter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleData.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListAdapter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListItem.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleModel.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/SchedulePresenter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListAdapter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListItem.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleModel.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/SchedulePresenter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleView.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosModel.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosPresenter.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosView.h create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosModel.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosPresenter.cpp create mode 100644 code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosView.cpp diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/AppViewIDs.h b/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/AppViewIDs.h index cf9d61579..96c027d17 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/AppViewIDs.h +++ b/code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/AppViewIDs.h @@ -119,7 +119,7 @@ typedef enum : uint16_t VIEW_DIALING_METHOD, // 拨号方式 VIEW_TEST, // 测试 VIEW_CALCULATOR, // 计算器 - VIEW_SCHEDULE, // schedule + VIEW_SCHEDULE, // 日程 VIEW_SLEEPMODE, // sleep mode VIEW_SET_DESKTOP, // 设置主题 /*屏蔽Slice*/ diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarModel.h new file mode 100644 index 000000000..144c82076 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarModel.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: CalendarModel.h + * Author: + * Create: 2021-10-12 + */ +#ifndef CALENDAR_MODEL_H +#define CALENDAR_MODEL_H + +#include "los_mux.h" +#include "string" +#include "PhoneService.h" +#include "AppViewIDs.h" +#include "components/ui_label_ext.h" +#include"ui_resource_string.h" +#include "message.h" +#include "msg_center.h" +#include "stack" + +namespace OHOS { + + +class CalendarModel { +public: + static CalendarModel *GetInstance(void); + +private: + CalendarModel(); + CalendarModel(const CalendarModel &); + virtual ~CalendarModel(); + +}; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarPresenter.h new file mode 100644 index 000000000..4bb7c0393 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarPresenter.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: CalendarPresenter.h + * Author: + * Create: 2021-10-12 + */ + +#ifndef CALENDAR_PRESENTER_H +#define CALENDAR_PRESENTER_H + +#include "Presenter.h" +#include "ohos_types.h" + +#include "cmsis_os.h" +#include "wearable_log.h" +#include "UiConfig.h" +#include "NativeAbility.h" + +namespace OHOS { +class CalendarView; +class CalendarPresenter : public Presenter, + public UIView::OnClickListener, + public UIView::OnDragListener, + public RootView::OnKeyActListener +{ +public: + CalendarPresenter(); + ~CalendarPresenter() override; + + void OnStart() override; + static CalendarPresenter *GetInstance(void); + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; + bool OnDragEnd(UIView &view, const DragEvent &event) override; + + +private: + +}; +} + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarView.h new file mode 100644 index 000000000..c78bdcf6e --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarView.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: CalculatorView.h + * Author: + * Create: 2021-10-12 + */ + +#ifndef CALENDAR_VIEW_H +#define CALENDAR_VIEW_H + +#include "View.h" + +#include "components/ui_view_group.h" +#include "components/ui_image_animator.h" +#include "components/ui_scroll_view.h" +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_label_button.h" +#include "components/ui_list.h" +#include "components/abstract_adapter.h" +#include "components/ui_image_view.h" +#include "CalendarPresenter.h" + +namespace OHOS { + +class CalendarView : public View +{ +public: + CalendarView(); + ~CalendarView(); + + void OnStart() override; + static CalendarView *GetInstance(); + bool updata_label(int8_t type); + +private: + bool Label_init(); + UIViewGroup *group{nullptr}; + UIView:: OnDragListener* dragListener{nullptr}; + UILabel *mon_label{nullptr}; + UILabel *week_label[7]{nullptr}; + UILabel *day_label[31]{nullptr}; + UIImageView *imageview{nullptr}; + + UIImageAnimatorView *PullUpAnimatorView{nullptr}; // 上拉动画 + + ImageAnimatorInfo PullUpimageAnimatorInfo[70]{0}; + + const ImageInfo** PullUpimageAnimator_imageInfo{nullptr}; + + uint32_t show_y=0; + uint32_t show_m=0; + uint32_t show_d=0; +}; +} + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarModel.cpp new file mode 100644 index 000000000..f06596375 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarModel.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: CalendarModel.cpp + * Author: + * Create: 2021-10-12 + */ +#include "DialingScreenView.h" + +#include "service_id_define.h" +#include "cmsis_os.h" +#include "samgr_lite.h" +#include "calendar/include/CalendarModel.h" + +#ifdef __cplusplus +extern "C" { +#endif + +using namespace OHOS; + +CalendarModel::CalendarModel() +{ +} + +CalendarModel::~CalendarModel() +{ +} + + +CalendarModel *CalendarModel::GetInstance(void) +{ + static CalendarModel callLogModel; + return &callLogModel; +} + +#ifdef __cplusplus +} +#endif diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarPresenter.cpp new file mode 100644 index 000000000..669004b35 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarPresenter.cpp @@ -0,0 +1,89 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: CalendarPresenter.cpp + * Author: + * Create: 2021-10-12 + */ + +#include "calendar/include/CalendarView.h" +#include "calendar/include/CalendarModel.h" +#include "gfx_utils/mem_check.h" +#include "common/key_code.h" +#include "calendar/include/CalendarPresenter.h" +#include "custom_utils.h" +#include "NativeRegisterManager.h" + +namespace OHOS +{ + REGIST_MENU_PRO(VIEW_CALENDAR, CalendarView, CalendarPresenter, + PNG_APPLIST_CALENDAR_IMAGE_BIG, PNG_APPLIST_CALENDAR_IMAGE, PNG_APPLIST_CALENDAR_IMAGE, "日历", STR_CALENDAR); + + static CalendarPresenter *g_pMainView = nullptr; + CalendarPresenter::CalendarPresenter() + { + g_pMainView = this; +#ifdef MEM_CHECK + MemCheck::GetInstance()->EnableLeakCheck(true); +#endif + } + + CalendarPresenter::~CalendarPresenter() + { + g_pMainView = nullptr; +#ifdef MEM_CHECK + MemCheck::GetInstance()->EnableLeakCheck(false); +#endif + } + + CalendarPresenter *CalendarPresenter::GetInstance(void) + { + return g_pMainView; + } + + void CalendarPresenter::OnStart() + { + } + + bool CalendarPresenter::OnClick(UIView &view, const ClickEvent &event) + { + UNUSED(event); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick"); + + return false; + } + + bool CalendarPresenter::OnDragEnd(OHOS::UIView &view, const OHOS::DragEvent &event) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCallingPresenter OnDragEnd"); + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) + { + if (event.GetPreLastPoint().x - event.GetStartPoint().x > 100) + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) + { + // if(event.GetPreLastPoint().y-event.GetStartPoint().y>100) + CalendarView::GetInstance()->updata_label(2); + } + if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM) + { + // if(event.GetPreLastPoint().y-event.GetStartPoint().y>100) + CalendarView::GetInstance()->updata_label(1); + } + return true; + } + + bool CalendarPresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlipayPresenter::OnKeyAct"); + uint16 keyID = event.GetKeyId(); + uint16_t keyState = event.GetState(); + // 如果是power键就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0) + { + uint16_t preSlice = NativeAbility::GetInstance().GetPreSliceId(); + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + return true; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarView.cpp new file mode 100644 index 000000000..8a922b3b7 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarView.cpp @@ -0,0 +1,398 @@ +/* + * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. + * Description: CalendarView.cpp + * Author: + * Create: 2021-10-12 + */ + +#include "calendar/include/CalendarView.h" +#include "calendar/include/CalendarModel.h" +#include "uicomponents/UIComponents.h" + +#include "wearable_log.h" +#include "UiConfig.h" +#include "NativeAbility.h" +#include "ConfigModel.h" +#include "languagecode/LanguageInit.h" +namespace OHOS +{ + + static CalendarView *g_pMainView_CalendarView = nullptr; + + static char *dial_id_str[] = {"7", "8", "9", "C", "%", "4", "5", "6", "÷", "x", "1", "2", "3", "-", "+", "", "0", ".", "=", ""}; + + static constexpr int16_t PULLUP_ANIMATOR_VIEW_X = 213; + static constexpr int16_t PULLUP_ANIMATOR_VIEW_Y = 380; + static constexpr int16_t PULLUP_ANIMATOR_VIEW_W = 40; + static constexpr int16_t PULLUP_ANIMATOR_VIEW_H = 40; + static constexpr int16_t PULLUP_ANIMATOR_VIEW_NUM_FRAMES = 70; + static constexpr int16_t PULLUP_ANIMATOR_VIEW_TIME = 100; + + static constexpr const char *PullUpPaths = "/user/res/weather/PullUp/PullUp_"; + + static constexpr const char *stepPaths = "/user/res/step/"; + + CalendarView::CalendarView() + { + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "::CalendarView::CalendarView "); + g_pMainView_CalendarView = this; + } + + CalendarView::~CalendarView() + { + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "::CalendarView::~CalendarView "); + + g_pMainView_CalendarView = nullptr; + if (group) + { + group->RemoveAll(); + + if (mon_label) + { + delete mon_label; + mon_label = nullptr; + } + + if (imageview) + { + delete imageview; + imageview = nullptr; + } + + for (int i = 0; i < 7; i++) + { + if (week_label[i]) + { + delete week_label[i]; + week_label[i] = nullptr; + } + } + + for (int i = 0; i < 31; i++) + { + if (day_label[i]) + { + delete day_label[i]; + day_label[i] = nullptr; + } + } + + if (PullUpAnimatorView != nullptr) + { + PullUpAnimatorView->Stop(); + delete PullUpAnimatorView; + PullUpAnimatorView = nullptr; + } + + FreeImageInfoArray(PullUpimageAnimator_imageInfo, PullUpPaths, PULLUP_ANIMATOR_VIEW_NUM_FRAMES); + + delete group; + group = nullptr; + } + + g_pMainView_CalendarView = nullptr; + } + + CalendarView *CalendarView::GetInstance() + { + return g_pMainView_CalendarView; + } + static char *week_Z_str[] = {"一", "二", "三", "四", "五", "六", "日"}; + static char *week_E_str[] = {"MON", "THE", "WED", "THU", "FRI", "SAT", "SUN"}; + // static char *day_str[]={"1","2","3","4","5","7","8"}; + + bool CalendarView::updata_label(int8_t type) + { + for (int i = 0; i < 31; i++) + { + day_label[i]->SetVisible(false); + } + imageview->SetVisible(false); + + if (type == 1) + { + show_m--; + if (show_m == 0) + { + show_m = 12; + show_y--; + } + } + else + { + show_m++; + if (show_m == 13) + { + show_m = 1; + show_y++; + } + } + uint8_t mon_max_day = 0; + uint8_t is_run = 0; + if (show_y % 4 == 0 && show_y % 100 != 0 || show_y % 400 == 0) + { + is_run = 1; + } + + if (show_m == 2) + { + mon_max_day = 28 + is_run; + } + else if (show_m == 1 || show_m == 3 || show_m == 5 || show_m == 7 || show_m == 8 || show_m == 10 || show_m == 12) + { + mon_max_day = 31; + } + else + { + mon_max_day = 30; + } + + int y = show_y; + int m = show_m; + int week = 0; + { + if (m == 1 || m == 2) + { + m += 12; + y--; + } + week = (1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7; + } + + char mon[20] = {0}; + sprintf(mon, "%d.%d", show_y, show_m); + mon_label->SetText(mon); + + for (int i = 0; i < mon_max_day; i++) + { + int x = ((i + week) % 7); + int y = ((i + week) / 7); + day_label[i]->SetPosition(58 + 50 * x, 140 + 44 * y); // widget's left position and top position + char day[5]; + sprintf(day, "%d", i + 1); + ; + day_label[i]->SetText(day); + time_t currtime; + time(&currtime); + struct tm *timeinfo; + timeinfo = localtime(&currtime); + int y_ = timeinfo->tm_year + 1900; + int m_ = timeinfo->tm_mon + 1; + int d_ = timeinfo->tm_mday; + if (i + 1 == d_ && show_y == y_ && show_m == m_) + { + imageview->SetPosition(58 + 50 * x, 140 + 44 * y); + imageview->SetVisible(true); + } + day_label[i]->SetVisible(true); + } + RootView::GetInstance()->Invalidate(); + return true; + } + bool CalendarView::Label_init() + { + // Add Label to App + uint8_t mon_max_day = 0; + + uint8_t is_run = 0; + time_t currtime; + time(&currtime); + struct tm *timeinfo; + timeinfo = localtime(&currtime); + int y = timeinfo->tm_year + 1900; + int m = timeinfo->tm_mon + 1; + int d = timeinfo->tm_mday; + int h = timeinfo->tm_hour; + int min = timeinfo->tm_min; + int week = timeinfo->tm_wday; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d,%d,%d,%d", y, m, d, week); + if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) // + { + is_run = 1; + } + + if (m == 2) + { + mon_max_day = 28 + is_run; + } + else if (m == 1 || + m == 3 || + m == 5 || + m == 7 || + m == 8 || + m == 10 || + m == 12) + { + mon_max_day = 31; + } + else + { + mon_max_day = 30; + } + + show_y = y; + show_m = m; + show_d = d; + + if (mon_label == nullptr) + { + mon_label = new UILabel(); + } + mon_label->SetPosition(83, 50); // widget's left position and top position + mon_label->Resize(300, 35); // widget's width and height + mon_label->SetViewId("label1"); // Set style + mon_label->SetStyle(STYLE_TEXT_FONT, 30); + + char mon[20] = {0}; + sprintf(mon, "%d.%d", y, m); + + if (m == 1 || m == 2) + { + m += 12; + y--; + } + week = (1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7; + + mon_label->SetText(mon); + mon_label->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); + mon_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + mon_label->SetRollSpeed(0); + mon_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + + // Add to rootView + group->Add(mon_label); + + for (int i = 0; i < 7; i++) + { + if (week_label[i] == nullptr) + { + week_label[i] = new UILabel(); + } + week_label[i]->SetPosition(58 + 50 * (i), 110); // widget's left position and top position + week_label[i]->Resize(50, 30); // widget's width and height + week_label[i]->SetViewId("label3"); // Set style + week_label[i]->SetStyle(STYLE_TEXT_FONT, 20); + + if (ConfigModel::GetInstance()->GetLanguage() == ZH_CN) + week_label[i]->SetText(week_Z_str[i]); + else + week_label[i]->SetText(week_E_str[i]); + + week_label[i]->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); + week_label[i]->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff)); + week_label[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + week_label[i]->SetRollSpeed(0); + week_label[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 20); + + group->Add(week_label[i]); + week_label[i]->SetVisible(true); + } + // Add Label to App + if (imageview == nullptr) + { + imageview = new UIImageView(); + } + + imageview->SetPosition(58, 140); + imageview->Resize(50, 50); + imageview->SetViewId("image1"); + imageview->SetStyle(STYLE_BACKGROUND_COLOR, 0xffff5a36); + imageview->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + imageview->SetStyle(STYLE_BORDER_RADIUS, 100); + group->Add(imageview); + imageview->SetVisible(false); + + for (int i = 0; i < 31; i++) + { + if (day_label[i] == nullptr) + { + day_label[i] = new UILabel(); + } + + day_label[i]->SetPosition(58, 140); // widget's left position and top position + day_label[i]->Resize(50, 44); // widget's width and height + day_label[i]->SetViewId("label3"); // Set style + day_label[i]->SetStyle(STYLE_TEXT_FONT, 20); + + day_label[i]->SetStyle(STYLE_BORDER_RADIUS, 100); + + day_label[i]->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS); + day_label[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + day_label[i]->SetRollSpeed(0); + day_label[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + + group->Add(day_label[i]); + day_label[i]->SetVisible(false); + } + for (int i = 0; i < mon_max_day; i++) + { + int x = ((i + week) % 7); + int y = ((i + week) / 7); + day_label[i]->SetPosition(58 + 50 * x, 140 + 44 * y); // widget's left position and top position + char day[5]; + sprintf(day, "%d", i + 1); + ; + day_label[i]->SetText(day); + if (i + 1 == d) + { + imageview->SetPosition(58 + 50 * x, 140 + 44 * y); + imageview->SetVisible(true); + } + day_label[i]->SetVisible(true); + } + + PullUpimageAnimator_imageInfo = CreateImageInfoArray(PullUpPaths, PULLUP_ANIMATOR_VIEW_NUM_FRAMES); + if (PullUpAnimatorView == nullptr) + { + PullUpAnimatorView = new UIImageAnimatorView(); + if (PullUpAnimatorView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PullUpAnimatorView new fail"); + return false; + } + for (uint8_t i = 0; i < PULLUP_ANIMATOR_VIEW_NUM_FRAMES; i++) + { + // PullUpimageAnimatorInfo[i].imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(PullUpPathsArray[i]); + // PullUpimageAnimatorInfo[i].imageType = IMG_SRC_IMAGE_INFO; + PullUpimageAnimatorInfo[i].imageInfo = PullUpimageAnimator_imageInfo[i]; + // PullUpPathsArray[i]; + PullUpimageAnimatorInfo[i].imageType = IMG_SRC_IMAGE_INFO; + PullUpimageAnimatorInfo[i].pos.x = PULLUP_ANIMATOR_VIEW_X; + PullUpimageAnimatorInfo[i].pos.y = PULLUP_ANIMATOR_VIEW_Y; + PullUpimageAnimatorInfo[i].width = PULLUP_ANIMATOR_VIEW_W; + PullUpimageAnimatorInfo[i].height = PULLUP_ANIMATOR_VIEW_H; + } + PullUpAnimatorView->SetPosition(PULLUP_ANIMATOR_VIEW_X, PULLUP_ANIMATOR_VIEW_Y, PULLUP_ANIMATOR_VIEW_W, PULLUP_ANIMATOR_VIEW_H); + PullUpAnimatorView->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + PullUpAnimatorView->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + PullUpAnimatorView->SetImageAnimatorSrc(PullUpimageAnimatorInfo, PULLUP_ANIMATOR_VIEW_NUM_FRAMES, PULLUP_ANIMATOR_VIEW_TIME); + PullUpAnimatorView->SetRepeat(true); + PullUpAnimatorView->Start(); + } + group->Add(PullUpAnimatorView); + + return true; + } + + void CalendarView::OnStart() + { + group = new UIViewGroup(); + if (group == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallingView::UIViewGroup::new group error"); + return; + } + group->SetPosition(0, 0); + group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); // 454 : value + group->SetTouchable(true); + group->SetDraggable(true); + group->SetOnDragListener(presenter_); + AddViewToRootContainer(group); + + if (!Label_init()) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallingView::UIViewGroup::new group error"); + return; + } + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownModel.h new file mode 100644 index 000000000..41c1aa3d6 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownModel.h @@ -0,0 +1,157 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-04-07 18:15:53 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-11-21 16:06:32 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h + */ +#ifndef COUNTDOWN_MODEL_H +#define COUNTDOWN_MODEL_H + +#include +#include "source.h" +#include "audio_manager.h" +#include "../../../../../../middleware/services/media/foundation/player/interfaces/kits/player.h" +namespace OHOS +{ + using OHOS::Media::Player; + using OHOS::Media::Source; + using namespace OHOS::Media; + using namespace Audio; + using Audio::AudioManager; + + // 计时器铃声播放监听类 + class CountDownRingPlayerListener : public InterruptListener + { + public: + CountDownRingPlayerListener() {} + ~CountDownRingPlayerListener() {} + + void SetOwner(std::shared_ptr player); + void RestFlag(); + bool IsPaused(); + bool IsDelayed(); + bool IsResumed(); + bool IsBeginStopped(); + bool IsEndStopped(); + void StopCountDownRing(); + void StartCountDownRing(); + void OnInterrupt(int32_t type, int32_t hint) override; + + private: + std::shared_ptr player_{nullptr}; + bool isPaused_{false}; + bool isDelayed_{false}; + bool isResumed_{false}; + bool isBeginStopped_{false}; + bool isEndStopped_{false}; + }; + + /*处理计时器铃声媒体播放事件的类*/ + class CountDownRingPlayerCallbackImpl : public OHOS::Media::PlayerCallback + { + public: + CountDownRingPlayerCallbackImpl() {} + ~CountDownRingPlayerCallbackImpl() {} + /*媒体播放完毕时被调用*/ + void OnPlaybackComplete(); + /*当播放过程中发生错误时,此方法将被调用,提供了错误类型和错误代码以供分析和处理。*/ + void OnError(int32_t errorType, int32_t errorCode); + /*在播放过程中,为处理某些信息而调用该方法,信息类型和额外数据通过参数提供。*/ + void OnInfo(int type, int extra); + /*当跳转操作完成时(例如快进到某个特定位置),该方法被调用*/ + void OnRewindToComplete(); + }; + + class CountDownModel + { + public: + static CountDownModel *GetInstance(); // shared_ptr:当没有引用指向这个实例时会自动释放内存 + + bool CountDownTimerIsEnd(); // 计时器是否结束 + bool GetChanageToStartCountDownView(); + void SetChanageToStartCountDownView(bool val); + bool CountDownViewIsExit(); // 计时器界面是否退出 + void HandCountDownEndOperator(void); + bool GetCountDownTimerIsPause(); + void SetCountDownTimerIsPause(bool val); + + void SetCountDownTime(const std::string &countdowntime); // 设置倒计时时间 + std::string GetCountDownTime(void); // 获取倒计时时间 + std::string GetBackupCountDownTime(void); + void SetRingTime(const std::string &ringtime); // 设置响铃时间 + std::string GetRingTime(void); // 获取响铃时间 + void ParseCountDownTime(const char *countdowntime); + std::string ParseRingTime(const std::string &ringtime); + const char *DisplayCountDownDuration(); + void CountDown_StartTimer(uint32_t interval); + void CountDown_StopTimer(void); + void CountDown_PauseTimer(void); + void CountDown_ResumeTimer(uint32_t interval); + + /*播放器相关函数*/ + int CountDownRingPlayerInit(const char *RingMusicName); + int InitializeAndPlayRingtone(void); + int StartRingtonePlayback(void); + int StopRingtonePlaybackAndReleaseResources(void); + void RequestStartRingtone(void); + void RequestStopRingtone(void); + int ResetRingtonePlayback(void); + + void countdownstart(); + void countdownpause(); + void countdownresume(); + void countdownstop(); + + void SetisRunning(bool val) { + isRunning = val; + } + bool GetisRunning(void) const { + return isRunning; + } + void SetisPaused(bool val) { + isPaused = val; + } + bool GetisPaused(void) const { + return isPaused; + } + uint32_t get_current_time();//获取当前系统时间戳 + public: + static int g_CountDownTimes; + static int totalSeconds; //要到计时总秒数 + static uint32_t startTime; //开始时间戳 + static uint32_t pauseTime; //暂停时间戳 + static uint32_t endTime; //结束时间戳 + + private: + CountDownModel() {} + ~CountDownModel() {} + CountDownModel(const CountDownModel &) = delete; + CountDownModel &operator=(const CountDownModel &) = delete; + + std::string uri; + std::shared_ptr playerCallback{nullptr}; + std::shared_ptr playerCtr{nullptr}; + std::map header; + std::shared_ptr source{nullptr}; + std::shared_ptr playerInterruptListener{nullptr}; + AudioSession sessionId; + AudioInterrupt interrupt; + // const char *RingMusicPath = "/user/music/alarm.mp3"; // 铃声路径 +#ifdef SINGLE_USER_PARTITION + const char *RingMusicPath = "/user/music/ring/alarm.mp3"; // 铃声路径 +#else + const char *RingMusicPath = "/music/ring/alarm.mp3"; // 铃声路径 +#endif + std::string countdownDuration{nullptr}; + std::string RingTime{"00:00:00"}; // 响铃时间 + std::string CountTime{"00:00:00"}; // 倒计时时间 + std::string CountTimeBackup{"00:00:00"}; + bool IsChanageToStartCountDownViewFlag{false};//是否需要切换到开始倒计时界面标志 + bool CountDownTimerIsPauseFlag{false}; + + bool isRunning{false};//记录倒计时是否正在运行 + bool isPaused{false}; //记录倒计时是否暂停 + }; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeConfigView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeConfigView.h new file mode 100644 index 000000000..4850b2b40 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeConfigView.h @@ -0,0 +1,44 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-04-07 18:15:53 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2025-02-21 15:22:25 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownTimeConfigView.h + */ +#ifndef COUNTDOWN_TIME_CONFIG_VIEW_H +#define COUNTDOWN_TIME_CONFIG_VIEW_H + +#include "common/screen.h" +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" +#include "components/ui_label_ext.h" +#include "components/ui_time_picker.h" +#include "components/ui_image_view.h" +#include "components/ui_button.h" +/*倒计时时间配置*/ +namespace OHOS +{ + static constexpr const char *COLONEIMAGESPATH = "/user/res/countdown/COUNTDOWN_COLONE.bin"; // 冒号图片 + static constexpr const char *START_COUNTDOWN_BUTTON_IMAGEPATH = "/user/res/countdown/COUNTDOWM_PAUSE.bin"; // 开始倒计时按钮图片 + static constexpr const char *STARTCOUNTDOWN_BUTTON = "startCountdownButton"; // 开始倒计时按钮视图id + static constexpr const char *COUNTDOWN_TIMECONFIG_VIEW = "CountDownTimeConfigView"; + class CountDownTimeConfigView + { + public: + CountDownTimeConfigView(); + virtual ~CountDownTimeConfigView(); + static CountDownTimeConfigView *GetInstance(void); + UIScrollView *CountDownTimeConfigViewInit(void); + void ClearAll(void); + UITimePicker * GetTimePicker(void); + + private: + UIScrollView *scrollView = nullptr; + UILabelExt *Title = nullptr; + UITimePicker *timePicker = nullptr; + UIImageView *Img[2]{nullptr}; + UIButton *startCountdownButton{nullptr}; + }; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeNotNullView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeNotNullView.h new file mode 100644 index 000000000..c216368e4 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeNotNullView.h @@ -0,0 +1,41 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-04-07 18:15:53 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-04-08 14:52:37 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownTimeNotNullView.h + */ +#ifndef COUNTDOWN_TIME_NOT_NULL_VIEW_H +#define COUNTDOWN_TIME_NOT_NULL_VIEW_H + + +#include "View.h" +#include "components/ui_scroll_view.h" +#include "components/ui_label_ext.h" +#include "components/ui_image_view.h" +#include "components/ui_label_button_ext.h" + +/*倒计时时间不能为0*/ +namespace OHOS +{ + static constexpr const char *COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON = "ReturnButton"; // 点击该按钮后回到倒计时设置界面 + static constexpr const char *COUNTDOWNTIMENOTNULLVIEW = "CountDownTimeNotNullView"; + class CountDownTimeNotNullView + { + + public: + CountDownTimeNotNullView(); + virtual ~CountDownTimeNotNullView(); + static CountDownTimeNotNullView *GetInstance(void); + UIScrollView * CountDownTimeNotNullViewInit(void); + void ClearAll(void); + + private: + UIScrollView *scrollView = nullptr; + UILabelExt *Title = nullptr; + UIImageView *Attention = nullptr; + UILabelExt *AttentionLabel = nullptr; + UILabelButtonExt *button = nullptr; + }; +} // namespace OHOS +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h new file mode 100644 index 000000000..e16f7feef --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h @@ -0,0 +1,65 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-04-07 18:15:53 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-10-19 17:07:09 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownPresenter.h + */ +#ifndef MAIN_COUNTDOWN_PRESENTER_H +#define MAIN_COUNTDOWN_PRESENTER_H + +#include "View.h" +#include "Presenter.h" +#include "MainCountDownView.h" +#include "ui_resource_string.h" +#include "ModelListenerSample.h" +/*倒计时的主界面*/ +namespace OHOS +{ + typedef enum + { + MAIN_COUNTDOWN = 0, // 倒计时主视图 + TIMECONFIG_COUNTDOWN, // 自定义倒计时 + START_COUNTDOWN, // 开始倒计时 + COUNTDOWN_TIMENOTNULL, // 倒计时时间不能为空 + COUNTDOWN_MAX, + } CountDownViewId; + + static constexpr const int COUNTDOWN_TIMER_DURATION = 1000; // 计时器的定时器周期 + class MainCountDownView; + class MainCountDownPresenter : public Presenter, + public UIView::OnClickListener, + public UIView::OnDragListener, + UITimePicker::SelectedListener, + public UICheckBox::OnChangeListener, + public RootView::OnKeyActListener, + public ModelListenerSample + { + public: + MainCountDownPresenter(); + virtual ~MainCountDownPresenter(); + + void OnStart() override; + void OnPause() override; + void OnResume() override; + void OnStop() override; + + static MainCountDownPresenter *GetInstance(); + + private: + // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承; + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnDragEnd(UIView &view, const DragEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 + bool OnChange(UICheckBox::UICheckBoxState state) override; + void OnTimePickerStoped(UITimePicker &picker) override; + void Notify() override; + + std::string countdowntime{0}; + std::string ringtime{0}; + bool X_DRAG_FLAG{false}; + }; +} + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownView.h new file mode 100644 index 000000000..27d9fee0e --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownView.h @@ -0,0 +1,80 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-04-07 18:15:53 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2025-02-24 18:39:35 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h + */ +#ifndef MAIN_COUNTDOWN_VIEW_H +#define MAIN_COUNTDOWN_VIEW_H + + +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_scroll_view.h" +#include "components/ui_label_ext.h" +#include "components/ui_label_button_ext.h" +#include "countdown/include/CountDownTimeConfigView.h" +#include "countdown/include/CountDownTimeNotNullView.h" +#include "countdown/include/StartCountDownView.h" +/*倒计时的主界面*/ +namespace OHOS +{ +#define CountDownImageSrc "/user/res/countdown/" + + // 图片路径 + static const char *COUNTDOWM_TIMER_ICON = CountDownImageSrc "COUNTDOWM_TIMER_ICON.bin"; + + // 视图ID + static constexpr const char *COUNTDOWN_LABELBUTTON_VIEWID = "COUNTDOWN_LABELBUTTON"; // 自定义时间ID + static constexpr const char *COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID = "COUNTDOWN_ONE_MINUTE_BUTTON"; // 1分钟 + static constexpr const char *COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID = "COUNTDOWN_FIVE_MINUTE_BUTTON"; // 5分钟 + static constexpr const char *COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID = "COUNTDOWN_TEN_MINUTE_BUTTON"; // 10分钟 + static constexpr const char *COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID = "COUNTDOWN_THIRTY_MINUTE_BUTTON"; // 30 分钟 + static constexpr const char *MAINCOUNTDOWNVIEW = "MainCountDownView"; +} +namespace OHOS +{ +#define COUNTDOWN_MAX_VIEW 4 + + class MainCountDownPresenter; + class MainCountDownView : public View + { + + public: + MainCountDownView(); + virtual ~MainCountDownView(); + static MainCountDownView *GetInstance(void); + bool ClickFunc(int16_t interface); + bool CheckViewParam(int16_t hideView, int16_t showView); + void ChangeView(int16_t hideView, int16_t showView); + bool ChangeMainCountDown(int16_t thisView); + bool ChangeTimeConfigCountdown(int16_t thisView); + bool ChangeCountdownTimeNotNull(int16_t thisView); + bool ChangeStartCountDown(int16_t thisView); + StartCountDownView *GetStartCountDownView(void); + + public: + void OnStart() override; + + private: + CountDownTimeConfigView *p_CountDownTimeConfigView{nullptr}; + CountDownTimeNotNullView *p_CountDownTimeNotNullView{nullptr}; + StartCountDownView *p_StartCountDownView{nullptr}; + + private: + UIScrollView * MainCountDownViewInit(void); + void ClearAll(void); + UILabelButtonExt *SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text,int textId); + UIScrollView *scrollView[COUNTDOWN_MAX_VIEW]{nullptr}; + UILabelExt *Title{nullptr}; + UILabelExt *QuickStart{nullptr}; + UILabelButtonExt *CUSTOM_COUNTDOWN{nullptr}; // 自定义倒计时 + UILabelButtonExt *COUNTDOWN_ONE_MINUTE_BUTTON = nullptr; + UILabelButtonExt *COUNTDOWN_FIVE_MINUTE_BUTTON = nullptr; + UILabelButtonExt *COUNTDOWN_TEN_MINUTE_BUTTON = nullptr; + UILabelButtonExt *COUNTDOWN_THIRTY_MINUTE_BUTTON = nullptr; + bool viewInitStatus{false}; + }; +} // namespace OHOS +#endif // MainCountDown_PRESENTER_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/StartCountDownView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/StartCountDownView.h new file mode 100644 index 000000000..1c721cbf9 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/StartCountDownView.h @@ -0,0 +1,67 @@ +/*** + * @Date: 2024-08-06 18:11:47 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-27 18:27:41 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/StartCountDownView.h + */ +#ifndef START_COUNTDOWN_VIEW_H +#define START_COUNTDOWN_VIEW_H + + +#include "View.h" + +#include "components/ui_scroll_view.h" +#include "components/ui_label_ext.h" +#include "components/ui_image_view.h" +#include "components/ui_toggle_button.h" +#include "components/ui_button.h" +#include "components/ui_checkbox.h" + +/*开始倒计时*/ +namespace OHOS +{ + static constexpr const char *EndButton_ImagePath = "/user/res/countdown/COUNTDOWM_END.bin"; // 结束返回按钮图片 + static constexpr const char *CountDown_Play_ImagePath = "/user/res/countdown/COUNTDOWM_PLAY.bin"; // 开始倒计时image + static constexpr const char *CountDown_PAUSE_ImagePath = "/user/res/countdown/COUNTDOWM_PAUSE.bin"; // 暂停倒计时image + static constexpr const char *RepeatButtonImagePath = "/user/res/countdown/repeat_button.bin"; + static constexpr const char *VectorImagesPath = "/user/res/countdown/COUNTDOWM_VECTOR.bin"; + static constexpr const char *VectorBigImagesPath = "/user/res/countdown/Vector_Big.bin"; + static constexpr const char *PlayOrPauseToggleButton_ViewID = "PlayOrPauseToggleButton"; // 暂停和开始toggleButton视图id + static constexpr const char *STARTCOUNTDOWNVIEWRETURNBUTTON = "StartCountDownViewReturnButton"; + static constexpr const char *STARTCOUNTDOWNVIEW = "StartCountDownView"; + static constexpr const char *RepeatButtonViewID = "RepeatButtonViewID"; + class StartCountDownView + { + + public: + StartCountDownView(); + virtual ~StartCountDownView(); + static StartCountDownView *GetInstance(void); + UIScrollView *StartCountDownViewInit(void); + void ClearAll(void); + UILabelExt *GetShowCountDownTimelabel(void); // 获取显示倒计时时间标签 + UILabelExt *GetShowTheRingTimelabel(void); // 获取显示响铃时间标签 + UIToggleButton *GetPlayOrPauseToggleButton(void); + UIButton *GetRepeatButton(void); + + void SetEndView(); + void SetImageAndLabel(bool state); + void ShowEndView(bool state); + void UpdateimageAndLabelPosition(void); + private: + UIScrollView *scrollView = nullptr; + UILabelExt *Title = nullptr; + UILabelExt *showCountDownTimelabel = nullptr; + UILabelExt *showTheRingTime = nullptr; + UIImageView *vectorImage = nullptr; + + UILabelExt *showTheEndRingTime = nullptr; + UIImageView *vectorbigImage = nullptr; + + UIToggleButton *play_or_pause_toggleButton = nullptr; + UIButton *endbutton = nullptr; + UIButton *RepeatButton = nullptr; + bool viewInitStatus{false}; + }; +} // namespace OHOS +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownModel.cpp new file mode 100644 index 000000000..f32602644 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownModel.cpp @@ -0,0 +1,738 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-04-07 18:15:53 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-12-18 17:42:19 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp + */ +#include "countdown/include/CountDownModel.h" +#include +#include +#include +#include "wearable_log.h" +#include "countdown/include/MainCountDownView.h" +#include +#include "ConfigModel.h" +#include "ui_resource_string.h" +#include "custom_runtime.h" +#include "uiservice/include/ui_service.h" +#include "AppViewIDs.h" +#include "NativeAbility.h" +#include +#include +#include +namespace OHOS +{ + /* -------------------------------------------------------------------------- */ + // 声明定时器变量 + static osTimerId_t g_timer = nullptr; + int CountDownModel::g_CountDownTimes = {0}; + int CountDownModel::totalSeconds = 0; //总的倒计时时间 + uint32_t CountDownModel::startTime = 0; + uint32_t CountDownModel::pauseTime = 0; + uint32_t CountDownModel::endTime = 0; + static constexpr int32 NUM_TEN = 10; // 主要用于格式化输出,当小时、分钟或秒小于10时,在其前面添加一个’0’以保持常规时间格式,例如“09:05:03”。 + static constexpr int16 NUM_TIME_MIN = 60; + static constexpr int16 NUM_TIME_HOUR = 3600; + static constexpr int32 NUM_TIME_DAY = 86400; + + /* -------------------------------------------------------------------------- */ + // 定义了 GetInstance() 方法来获取 CountDownModel 的实例,确保只有一个全局实例存在。 + CountDownModel *CountDownModel::GetInstance() + { + static CountDownModel instance; + return &instance; + } + + // 函数用于解析"HH:MM:SS"格式的时间字符串,并更新g_CountDownTimes + void CountDownModel::ParseCountDownTime(const char *countdowntime) + { + int hours, minutes, seconds; + + // 使用sscanf从字符串中读取格式化数据 + // "%2d:%2d:%2d"用于检查两个数字,后面跟一个冒号,这样的模式重复两次,从而捕获三个整数 + if (sscanf(countdowntime, "%2d:%2d:%2d", &hours, &minutes, &seconds) == 3) + { + // 解析成功,现在转换为总秒数 + g_CountDownTimes = hours * NUM_TIME_HOUR + minutes * NUM_TIME_MIN + seconds; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_CountDownTimes = %d", g_CountDownTimes); + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::ParseCountDownTime Parsing failure"); + } + } + + std::string CountDownModel::ParseRingTime(const std::string &timeStr) + { + int hours, minutes, seconds; + std::string formattedTime; + // 使用 sscanf 从字符串中读取时间数据 + if (sscanf(timeStr.c_str(), "%2d:%2d:%2d", &hours, &minutes, &seconds) == 3) + { + // 如果小时部分为0,则格式化去掉小时部分 + if (hours == 0) + { + formattedTime = (minutes < NUM_TEN ? "0" : "") + std::to_string(minutes) + ":" + (seconds < NUM_TEN ? "0" : "") + std::to_string(seconds); + } + else + { + // 如果小时部分不为0,保持原有格式 + formattedTime = timeStr; + } + } + else + { + // 解析失败逻辑处理:可以选择记录错误、返回原字符串或其他合适的处理方式 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrimTimeFormat Parsing failure: Invalid format"); + formattedTime = timeStr; // 例子中选择返回原字符串 + } + return formattedTime; + } + + // 设置倒计时时间 + void CountDownModel::SetCountDownTime(const std::string &countdowntime) + { + CountTime = countdowntime; + CountTimeBackup = countdowntime; + ParseCountDownTime(CountTime.c_str()); + } + + // 获取倒计时时间 + std::string CountDownModel::GetCountDownTime(void) + { + return CountTime; + } + + std::string CountDownModel::GetBackupCountDownTime(void) + { + return CountTimeBackup; + } + + // 设置响铃时间 + void CountDownModel::SetRingTime(const std::string &ringtime) + { + RingTime = ParseRingTime(ringtime); + } + + // 获取响铃时间 + std::string CountDownModel::GetRingTime(void) + { + return RingTime; + } + + /* + * @brief 初始化音乐播放器以播放一个指定的铃声文件 + * @param {char*} RingMusicName 铃声文件 + */ + int CountDownModel::CountDownRingPlayerInit(const char *RingMusicName) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDownRingPlayerInit"); + /* ------------------------------- 1.播放文件路径设置 ------------------------------- */ + uri = RingMusicName; + /* -------------------------------- 2.播放器对象创建 ------------------------------- */ + if (playerCtr.get() == nullptr) + { + playerCtr = std::make_shared(); + if (playerCtr.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr new fail"); + return OHOS_FAILURE; + } + } + /* ------------------------------- 3.播放器回调对象创建 ------------------------------ */ + if (playerCallback.get() == nullptr) + { + playerCallback = std::make_shared(); + if (playerCallback.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCallback new fail"); + return OHOS_FAILURE; + } + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] PlayerInit success!"); + return OHOS_SUCCESS; + } + + /* + * @brief 对铃声播放器进行设置并开始播放铃声。 + */ + int CountDownModel::InitializeAndPlayRingtone(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::InitializeAndPlayRingtone"); + /* -------------------------------- 1.检查播放器实例 ------------------------------- */ + int32_t ret; + int32_t state; + if (playerCtr.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr.get() == nullptr"); + return OHOS_FAILURE; + } + playerCtr->GetPlayerState(state); + /* -------------------------------- 2.设置播放器回调 ------------------------------- */ + playerCtr->SetPlayerCallback(playerCallback); + /* -------------------------------- 3.创建并设置音频源 -------------------------------- */ + source = std::make_shared(uri, header); + if (source.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] source.get() == fail"); + return OHOS_FAILURE; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Player url:%s", uri.c_str()); + playerCtr->SetSource(*source); + /* --------------------------------- 4.配置播放器 -------------------------------- */ + playerCtr->SetAudioStreamType(AUDIO_STREAM_NOTIFICATION_SYSTEM); // 设置播放器的音频流类型 + playerCtr->Prepare(); // 准备播放器对象以播放音频。 + /* -------------------------------- 5.请求音频焦点 -------------------------------- */ + AudioManager &amIntance = AudioManager::GetInstance(); + sessionId = amIntance.MakeSessionId(); + if (sessionId == AUDIO_SESSION_ID_NONE) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] sessionId invalid!!"); + return OHOS_FAILURE; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] MakeSessionId = %d", sessionId); + playerInterruptListener = std::make_shared(); // 创建音频中断监听器 + if (playerInterruptListener.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerInterruptListener playerInterruptListener.get() == nullptr"); + return OHOS_FAILURE; + } + playerInterruptListener->SetOwner(playerCtr); + interrupt = {AUDIO_STREAM_NOTIFICATION_SYSTEM, sessionId, playerInterruptListener}; + // 激活音频中断 5s超时 + if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild"); + return OHOS_FAILURE; + } + // playerCtr->SetVolume(50, 50); // 将左声道和右声道音量都设置为50 + playerCtr->SetAudioSessionId(sessionId); + // 播放 + ret = playerCtr->Play(); + if(ret == 0) + { + //如果倒计时铃声播放成功,记录该事件 + uapi_save_runtime_log(RUNTIME_LOG_RING_PLAY_START_COUNTDOWN);//TOOD* + } + playerCtr->EnableSingleLooping(true); // 设置是否循环播放 + return OHOS_SUCCESS; + } + + /* + * @brief 开始铃声的播放 + */ + int CountDownModel::StartRingtonePlayback(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::StartRingtonePlayback"); + if (CountDownRingPlayerInit(RingMusicPath) != OHOS_SUCCESS) + { + // 错误处理,例如记录日志或者返回错误状态码 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDownRingPlayerInit error!!"); + return OHOS_FAILURE; + } + + if (InitializeAndPlayRingtone() != OHOS_SUCCESS) + { + // 错误处理,例如记录日志或者返回错误状态码 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::InitializeAndPlayRingtone error!!"); + return OHOS_FAILURE; + } + return OHOS_SUCCESS; + } + + /* + * @brief 停止播放铃声,重置并释放播放器资源,并去激活之前设置的音频中断。 + */ + int CountDownModel::StopRingtonePlaybackAndReleaseResources(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::StopRingtonePlaybackAndReleaseResources"); + int32_t ret = 0; + int32_t state = 0; + AudioManager &amIntance = AudioManager::GetInstance(); + if (playerCtr.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr.get() == nullptr"); + return OHOS_FAILURE; + } + playerCtr->GetPlayerState(state); + if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PAUSED) + { + ret = playerCtr->Stop(); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to stop the player"); + return OHOS_FAILURE; + } + //如果倒计时铃声停止播放成功,记录该事件 + uapi_save_runtime_log(RUNTIME_LOG_RING_PLAY_STOP_COUNTDOWN);//TOOD* + } + ret = playerCtr->Reset(); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to reset the player"); + return OHOS_FAILURE; + } + ret = playerCtr->Release(); + playerCtr.reset(); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to release the player"); + return OHOS_FAILURE; + } + if (amIntance.DeactivateAudioInterrupt(interrupt) != 0) + { + return OHOS_FAILURE; + } + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret); + return OHOS_SUCCESS; + } + + int CountDownModel::ResetRingtonePlayback(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::ResetRingtonePlayback"); + int32_t ret = 0; + int32_t state = 0; + if (playerCtr.get() == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr is null"); + return OHOS_FAILURE; + } + playerCtr->GetPlayerState(state); + if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PAUSED) + { + ret = playerCtr->Stop(); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to stop the player"); + return OHOS_FAILURE; + } + } + ret = playerCtr->Reset(); + if (ret != 0) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to reset the player"); + return OHOS_FAILURE; + } + return OHOS_SUCCESS; + } + + template + static void PostRingtoneEvent(Func function) + { + GraphicService::GetInstance()->PostGraphicEvent( + std::bind(function, CountDownModel::GetInstance())); + } + + /*触发铃声的开始*/ + void CountDownModel::RequestStartRingtone(void) + { + if (uapi_sleep_mode_flag_get()) + { + return; + } + if (true != ConfigModel::GetInstance()->GetDnotdisturb()) + { + PostRingtoneEvent(&CountDownModel::StartRingtonePlayback); + } + } + + /*触发铃声的停止*/ + void CountDownModel::RequestStopRingtone(void) + { + PostRingtoneEvent(&CountDownModel::StopRingtonePlaybackAndReleaseResources); + } + + // 判断计时器是否结束 + bool CountDownModel::CountDownTimerIsEnd() // 计时器是否结束 + { + if (g_timer == nullptr) + { + return true; + } + return false; + } + // 获取是否需要跳转到开始到计时界面 + bool CountDownModel::GetChanageToStartCountDownView() + { + return IsChanageToStartCountDownViewFlag; + } + + // 设置是否需要跳转到开始到计时界面 + void CountDownModel::SetChanageToStartCountDownView(bool val) + { + IsChanageToStartCountDownViewFlag = val; + } + + bool CountDownModel::CountDownViewIsExit() // 计时器界面是否退出 + { + MainCountDownView *g_CountDownView = MainCountDownView::GetInstance(); + if (g_CountDownView == nullptr) + { + return true; + } + return false; + } + + // 处理倒计时到期时的一些操作 + void CountDownModel::HandCountDownEndOperator(void) + { + StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance(); + if (p_StartCountDownView) + { + CountDown_StopTimer(); // 停止定时器 + uapi_set_screen_on_api(); // 点亮屏幕 + CountDownModel::GetInstance()->RequestStartRingtone(); // 播放铃声 + + StartCountDownView::GetInstance()->GetPlayOrPauseToggleButton()->SetVisible(false); + p_StartCountDownView->GetRepeatButton()->SetVisible(true); + /*倒计时结束 显示大图标 */ + p_StartCountDownView->ShowEndView(true); + } + } + + bool CountDownModel::GetCountDownTimerIsPause() + { + return CountDownTimerIsPauseFlag; + } + void CountDownModel::SetCountDownTimerIsPause(bool val) + { + CountDownTimerIsPauseFlag = val; + } + /* ----------------------------------- 定时器 ---------------------------------- */ + + /* + * @brief 显示计时器(时、分、秒) + */ + const char *CountDownModel::DisplayCountDownDuration() + { + countdownDuration.clear(); // 更正为clear(),更加表明意图,与erase()等价 + std::string hours; + std::string minute; + std::string seconds; + + if (g_CountDownTimes >= NUM_TIME_DAY) + { + g_CountDownTimes = 0; + } + + int hour = g_CountDownTimes / NUM_TIME_HOUR; + int min = (g_CountDownTimes % NUM_TIME_HOUR) / NUM_TIME_MIN; + int sec = (g_CountDownTimes % NUM_TIME_HOUR) % NUM_TIME_MIN; + + hours = (hour < NUM_TEN) ? "0" + std::to_string(hour) : std::to_string(hour); + minute = (min < NUM_TEN) ? "0" + std::to_string(min) : std::to_string(min); + seconds = (sec < NUM_TEN) ? "0" + std::to_string(sec) : std::to_string(sec); + countdownDuration = hours + ":" + minute + ":" + seconds; + + return countdownDuration.c_str(); // 返回 std::string 的 c_str(),但需要注意生命周期 + } + /* + * @brief 在这里添加定时器到期后的处理逻辑 + */ + static void CountDown_TimerCallbackProc(int data) + { + if (CountDownModel::GetInstance()->CountDownViewIsExit()) // 如果已经退出了界面定时器还在跑,就先跳转Slice + { + CountDownModel::GetInstance()->CountDown_StopTimer(); // 停止定时器 + CountDownModel::GetInstance()->SetChanageToStartCountDownView(true); + NativeAbility::GetInstance().EnterSlice(VIEW_MAIN_COUNTDOWN); + } + else + { + StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance(); + if (p_StartCountDownView) + { + CountDownModel::GetInstance()->HandCountDownEndOperator(); + } + } + return; + } + + /* + * @brief 计时器回调函数 + */ + static void CountDown_TimerCallback(int data) + { + + /*拿系统时间实现倒计时功能*/ + bool isRunning = CountDownModel::GetInstance()->GetisRunning(); + bool isPaused = CountDownModel::GetInstance()->GetisPaused(); + + if (isRunning &&!isPaused) + { + uint32_t currentTime = CountDownModel::GetInstance()->get_current_time(); + CountDownModel::g_CountDownTimes = CountDownModel::totalSeconds - (currentTime - CountDownModel::startTime); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间戳:%u,倒计时剩余时间:%d", currentTime ,CountDownModel::g_CountDownTimes); + if (CountDownModel::g_CountDownTimes <= 0 && currentTime == CountDownModel::endTime) { + // 这里可以添加倒计时结束后的操作,比如发出提示音等 + GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data)); + } + } + } + + uint32_t CountDownModel::get_current_time() + { + uint32_t time; + if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp"); + return 0; + } + return time; + } + + void CountDownModel::countdownstart() + { + isRunning = true; + isPaused = false; + CountDownModel::totalSeconds = CountDownModel::g_CountDownTimes; + CountDownModel::startTime = get_current_time(); //获取开始时间戳 + CountDownModel::endTime = CountDownModel::startTime + g_CountDownTimes; //获取结束时间戳 + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,endTime:%u",CountDownModel::startTime,CountDownModel::endTime); + + } + + void CountDownModel::countdownpause() + { + if (isRunning &&!isPaused) { + isPaused = true; + CountDownModel::pauseTime = get_current_time(); + } + } + void CountDownModel::countdownresume() + { + if (isRunning && isPaused) { + isPaused = false; + uint32_t currentTime = get_current_time(); + uint32_t pauseDuration = currentTime - CountDownModel::pauseTime; + CountDownModel::endTime = CountDownModel::endTime + pauseDuration; + CountDownModel::totalSeconds = CountDownModel::totalSeconds + pauseDuration; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,pauseDuration:%u,endTime:%u",CountDownModel::startTime,pauseDuration,CountDownModel::endTime); + } + } + + void CountDownModel::countdownstop() + { + isRunning = false; + isPaused = false; + } + + /* + * @brief 开启定时器函数 + * @param interval 时间间隔,单位ms + */ + void CountDownModel::CountDown_StartTimer(uint32_t interval) + { + /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */ + if (g_timer != nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDown_StartTimer Timer already exists!!"); + return; + } + + countdownstart(); + + /* --------------------------------- 2.创建定时器 -------------------------------- */ + g_timer = osTimerNew((osTimerFunc_t)CountDown_TimerCallback, osTimerPeriodic, nullptr, nullptr); + // 检查定时器创建是否成功 + if (g_timer == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDown_StartTimer Timer create failed!!"); + return; + } + + /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */ + int tick = osMs2Tick(interval); + + /* --------------------------------- 4.启动定时器 -------------------------------- */ + // g_timerStartTimestamp = GetCurrentTimestamp(); // 假设GetCurrentTimestamp()是获取当前时间戳的函数 + osStatus_t ret = osTimerStart(g_timer, tick); + /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 nullptr -------------------- */ + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDown_StartTimer] osTimerDelete failed, ret = %lx!!", ret); + if (g_timer != nullptr) + { + ret = osTimerDelete(g_timer); + } + g_timer = nullptr; + return; + } + return; + } + + /* + * @brief 停止定时器 + */ + void CountDownModel::CountDown_StopTimer(void) + { + // 检查定时器是否存在 + if (g_timer != nullptr) + { + countdownstop(); + + osTimerStop(g_timer); + // 删除定时器并置为 nullptr + osStatus_t ret = osTimerDelete(g_timer); + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScanTimerCallback osTimerDelete failed, ret = %lx!!", ret); + } + g_timer = nullptr; + g_CountDownTimes = 0; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stop timer success!!"); + } + } + /* + * @brief 暂停定时器 + */ + void CountDownModel::CountDown_PauseTimer(void) + { + // 检查定时器是否存在 + if (g_timer != nullptr) + { + countdownpause(); + + // 暂停定时器,但不删除它 + osStatus_t ret = osTimerStop(g_timer); + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_PauseTimer osTimerStop failed, ret = %lx!!", ret); + } + } + } + + /* + * @brief 恢复定时器 + */ + void CountDownModel::CountDown_ResumeTimer(uint32_t interval) + { + // 检查定时器是否存在 + if (g_timer != nullptr) + { + countdownresume(); + + int tick = osMs2Tick(interval); + // 恢复定时器 + osStatus_t ret = osTimerStart(g_timer, tick); + if (ret != osOK) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_ResumeTimer osTimerStart failed, ret = %lx!!", ret); + } + } + } + + /* ----------------------- CountDownRingPlayerListener ---------------------- */ + + void CountDownRingPlayerListener::SetOwner(std::shared_ptr player) + { + player_ = player; + } + + /*重置标志位*/ + void CountDownRingPlayerListener::RestFlag() + { + isPaused_ = false; + isDelayed_ = false; + isResumed_ = false; + isBeginStopped_ = false; + isEndStopped_ = false; + } + + bool CountDownRingPlayerListener::IsPaused() + { + return isPaused_; + } + + bool CountDownRingPlayerListener::IsDelayed() + { + return isDelayed_; + } + + bool CountDownRingPlayerListener::IsResumed() + { + return isResumed_; + } + + bool CountDownRingPlayerListener::IsBeginStopped() + { + return isBeginStopped_; + } + + bool CountDownRingPlayerListener::IsEndStopped() + { + return isEndStopped_; + } + + static void Start(void) + { + CountDownModel::GetInstance()->RequestStartRingtone(); + } + + static void Stop(void) + { + CountDownModel::GetInstance()->RequestStopRingtone(); + } + + /*开始计时器铃声播放*/ + void CountDownRingPlayerListener::StartCountDownRing(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownRingPlayerListener::StartCountDownRing] start"); + GraphicService::GetInstance()->PostGraphicEvent(Start); + } + + /*停止计时器铃声播放*/ + void CountDownRingPlayerListener::StopCountDownRing(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownRingPlayerListener::StopCountDownRing] start"); + GraphicService::GetInstance()->PostGraphicEvent(Stop); + } + + /*响应外部的音频中断事件*/ + void CountDownRingPlayerListener::OnInterrupt(int32_t type, int32_t hint) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnInterrupt go in, type %d, hint %d.", type, hint); + if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_PAUSE) + { + isDelayed_ = true; + } + + if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_STOP) + { + StopCountDownRing(); + } + else if (type == INTERRUPT_TYPE_END && isDelayed_ == true) + { + // 重新开始计时器的铃声播放 + StartCountDownRing(); + isDelayed_ = false; + } + return; + } + + /* --------------------- CountDownRingPlayerCallbackImpl -------------------- */ + void CountDownRingPlayerCallbackImpl::OnPlaybackComplete(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnPlaybackComplete"); + // CountDownModel::GetInstance()->RequestStopRingtone(); + // CountDownModel::GetInstance()->RequestStartRingtone(); + } + + void CountDownRingPlayerCallbackImpl::OnError(int32_t errorType, int32_t errorCode) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnError test, errorType %d, errorCode %d", errorType, errorCode); + // 此处实现代码处理错误事件 + } + + void CountDownRingPlayerCallbackImpl::OnInfo(int type, int extra) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnInfo test, type %d, extra %d.", type, extra); + // 此处实现代码处理普通事件 + } + + void CountDownRingPlayerCallbackImpl::OnRewindToComplete(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnRewindToComplete test"); + // 此处实现代码处理进度控制完成的事件 + } +} diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeConfigView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeConfigView.cpp new file mode 100644 index 000000000..3aa166151 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeConfigView.cpp @@ -0,0 +1,171 @@ +#include "countdown/include/CountDownTimeConfigView.h" +#include "countdown/include/MainCountDownPresenter.h" +#include "countdown/include/CountDownModel.h" +#include "UiConfig.h" +#include "wearable_log.h" +/*倒计时时间配置*/ +namespace OHOS +{ + + static CountDownTimeConfigView *g_pCountDownTimeConfigView{nullptr}; + + CountDownTimeConfigView::CountDownTimeConfigView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::CountDownTimeConfigView"); + g_pCountDownTimeConfigView = this; + } + + CountDownTimeConfigView::~CountDownTimeConfigView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::~CountDownTimeConfigView"); + ClearAll(); + g_pCountDownTimeConfigView = nullptr; + } + + CountDownTimeConfigView *CountDownTimeConfigView::GetInstance() + { + return g_pCountDownTimeConfigView; + } + + void CountDownTimeConfigView::ClearAll() + { + scrollView->RemoveAll(); + + if (Title != nullptr) + { + delete Title; + Title = nullptr; + } + + if (timePicker != nullptr) + { + delete timePicker; + timePicker = nullptr; + } + + for (int i = 0; i < 2; i++) + { + delete Img[i]; + Img[i] = nullptr; + } + + if (startCountdownButton != nullptr) + { + delete startCountdownButton; + startCountdownButton = nullptr; + } + + if (scrollView != nullptr) + { + delete scrollView; + scrollView = nullptr; + } + } + + UIScrollView *CountDownTimeConfigView::CountDownTimeConfigViewInit() + { + if (scrollView == nullptr) + { + scrollView = new UIScrollView(); + if (scrollView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::scrollView is new fail!!"); + return nullptr; + } + scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + UIView::OnDragListener *dragListener = static_cast(MainCountDownPresenter::GetInstance()); + if (dragListener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dragListener is nullptr!!"); + return nullptr; + } + scrollView->SetViewId(COUNTDOWN_TIMECONFIG_VIEW); + scrollView->SetOnDragListener(dragListener); + scrollView->SetHorizontalScrollState(false); + scrollView->SetVerticalScrollState(false); + /* -------------------------------------------------------------------------- */ + Title = new UILabelExt(); + if (Title == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::Title is new fail!!"); + return nullptr; + } + Title->SetPosition(83, 50, 300, 35); + Title->SetStyle(STYLE_TEXT_FONT, 30); + Title->SetStyle(STYLE_LINE_HEIGHT, 35); + Title->SetTextId(STR_COUNT_DOWN); // 倒计时 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + Title->SetRollSpeed(23); + Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* -------------------------------------------------------------------------- */ + timePicker = new UITimePicker(); + if (timePicker == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::timePicker is new fail!!"); + return nullptr; + } + timePicker->SetPosition(74, 121, 320, 180); + timePicker->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + timePicker->SetStyle(STYLE_BORDER_RADIUS, 51); + timePicker->SetItemHeight(60); // 设置时间选择器中每个项目的高度。 + timePicker->EnableSecond(true); // 设置在时间选择器中启用秒。 + timePicker->SetSelected(CountDownModel::GetInstance()->GetCountDownTime().c_str()); // 设置时间选择器中当前选择的时间。 + timePicker->SetTextColor(Color::GetColorFromRGBA(0x80, 0x80, 0x80, 0xff), Color::GetColorFromRGBA(0xff, 0xff, 0xff, 0xff)); + // timePicker->SetTextColor(Color::GetColorFromRGBA(0xcc, 0xcc, 0xcc, 0xff), Color::GetColorFromRGBA(0xff, 0xa8, 0x00, 0xff)); // 设置时间选择器中的文本颜色。 + timePicker->SetLoopState(UITimePicker::PickerType::PICKER_HOUR, true); // 设置是否开启循环 :时 + timePicker->SetLoopState(UITimePicker::PickerType::PICKER_MIN, true); // 设置是否开启循环:分 + timePicker->SetLoopState(UITimePicker::PickerType::PICKER_SEC, true); // 设置是否开启循环:秒 + timePicker->SetHighlightFont(GILROY_BOLD_FONT, 55); // 设置突出显示文本的字体名称和大小。 + timePicker->SetBackgroundFont(DEFAULT_VECTOR_FONT_FILENAME, 50); // 设置背景文本的字体名称和大小。 + UITimePicker::SelectedListener *selectTimeListener = + (UITimePicker::SelectedListener *)OHOS::MainCountDownPresenter::GetInstance(); + timePicker->RegisterSelectedListener(selectTimeListener); + /* -------------------------------------------------------------------------- */ + for (int i = 0; i < 2; i++) + { + // 计算每个图片的x位置,这里第一张图片的x坐标是 175,第二张图片的x坐标是 280 + int xpos = (i == 0) ? 175 : 280; + Img[i] = new UIImageView(); + if (Img[i] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::Img[%d] is new fail!!", i); + return nullptr; + } + + Img[i]->SetPosition(xpos, 200, 18, 79); + Img[i]->SetSrc(COLONEIMAGESPATH); + } + /* -------------------------------------------------------------------------- */ + startCountdownButton = new UIButton(); + if (startCountdownButton == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::startCountdownButton is new fail!!"); + return nullptr; + } + startCountdownButton->SetPosition(183, 321, 100, 100); + startCountdownButton->SetViewId(STARTCOUNTDOWN_BUTTON); + startCountdownButton->SetStyle(STYLE_BORDER_RADIUS, 52); + startCountdownButton->SetImageSrc(START_COUNTDOWN_BUTTON_IMAGEPATH, START_COUNTDOWN_BUTTON_IMAGEPATH); + startCountdownButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED); + startCountdownButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + startCountdownButton->SetStyleForState(STYLE_BORDER_RADIUS, 52, UIButton::PRESSED); + UIView::OnClickListener *start_countdown_button_Click = static_cast(MainCountDownPresenter::GetInstance()); + startCountdownButton->SetOnClickListener(start_countdown_button_Click); + + /* ----------------------------------- Add ---------------------------------- */ + scrollView->Add(Title); + scrollView->Add(timePicker); + scrollView->Add(Img[0]); + scrollView->Add(Img[1]); + scrollView->Add(startCountdownButton); + } + return scrollView; + } + + UITimePicker *CountDownTimeConfigView::GetTimePicker(void) + { + return timePicker; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeNotNullView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeNotNullView.cpp new file mode 100644 index 000000000..679d66a12 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeNotNullView.cpp @@ -0,0 +1,144 @@ +#include "countdown/include/CountDownTimeNotNullView.h" +#include "countdown/include/MainCountDownPresenter.h" +#include "UiConfig.h" +#include "wearable_log.h" +/*倒计时时间不能为0*/ +namespace OHOS +{ + + static CountDownTimeNotNullView *g_pCountDownTimeNotNullView{nullptr}; + + CountDownTimeNotNullView::CountDownTimeNotNullView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::CountDownTimeNotNullView"); + + g_pCountDownTimeNotNullView = this; + } + + CountDownTimeNotNullView::~CountDownTimeNotNullView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::~CountDownTimeNotNullView"); + ClearAll(); + g_pCountDownTimeNotNullView = nullptr; + } + + CountDownTimeNotNullView *CountDownTimeNotNullView::GetInstance() + { + + return g_pCountDownTimeNotNullView; + } + + void CountDownTimeNotNullView::ClearAll() + { + scrollView->RemoveAll(); + if (Title != nullptr) + { + delete Title; + Title = nullptr; + } + if (Attention != nullptr) + { + delete Attention; + Attention = nullptr; + } + if (AttentionLabel != nullptr) + { + delete AttentionLabel; + AttentionLabel = nullptr; + } + if (button != nullptr) + { + delete button; + button = nullptr; + } + if (scrollView != nullptr) + { + delete scrollView; + scrollView = nullptr; + } + } + + UIScrollView *CountDownTimeNotNullView::CountDownTimeNotNullViewInit() + { + if (scrollView == nullptr) + { + scrollView = new UIScrollView(); + scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + scrollView->SetViewId(COUNTDOWNTIMENOTNULLVIEW); + scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + /* -------------------------------------------------------------------------- */ + Title = new UILabelExt(); + if (Title == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Title is new fail!!"); + return nullptr; + } + Title->SetPosition(83, 50, 300, 35); + Title->SetStyle(STYLE_TEXT_FONT, 30); + Title->SetStyle(STYLE_LINE_HEIGHT, 35); + Title->SetTextId(STR_COUNT_DOWN); // 倒计时 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + Title->SetRollSpeed(23); + Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* -------------------------------------------------------------------------- */ + Attention = new UIImageView(); + if (Attention == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Attention is new fail!!"); + return nullptr; + } + Attention->SetPosition(193, 121, 80, 80); + Attention->SetStyle(STYLE_BORDER_RADIUS, 100); + #ifdef FD230 + Attention->SetSrc(PNG_ATTENTION_IMAGE); + #endif + /* -------------------------------------------------------------------------- */ + AttentionLabel = new UILabelExt(); + if (AttentionLabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::AttentionLabel is new fail!!"); + return nullptr; + } + AttentionLabel->SetPosition(53, 253, 360, 35); + AttentionLabel->SetStyle(STYLE_TEXT_FONT, 30); + AttentionLabel->SetStyle(STYLE_LINE_HEIGHT, 35); + AttentionLabel->SetTextId(STR_SET_COUNT_DOWN_NOTE); // 请先设置好倒计时间 + AttentionLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + AttentionLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + AttentionLabel->SetRollSpeed(23); + AttentionLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* -------------------------------------------------------------------------- */ + button = new UILabelButtonExt(); + if (button == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::button is new fail!!"); + return nullptr; + } + button->SetPosition(0, 366, 466, 100); + button->SetViewId(COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON); + #ifdef FD230 + button->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE); + #endif + button->SetTextId(STR_KONW); // 知道了 + button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + button->SetStyle(STYLE_LINE_HEIGHT, 35); + button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED); + UIView::OnClickListener *buttonClick = static_cast(MainCountDownPresenter::GetInstance()); + if (buttonClick == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::buttonClick is new fail!!"); + return nullptr; + } + button->SetOnClickListener(buttonClick); + /* ----------------------------------- Add ---------------------------------- */ + scrollView->Add(Title); + scrollView->Add(Attention); + scrollView->Add(AttentionLabel); + scrollView->Add(button); + } + + return scrollView; + } + +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp new file mode 100644 index 000000000..39be26534 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp @@ -0,0 +1,308 @@ +#include "AppViewIDs.h" +#include "NativeAbility.h" +#include "UiConfig.h" +#include "countdown/include/MainCountDownPresenter.h" +#include "countdown/include/CountDownModel.h" +#include "countdown/include/StartCountDownView.h" +#include "common/key_code.h" +#include "custom_utils.h" +#include "NativeRegisterManager.h" + +namespace OHOS +{ + REGIST_MENU_PRO(VIEW_MAIN_COUNTDOWN, MainCountDownView, MainCountDownPresenter, + PNG_APPLIST_COUNTDOWN_IMAGE_BIG, PNG_APPLIST_COUNTDOWN_IMAGE,PNG_APPLIST_COUNTDOWN_IMAGE, "计时器", STR_TIMER); + + static constexpr const char *OneMinuteTime = "00:01:00"; // 1分钟 + static constexpr const char *FiveMinuteTime = "00:05:00"; // 5分钟 + static constexpr const char *TenMinuteTime = "00:10:00"; // 10分钟 + static constexpr const char *ThirtyMinuteTime = "00:30:00"; // 30分钟 + + // 当前Presenter属性实例化的内存指针 + static MainCountDownPresenter *g_pMainCountDownPresenter = nullptr; + MainCountDownPresenter::MainCountDownPresenter() + { + g_pMainCountDownPresenter = this; + } + + MainCountDownPresenter::~MainCountDownPresenter() + { + g_pMainCountDownPresenter = nullptr; + } + + MainCountDownPresenter *MainCountDownPresenter::GetInstance() + { + + return g_pMainCountDownPresenter; + } + + void MainCountDownPresenter::OnStart() + { + // ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 长亮屏 + } + + void MainCountDownPresenter::OnPause(void) + { + + Presenter::OnPause(); + } + + void MainCountDownPresenter::OnResume(void) + { + + Presenter::OnResume(); + } + + void MainCountDownPresenter::OnStop(void) + { + // ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); // 取消长亮屏 + CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources(); // 清理播放器资源 + } + + bool MainCountDownPresenter::OnDrag(UIView &view, const DragEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnDrag"); + UNUSED(view); + if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动 + { + MainCountDownPresenter::X_DRAG_FLAG = true; + } + return true; + } + + bool MainCountDownPresenter::OnDragEnd(UIView &view, const DragEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnDragEnd"); + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && MainCountDownPresenter::X_DRAG_FLAG) + { + if (strcmp(view.GetViewId(), MAINCOUNTDOWNVIEW) == 0) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + else if (strcmp(view.GetViewId(), COUNTDOWN_TIMECONFIG_VIEW) == 0) + { + MainCountDownView::GetInstance()->ChangeView(TIMECONFIG_COUNTDOWN, MAIN_COUNTDOWN); + } + MainCountDownPresenter::X_DRAG_FLAG = false; + } + return true; + } + + static bool SetCountDownAndChangeView(MainCountDownView *p_MainCountDownView, const std::string &timeValue) + { + CountDownModel *model = CountDownModel::GetInstance(); + model->SetCountDownTime(timeValue); + model->SetRingTime(timeValue); + + // Update label texts if necessary + if (p_MainCountDownView->GetStartCountDownView() != nullptr) + { + p_MainCountDownView->GetStartCountDownView()->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str()); + p_MainCountDownView->GetStartCountDownView()->GetShowTheRingTimelabel()->SetText(CountDownModel::GetInstance()->GetRingTime().c_str()); + p_MainCountDownView->GetStartCountDownView()->GetPlayOrPauseToggleButton()->SetVisible(true); + p_MainCountDownView->GetStartCountDownView()->GetRepeatButton()->SetVisible(false); + } + + p_MainCountDownView->ChangeView(MAIN_COUNTDOWN, START_COUNTDOWN); + return true; + } + + bool MainCountDownPresenter::OnClick(UIView &view, const ClickEvent &event) + { + UNUSED(event); + + MainCountDownView *p_MainCountDownView = MainCountDownView::GetInstance(); + StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance(); + + if (p_MainCountDownView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::GetInstance fail!!"); + return false; + } + + if (strcmp(view.GetViewId(), COUNTDOWN_LABELBUTTON_VIEWID) == 0) + { + p_MainCountDownView->ChangeView(MAIN_COUNTDOWN, TIMECONFIG_COUNTDOWN); + return true; + } + + /*四个快速开始倒计时按钮*/ + if (strcmp(view.GetViewId(), COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID) == 0) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID"); + return SetCountDownAndChangeView(p_MainCountDownView, OneMinuteTime); + } + else if (strcmp(view.GetViewId(), COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID) == 0) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID"); + return SetCountDownAndChangeView(p_MainCountDownView, FiveMinuteTime); + } + else if (strcmp(view.GetViewId(), COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID) == 0) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID"); + return SetCountDownAndChangeView(p_MainCountDownView, TenMinuteTime); + } + else if (strcmp(view.GetViewId(), COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID) == 0) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID"); + return SetCountDownAndChangeView(p_MainCountDownView, ThirtyMinuteTime); + } + + if (strcmp(view.GetViewId(), STARTCOUNTDOWN_BUTTON) == 0) // 在自定义倒计时界面点击开始按钮跳转到开始倒计时界面 + { + UITimePicker *timePicker = CountDownTimeConfigView::GetInstance()->GetTimePicker(); + + std::string timeValue = timePicker->GetSelectValue(); + if (nullptr != timePicker && ("00:00:00" != timeValue)) + { + CountDownModel::GetInstance()->SetCountDownTime(timePicker->GetSelectValue()); // 设置倒计时时间 + CountDownModel::GetInstance()->SetRingTime(timePicker->GetSelectValue()); // 设置响铃时间 + } + + if (strcmp(CountDownModel::GetInstance()->GetCountDownTime().c_str(), "00:00:00") == 0) // 如果自定义时间设置为0 + { + p_MainCountDownView->ChangeView(TIMECONFIG_COUNTDOWN, COUNTDOWN_TIMENOTNULL); + return true; + } + else + { + p_MainCountDownView->ChangeView(TIMECONFIG_COUNTDOWN, START_COUNTDOWN); + if (p_StartCountDownView != nullptr) + { + std::string CountDownTime = CountDownModel::GetInstance()->GetCountDownTime(); + std::string RingTime = CountDownModel::GetInstance()->GetRingTime(); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTime = %s RingTime = %s", CountDownTime.c_str(), RingTime.c_str()); + p_StartCountDownView->GetShowCountDownTimelabel()->SetText(CountDownTime.c_str()); + p_StartCountDownView->GetShowTheRingTimelabel()->SetText(RingTime.c_str()); + p_StartCountDownView->GetPlayOrPauseToggleButton()->SetVisible(true); + p_StartCountDownView->GetRepeatButton()->SetVisible(false); + } + + return true; + } + } + + if (strcmp(view.GetViewId(), COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON) == 0) // 从倒计时不为空视图退到自定义倒计时界面 + { + p_MainCountDownView->ChangeView(COUNTDOWN_TIMENOTNULL, TIMECONFIG_COUNTDOWN); + /*结束视图恢复*/ + if (p_StartCountDownView == nullptr) + return false; + p_StartCountDownView->ShowEndView(false); + return true; + } + + if (strcmp(view.GetViewId(), STARTCOUNTDOWNVIEWRETURNBUTTON) == 0) // 从开始倒计时视图退到倒计时主视图 + { + CountDownModel::GetInstance()->SetCountDownTime("00:00:00"); + CountDownModel::GetInstance()->SetRingTime("00:00:00"); + CountDownModel::GetInstance()->CountDown_StopTimer(); + CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources(); + p_StartCountDownView->GetPlayOrPauseToggleButton()->SetTouchable(true); + p_StartCountDownView->GetPlayOrPauseToggleButton()->SetState(false); + p_MainCountDownView->ChangeView(START_COUNTDOWN, MAIN_COUNTDOWN); + p_StartCountDownView->ShowEndView(false); + + return true; + } + + // repeat button cb + if (0 == strcmp(view.GetViewId(), RepeatButtonViewID)) + { + // close prompt + CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources(); + + /*结束视图恢复*/ + if (p_StartCountDownView == nullptr) + return false; + p_StartCountDownView->ShowEndView(false); + + // set param & change view + CountDownModel *model = CountDownModel::GetInstance(); + const std::string timeValue = model->GetBackupCountDownTime(); + model->SetCountDownTime(timeValue); + model->SetRingTime(timeValue); + + if (nullptr != p_MainCountDownView->GetStartCountDownView()) + { + + p_MainCountDownView->GetStartCountDownView()->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str()); + p_MainCountDownView->GetStartCountDownView()->GetShowTheRingTimelabel()->SetText(CountDownModel::GetInstance()->GetRingTime().c_str()); + + p_MainCountDownView->GetStartCountDownView()->GetPlayOrPauseToggleButton()->SetVisible(true); + p_MainCountDownView->GetStartCountDownView()->GetRepeatButton()->SetVisible(false); + } + + // start timer + CountDownModel::GetInstance()->CountDown_StartTimer(COUNTDOWN_TIMER_DURATION); + + return true; + } + + return true; + } + + // 增加按键事件 + bool MainCountDownPresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnKeyAct"); + uint16_t keyID = event.GetKeyId(); + uint16_t keyState = event.GetState(); + // 如果是power键就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + return true; + } + + bool MainCountDownPresenter::OnChange(UICheckBox::UICheckBoxState state) + { + CountDownModel *p_CountDownModel = CountDownModel::GetInstance(); + StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance(); + if (p_CountDownModel == nullptr || p_StartCountDownView == nullptr) + return false; + + switch (state) + { + case UICheckBox::SELECTED: + p_CountDownModel->SetCountDownTimerIsPause(false); + p_CountDownModel->CountDown_StartTimer(COUNTDOWN_TIMER_DURATION); + p_CountDownModel->CountDown_ResumeTimer(COUNTDOWN_TIMER_DURATION); + /*视图恢复*/ + p_StartCountDownView->SetImageAndLabel(true); + p_StartCountDownView->ShowEndView(false); + break; + case UICheckBox::UNSELECTED: + p_CountDownModel->SetCountDownTimerIsPause(true); + p_CountDownModel->CountDown_PauseTimer(); + /*进行视图隐藏*/ + p_StartCountDownView->SetImageAndLabel(false); + break; + default: + break; + } + return true; + } + + void MainCountDownPresenter::OnTimePickerStoped(UITimePicker &picker) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "picker.GetSelectValue = %s", picker.GetSelectValue()); + CountDownModel::GetInstance()->SetCountDownTime(picker.GetSelectValue()); // 设置倒计时时间 + CountDownModel::GetInstance()->SetRingTime(picker.GetSelectValue()); // 设置响铃时间 + } + void MainCountDownPresenter::Notify() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::Notify"); + if (CountDownModel::GetInstance()->CountDownTimerIsEnd()) // 倒计时timer已经停止直接退出不刷新 + { + return; + } + StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance(); + if (p_StartCountDownView && p_StartCountDownView->GetShowCountDownTimelabel()) + { + // 更新显示 + p_StartCountDownView->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->DisplayCountDownDuration()); + } + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownView.cpp new file mode 100644 index 000000000..42617ac30 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownView.cpp @@ -0,0 +1,435 @@ +#include "countdown/include/MainCountDownView.h" +#include "countdown/include/MainCountDownPresenter.h" +#include "wearable_log.h" +#include "common/image_cache_manager.h" +#include "countdown/include/CountDownModel.h" +/*倒计时的主界面*/ +namespace OHOS +{ +#define VISIBLE_XBAR(visible) + + static MainCountDownView *g_pMainCountDownView{nullptr}; + + MainCountDownView::MainCountDownView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::MainCountDownView"); + g_pMainCountDownView = this; + } + + MainCountDownView::~MainCountDownView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::~MainCountDownView"); + ClearAll(); + g_pMainCountDownView = nullptr; + } + + MainCountDownView *MainCountDownView::GetInstance() + { + return g_pMainCountDownView; + } + + void MainCountDownView::ClearAll() + { + if (scrollView[MAIN_COUNTDOWN] != nullptr) + { + scrollView[MAIN_COUNTDOWN]->RemoveAll(); + if (Title != nullptr) + { + delete Title; + Title = nullptr; + } + if (QuickStart != nullptr) + { + delete QuickStart; + QuickStart = nullptr; + } + ImageCacheManager::GetInstance().UnloadSingleRes(COUNTDOWM_TIMER_ICON); + if (CUSTOM_COUNTDOWN != nullptr) + { + delete CUSTOM_COUNTDOWN; + CUSTOM_COUNTDOWN = nullptr; + } + if (COUNTDOWN_ONE_MINUTE_BUTTON != nullptr) + { + delete COUNTDOWN_ONE_MINUTE_BUTTON; + COUNTDOWN_ONE_MINUTE_BUTTON = nullptr; + } + if (COUNTDOWN_FIVE_MINUTE_BUTTON != nullptr) + { + delete COUNTDOWN_FIVE_MINUTE_BUTTON; + COUNTDOWN_FIVE_MINUTE_BUTTON = nullptr; + } + if (COUNTDOWN_TEN_MINUTE_BUTTON != nullptr) + { + delete COUNTDOWN_TEN_MINUTE_BUTTON; + COUNTDOWN_TEN_MINUTE_BUTTON = nullptr; + } + if (COUNTDOWN_THIRTY_MINUTE_BUTTON != nullptr) + { + delete COUNTDOWN_THIRTY_MINUTE_BUTTON; + COUNTDOWN_THIRTY_MINUTE_BUTTON = nullptr; + } + delete scrollView[MAIN_COUNTDOWN]; + scrollView[MAIN_COUNTDOWN] = nullptr; + } + if (p_CountDownTimeConfigView != nullptr) + { + delete p_CountDownTimeConfigView; + p_CountDownTimeConfigView = nullptr; + } + if (p_CountDownTimeNotNullView != nullptr) + { + delete p_CountDownTimeNotNullView; + p_CountDownTimeNotNullView = nullptr; + } + if (p_StartCountDownView != nullptr) + { + delete p_StartCountDownView; + p_StartCountDownView = nullptr; + } + } + + UIScrollView *MainCountDownView::MainCountDownViewInit() + { + if (scrollView[MAIN_COUNTDOWN] == nullptr) + { + /* ----------------------- scrollView[MAIN_COUNTDOWN] ----------------------- */ + scrollView[MAIN_COUNTDOWN] = new UIScrollView(); + if (scrollView[MAIN_COUNTDOWN] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scrollView[MAIN_COUNTDOWN] is new fail!!"); + return nullptr; + } + scrollView[MAIN_COUNTDOWN]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + scrollView[MAIN_COUNTDOWN]->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + scrollView[MAIN_COUNTDOWN]->SetViewId(MAINCOUNTDOWNVIEW); + UIView::OnDragListener *draglistener = static_cast(MainCountDownPresenter::GetInstance()); + if (draglistener == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "draglistener is nullptr!!"); + return nullptr; + } + scrollView[MAIN_COUNTDOWN]->SetOnDragListener(draglistener); + scrollView[MAIN_COUNTDOWN]->SetReboundSize(50); // 设置回弹大小 + scrollView[MAIN_COUNTDOWN]->SetHorizontalScrollState(false); // 设置横向不可以滚动 + scrollView[MAIN_COUNTDOWN]->SetScrollBlankSize(75); + scrollView[MAIN_COUNTDOWN]->SetThrowDrag(true); + scrollView[MAIN_COUNTDOWN]->SetMaxScrollDistance(1000); + scrollView[MAIN_COUNTDOWN]->SetSwipeACCLevel(200); // 800: compensation distance + scrollView[MAIN_COUNTDOWN]->SetDragACCLevel(5); // 5: drag acceleration + scrollView[MAIN_COUNTDOWN]->SetRotateFactor(2); + scrollView[MAIN_COUNTDOWN]->RequestFocus(); + /* ---------------------------------- Title --------------------------------- */ + Title = new UILabelExt(); + if (Title == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title is new fail!!"); + return nullptr; + } + Title->SetPosition(83, 50, 300, 35); + Title->SetStyle(STYLE_TEXT_FONT, 30); + Title->SetStyle(STYLE_LINE_HEIGHT, 35); + Title->SetTextId(STR_COUNT_DOWN); // 倒计时 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + Title->SetRollSpeed(23); + Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* -------------------------- CUSTOM_COUNTDOWN ------------------------- */ + CUSTOM_COUNTDOWN = new UILabelButtonExt(); + if (CUSTOM_COUNTDOWN == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CUSTOM_COUNTDOWN is new fail!!"); + return nullptr; + } + CUSTOM_COUNTDOWN->SetPosition(43, 130, 380, 100); + CUSTOM_COUNTDOWN->SetViewId(COUNTDOWN_LABELBUTTON_VIEWID); + CUSTOM_COUNTDOWN->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffa800); + CUSTOM_COUNTDOWN->SetStyle(STYLE_BORDER_RADIUS, 100); + CUSTOM_COUNTDOWN->SetTextId(STR_CUSTOM_TIME); // 自定义时间 + CUSTOM_COUNTDOWN->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + CUSTOM_COUNTDOWN->SetStyle(STYLE_LINE_HEIGHT, 35); + CUSTOM_COUNTDOWN->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED); + /* ------------------------------- QuickStart ------------------------------- */ + QuickStart = new UILabelExt(); + if (QuickStart == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QuickStart is new fail!!"); + return nullptr; + } + QuickStart->SetPosition(83, 270, 300, 35); + QuickStart->SetStyle(STYLE_TEXT_FONT, 30); + QuickStart->SetStyle(STYLE_LINE_HEIGHT, 35); + QuickStart->SetTextId(STR_QUICK_START); + QuickStart->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + QuickStart->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + QuickStart->SetRollSpeed(23); + QuickStart->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* ----------------------- COUNTDOWN_ONE_MINUTE_BUTTON ---------------------- */ + COUNTDOWN_ONE_MINUTE_BUTTON = SetUILabelButton(43, 345, 180, 150, COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID, "1分钟", STR_1_MIN); + if (COUNTDOWN_ONE_MINUTE_BUTTON == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_ONE_MINUTE_BUTTON is new fail!!"); + return nullptr; + } + /* ---------------------- COUNTDOWN_FIVE_MINUTE_BUTTON ---------------------- */ + COUNTDOWN_FIVE_MINUTE_BUTTON = SetUILabelButton(243, 345, 180, 150, COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID, "5分钟", STR_5_MIN); + if (COUNTDOWN_FIVE_MINUTE_BUTTON == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_FIVE_MINUTE_BUTTON is new fail!!"); + return nullptr; + } + /* ----------------------- COUNTDOWN_TEN_MINUTE_BUTTON ---------------------- */ + COUNTDOWN_TEN_MINUTE_BUTTON = SetUILabelButton(43, 515, 180, 150, COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID, "10分钟", STR_10_MIN); + if (COUNTDOWN_TEN_MINUTE_BUTTON == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_TEN_MINUTE_BUTTON is new fail!!"); + return nullptr; + } + /* --------------------- COUNTDOWN_THIRTY_MINUTE_BUTTON --------------------- */ + COUNTDOWN_THIRTY_MINUTE_BUTTON = SetUILabelButton(243, 515, 180, 150, COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID, "30分钟", STR_30_MIN); + if (COUNTDOWN_THIRTY_MINUTE_BUTTON == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_THIRTY_MINUTE_BUTTON is new fail!!"); + return nullptr; + } + /* -------------------------------------------------------------------------- */ + UIView::OnClickListener *ButtonOnClick = static_cast(MainCountDownPresenter::GetInstance()); + CUSTOM_COUNTDOWN->SetOnClickListener(ButtonOnClick); + COUNTDOWN_ONE_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick); + COUNTDOWN_FIVE_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick); + COUNTDOWN_TEN_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick); + COUNTDOWN_THIRTY_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick); + /* -------------------------------------------------------------------------- */ + scrollView[MAIN_COUNTDOWN]->Add(Title); + scrollView[MAIN_COUNTDOWN]->Add(CUSTOM_COUNTDOWN); + scrollView[MAIN_COUNTDOWN]->Add(QuickStart); + scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_ONE_MINUTE_BUTTON); + scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_FIVE_MINUTE_BUTTON); + scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_TEN_MINUTE_BUTTON); + scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_THIRTY_MINUTE_BUTTON); + } + return scrollView[MAIN_COUNTDOWN]; + } + + UILabelButtonExt *MainCountDownView::SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text, int textId) + { + UILabelButtonExt *button = new UILabelButtonExt(); + if (button == nullptr) + { + return nullptr; + } + button->SetPosition(x, y, w, h); + button->SetViewId(id); + button->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919); + button->SetStyle(STYLE_BORDER_RADIUS, 50); + button->SetImagePosition(72, 30); + ImageInfo *img = ImageCacheManager::GetInstance().LoadSingleRes(COUNTDOWM_TIMER_ICON); + button->SetImageSrc(img, img); + // button->SetText(text); + button->SetTextId(textId); + button->SetAlign(TEXT_ALIGNMENT_CENTER); + button->SetLabelPosition(0, 61); + button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + button->SetStyle(STYLE_LINE_HEIGHT, 35); + button->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED); + button->SetStyleForState(STYLE_BORDER_RADIUS, 50, UIButton::PRESSED); + return button; + } + + // 获取开始倒计时视图 + StartCountDownView *MainCountDownView::GetStartCountDownView(void) + { + return p_StartCountDownView; + } + + /*1.切换到主倒计时视图*/ + bool MainCountDownView::ChangeMainCountDown(int16_t thisView) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeMainCountDown"); + if (scrollView[thisView] == nullptr) + { + UIScrollView *view = MainCountDownViewInit(); + if (view == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail"); + return false; + } + scrollView[thisView] = view; + AddViewToRootContainer(scrollView[thisView]); + } + return true; + } + + /*2.切换到自定义倒计时界面*/ + bool MainCountDownView::ChangeTimeConfigCountdown(int16_t thisView) + { + if (scrollView[thisView] == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeTimeConfigCountdown"); + p_CountDownTimeConfigView = new CountDownTimeConfigView(); + if (p_CountDownTimeConfigView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView); + return false; + } + UIScrollView *view = p_CountDownTimeConfigView->CountDownTimeConfigViewInit(); + if (view == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail"); + return false; + } + scrollView[thisView] = view; + AddViewToRootContainer(scrollView[thisView]); + } + return true; + } + + /*3.开始倒计时*/ + bool MainCountDownView::ChangeStartCountDown(int16_t thisView) + { + if (scrollView[thisView] == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeCountdownTimeNotNull"); + p_StartCountDownView = new StartCountDownView(); + if (p_StartCountDownView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView); + return false; + } + UIScrollView *view = p_StartCountDownView->StartCountDownViewInit(); + if (view == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail"); + return false; + } + scrollView[thisView] = view; + AddViewToRootContainer(scrollView[thisView]); + } + if (p_StartCountDownView) + { + p_StartCountDownView->UpdateimageAndLabelPosition(); + if(CountDownModel::GetInstance()->GetChanageToStartCountDownView() == true) + { + CountDownModel::GetInstance()->SetChanageToStartCountDownView(false); + CountDownModel::GetInstance()->HandCountDownEndOperator(); + } + } + return true; + } + + /*4.切换到倒计时不能为空界面*/ + bool MainCountDownView::ChangeCountdownTimeNotNull(int16_t thisView) + { + if (scrollView[thisView] == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeCountdownTimeNotNull"); + p_CountDownTimeNotNullView = new CountDownTimeNotNullView(); + if (p_CountDownTimeNotNullView == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView); + return false; + } + UIScrollView *view = p_CountDownTimeNotNullView->CountDownTimeNotNullViewInit(); + if (view == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail"); + return false; + } + scrollView[thisView] = view; + AddViewToRootContainer(scrollView[thisView]); + } + return true; + } + + /* -------------------------------------------------------------------------- */ + // 1.MainCountDownViewMapper:结构体定义了一个将视图ID映射到特定成员函数指针的映射表。 + struct MainCountDownViewMapper + { + const int16_t viewId; + bool (MainCountDownView::*func)(int16_t thisView); + }; + + // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainCountDownView类中的特定成员函数指针进行了绑定。 + static const MainCountDownViewMapper ViewMapper[] = { + {MAIN_COUNTDOWN, &MainCountDownView::ChangeMainCountDown}, + {TIMECONFIG_COUNTDOWN, &MainCountDownView::ChangeTimeConfigCountdown}, + {START_COUNTDOWN, &MainCountDownView::ChangeStartCountDown}, + {COUNTDOWN_TIMENOTNULL, &MainCountDownView::ChangeCountdownTimeNotNull}, + }; + + // 3.根据传入的interface参数执行相应视图ID关联的成员函数。 + bool MainCountDownView::ClickFunc(int16_t interface) + { + int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[0]); + for (int i = 0; i < funcSize; i++) + { + if (interface == ViewMapper[i].viewId) + { + bool jug = (this->*(ViewMapper[i].func))(interface); + if (jug == false) + { + return false; + } + return true; + } + } + return false; + } + + bool MainCountDownView::CheckViewParam(int16_t hideView, int16_t showView) + { + if (showView < 0 || showView >= COUNTDOWN_MAX) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootView::CheckViewParam showView err."); + return false; + } + + if (hideView < 0 || hideView > COUNTDOWN_MAX) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootView::CheckViewParam hideView err."); + return false; + } + + return true; + } + + // 4.切换视图 + void MainCountDownView::ChangeView(int16_t hideView, int16_t showView) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeView %d, %d", hideView, showView); + if (!CheckViewParam(hideView, showView)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::CheckViewParam failed."); + return; + } + if (hideView != COUNTDOWN_MAX) + { + if (scrollView[hideView] == nullptr) + { + return; + } + scrollView[hideView]->SetVisible(false); + } + ClickFunc(showView); + scrollView[showView]->SetVisible(true); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: ChangeView end!!!%d", showView); + Draw(); + } + /* -------------------------------------------------------------------------- */ + + void MainCountDownView::OnStart() + { + /* -------------------------------------------------------------------------- */ + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d,%d",CountDownModel::GetInstance()->CountDownTimerIsEnd(),CountDownModel::GetInstance()->GetChanageToStartCountDownView()); + if (CountDownModel::GetInstance()->CountDownTimerIsEnd() == false || + CountDownModel::GetInstance()->GetChanageToStartCountDownView() == true) + { + ChangeView(COUNTDOWN_MAX, START_COUNTDOWN); // 如果倒计时的timer没有结束或需要跳转到开始倒计时界面,则跳转到开始倒计时界面 + } + else + { + ChangeView(COUNTDOWN_MAX, MAIN_COUNTDOWN); // 如果倒计时的timer已经结束,则跳转到主界面 + } + /* -------------------------------------------------------------------------- */ + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/StartCountDownView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/StartCountDownView.cpp new file mode 100644 index 000000000..af12408a2 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/StartCountDownView.cpp @@ -0,0 +1,302 @@ +#include "countdown/include/StartCountDownView.h" +#include "countdown/include/MainCountDownPresenter.h" +#include "countdown/include/CountDownModel.h" +#include "UiConfig.h" +#include "wearable_log.h" +#include "uicomponents/UIComponents.h" + +/*开始倒计时*/ +namespace OHOS +{ + + static StartCountDownView *g_pStartCountDownView{nullptr}; + + StartCountDownView::StartCountDownView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartCountDownView::StartCountDownView"); + g_pStartCountDownView = this; + } + + StartCountDownView::~StartCountDownView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartCountDownView::~StartCountDownView"); + ClearAll(); + g_pStartCountDownView = nullptr; + } + + StartCountDownView *StartCountDownView::GetInstance() + { + return g_pStartCountDownView; + } + + void StartCountDownView::ClearAll() + { + scrollView->RemoveAll(); + + if (Title != nullptr) + { + delete Title; + Title = nullptr; + } + + if (showCountDownTimelabel != nullptr) + { + delete showCountDownTimelabel; + showCountDownTimelabel = nullptr; + } + + if (vectorImage != nullptr) + { + delete vectorImage; + vectorImage = nullptr; + } + if (showTheRingTime != nullptr) + { + delete showTheRingTime; + showTheRingTime = nullptr; + } + + if (play_or_pause_toggleButton != nullptr) + { + delete play_or_pause_toggleButton; + play_or_pause_toggleButton = nullptr; + } + + if (endbutton != nullptr) + { + delete endbutton; + endbutton = nullptr; + } + + if (nullptr != RepeatButton) + { + delete RepeatButton; + RepeatButton = nullptr; + } + + if (nullptr != showTheEndRingTime) + { + delete showTheEndRingTime; + showTheEndRingTime = nullptr; + } + if (nullptr != vectorbigImage) + { + delete vectorbigImage; + vectorbigImage = nullptr; + } + if (scrollView != nullptr) + { + delete scrollView; + scrollView = nullptr; + } + } + void StartCountDownView::SetEndView() + { + /*最后显示图片*/ + InitImageView(vectorbigImage, 183, 120, 100, 100, "image", VectorBigImagesPath); + + /*显示时间字符串*/ + std::string EndTimeStr = CountDownModel::GetInstance()->GetCountDownTime(); + InitLabel(showTheEndRingTime, 83, 240, 300, 47, "title", EndTimeStr.c_str(), GILROY_BOLD_FONT, 40); + + /*结束前先隐藏*/ + vectorbigImage->SetVisible(false); + showTheEndRingTime->SetVisible(false); + } + UIScrollView *StartCountDownView::StartCountDownViewInit() + { + if (scrollView == nullptr) + { + scrollView = new UIScrollView(); + scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight()); + scrollView->SetViewId(STARTCOUNTDOWNVIEW); + scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + /* -------------------------------------------------------------------------- */ + Title = new UILabelExt(); + if (Title == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Title is is new fail!!"); + return nullptr; + } + Title->SetPosition(83, 50, 300, 35); + Title->SetStyle(STYLE_TEXT_FONT, 30); + Title->SetStyle(STYLE_LINE_HEIGHT, 35); + Title->SetTextId(STR_COUNT_DOWN); // 倒计时 + Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + Title->SetRollSpeed(23); + Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* -------------------------------------------------------------------------- */ + showCountDownTimelabel = new UILabelExt(); + if (showCountDownTimelabel == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showCountDownTimelabel is new fail!!"); + return nullptr; + } + showCountDownTimelabel->SetPosition(33, 138, 400, 94); + showCountDownTimelabel->SetStyle(STYLE_TEXT_FONT, 80); + showCountDownTimelabel->SetStyle(STYLE_LINE_HEIGHT, 94); + if (CountDownModel::GetInstance()->CountDownTimerIsEnd()) // 如果定时器是停的,显示设置的倒计时时间 + showCountDownTimelabel->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str()); + else + showCountDownTimelabel->SetText(CountDownModel::GetInstance()->DisplayCountDownDuration()); + showCountDownTimelabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + showCountDownTimelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + showCountDownTimelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 80); + showCountDownTimelabel->SetRollSpeed(23); + /* -------------------------------------------------------------------------- */ + vectorImage = new UIImageView(); + if (vectorImage == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "vectorImage is new fail!!"); + return nullptr; + } + vectorImage->SetPosition(174, 247, 28, 28); + vectorImage->SetSrc(VectorImagesPath); + /* -------------------------------------------------------------------------- */ + showTheRingTime = new UILabelExt(); + if (showTheRingTime == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showTheRingTime is new fail!!"); + return nullptr; + } + showTheRingTime->SetPosition(209, 241, 81, 41); + showTheRingTime->SetStyle(STYLE_TEXT_FONT, 35); + showTheRingTime->SetStyle(STYLE_LINE_HEIGHT, 41); + showTheRingTime->SetText(CountDownModel::GetInstance()->GetRingTime().c_str()); + showTheRingTime->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT); + showTheRingTime->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff)); + showTheRingTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + showTheRingTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 35); + /* -------------------------------------------------------------------------- */ + play_or_pause_toggleButton = new UIToggleButton(); + if (play_or_pause_toggleButton == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "play_or_pause_toggleButton is new fail!!"); + return nullptr; + } + play_or_pause_toggleButton->SetPosition(248, 321, 100, 100); + play_or_pause_toggleButton->SetViewId(PlayOrPauseToggleButton_ViewID); + play_or_pause_toggleButton->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + play_or_pause_toggleButton->SetStyle(STYLE_BORDER_RADIUS, 100); + if (CountDownModel::GetInstance()->CountDownTimerIsEnd() || CountDownModel::GetInstance()->GetCountDownTimerIsPause()) // 如果定时器是停的 + play_or_pause_toggleButton->SetState(false); + else + play_or_pause_toggleButton->SetState(true); + play_or_pause_toggleButton->SetImages(CountDown_Play_ImagePath, CountDown_PAUSE_ImagePath); + UICheckBox::OnChangeListener *ToggleButtonChange = static_cast(MainCountDownPresenter::GetInstance()); + play_or_pause_toggleButton->SetOnChangeListener(ToggleButtonChange); + play_or_pause_toggleButton->SetVisible(true); + + /* -------------------------------------------------------------------------- */ + endbutton = new UIButton(); + if (endbutton == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "endbutton is new fail!!"); + return nullptr; + } + endbutton->SetPosition(118, 321, 100, 100); + endbutton->SetViewId(STARTCOUNTDOWNVIEWRETURNBUTTON); + endbutton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + endbutton->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + endbutton->SetStyle(STYLE_BORDER_RADIUS, 100); + endbutton->SetImageSrc(EndButton_ImagePath, EndButton_ImagePath); + endbutton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED); + endbutton->SetStyleForState(STYLE_BORDER_RADIUS, 100, UIButton::PRESSED); + UIView::OnClickListener *buttonClick = static_cast(MainCountDownPresenter::GetInstance()); + if (buttonClick == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonClick is new fail!!"); + return nullptr; + } + endbutton->SetOnClickListener(buttonClick); + RepeatButton = new UIButton(); + if (nullptr == RepeatButton) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "endbutton is new fail!!"); + return nullptr; + } + RepeatButton->SetPosition(248, 321, 100, 100); + RepeatButton->SetViewId(RepeatButtonViewID); + RepeatButton->SetStyle(STYLE_BACKGROUND_COLOR, 0x00); + RepeatButton->SetStyle(STYLE_BACKGROUND_OPA, 0x00); + RepeatButton->SetStyle(STYLE_BORDER_RADIUS, 100); + RepeatButton->SetImageSrc(RepeatButtonImagePath, RepeatButtonImagePath); + RepeatButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED); + RepeatButton->SetStyleForState(STYLE_BORDER_RADIUS, 100, UIButton::PRESSED); + UIView::OnClickListener *RepeatButtonClick = static_cast(MainCountDownPresenter::GetInstance()); + RepeatButton->SetOnClickListener(RepeatButtonClick); + RepeatButton->SetVisible(false); + + SetEndView(); + + /* ----------------------------------- Add ---------------------------------- */ + scrollView->Add(Title); + scrollView->Add(showCountDownTimelabel); + scrollView->Add(vectorImage); + scrollView->Add(showTheRingTime); + scrollView->Add(endbutton); + scrollView->Add(play_or_pause_toggleButton); + scrollView->Add(RepeatButton); + scrollView->Add(vectorbigImage); + scrollView->Add(showTheEndRingTime); + } + + return scrollView; + } + + // 获取显示倒计时时间标签 + UILabelExt *StartCountDownView::GetShowCountDownTimelabel(void) + { + return showCountDownTimelabel; + } + + // 获取显示响铃时间标签 + UILabelExt *StartCountDownView::GetShowTheRingTimelabel(void) + { + return showTheRingTime; + } + + UIToggleButton *StartCountDownView::GetPlayOrPauseToggleButton(void) + { + return play_or_pause_toggleButton; + } + + UIButton *StartCountDownView::GetRepeatButton(void) + { + return RepeatButton; + } + + void StartCountDownView::SetImageAndLabel(bool state) + { + if (vectorImage == nullptr || showTheRingTime == nullptr) + return; + + vectorImage->SetVisible(state); + showTheRingTime->SetVisible(state); + } + /*结束状态更新*/ + void StartCountDownView::ShowEndView(bool state) + { + if (vectorImage == nullptr || showTheRingTime == nullptr || showCountDownTimelabel == nullptr) + return; + + vectorImage->SetVisible(!state); + showTheRingTime->SetVisible(!state); + showCountDownTimelabel->SetVisible(!state); + + vectorbigImage->SetVisible(state); + showTheEndRingTime->SetVisible(state); + showTheEndRingTime->SetText(showTheRingTime->GetText()); + } + void StartCountDownView::UpdateimageAndLabelPosition(void) + { + if (vectorImage == nullptr || showTheRingTime == nullptr) + return; + int w = vectorImage->GetWidth() + showTheRingTime->GetTextWidth() + 7; + vectorImage->SetX((Screen::GetInstance().GetWidth() - w) / 2); + showTheRingTime->SetX(vectorImage->GetX() + vectorImage->GetWidth() + 7); + vectorImage->Invalidate(); + showTheRingTime->Invalidate(); + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneModel.h new file mode 100644 index 000000000..92cffcc85 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneModel.h @@ -0,0 +1,30 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-03-27 15:21:17 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-10-12 17:22:50 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/include/FindPhoneModel.h + */ +#ifndef FINDPHONE_MODEL_H +#define FINDPHONE_MODEL_H +#include "cstdint" + +namespace OHOS +{ + class FindPhoneModel + { + public: + static FindPhoneModel &GetInstance(); + void SetBlueToothConnectedState(bool state); + bool GetBlueToothConnectedState(); + void start_or_stop_find_phone(uint8_t val); + private: + FindPhoneModel() {} + ~FindPhoneModel() {} + FindPhoneModel(const FindPhoneModel &) = delete; + const FindPhoneModel &operator=(const FindPhoneModel &) = delete; + + bool isBlueToothConnected{false}; // 蓝牙是否连接 + }; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhonePresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhonePresenter.h new file mode 100644 index 000000000..8983da0ca --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhonePresenter.h @@ -0,0 +1,45 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-03-27 10:47:24 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2025-02-25 17:43:12 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/include/FindPhonePresenter.h + */ + +#ifndef FIND_PHONE_PRESENTER_H +#define FIND_PHONE_PRESENTER_H + +#include "Presenter.h" +#include "View.h" + +namespace OHOS +{ + static constexpr const uint8_t FINDPHONE_START = 1; // 开始查找手机 + static constexpr const uint8_t FINDPHONE_STOP = 0; // 停止查找手机 + static constexpr char *FINDPHONE_LABELBUTTON = "FindPhoneLabelButton"; + class FindPhoneView; + class FindPhonePresenter : public Presenter, + public UIView::OnClickListener, + public RootView::OnKeyActListener, + public UIView::OnDragListener + { + public: + FindPhonePresenter(); + virtual ~FindPhonePresenter(); + + void OnStart() override; + void OnPause() override; + void OnResume() override; + void OnStop() override; + + static FindPhonePresenter *GetInstance(); + + private: + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnDragEnd(UIView &view, const DragEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 + bool X_DRAG_FLAG{false}; + }; +} +#endif diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneView.h new file mode 100644 index 000000000..7cc5d1339 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneView.h @@ -0,0 +1,51 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-08-31 09:52:34 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2025-02-24 18:39:46 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/include/FindPhoneView.h + */ +#ifndef FIND_PHONE_VIEW_H +#define FIND_PHONE_VIEW_H + +#include "View.h" +#include "components/ui_view_group.h" +#include "components/ui_label_ext.h" +#include "ui_resource_string.h" +#include "components/ui_image_animator.h" +#include "components/ui_label_button_ext.h" +#include "components/ui_image_view.h" +namespace OHOS +{ + static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_X = 173; + static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_Y = 140; + static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_W = 120; + static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_H = 120; + static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_TIMEOFUPDATE = 100; + static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES = 50; // 图片帧数 + + class FindPhonePresenter; + class FindPhoneView : public View + { + public: + FindPhoneView(); + virtual ~FindPhoneView(); + static FindPhoneView *GetInstance(void); + + void OnStart() override; + + private: + void FindPhoneViewInit_BlueToothConnected(void); + void FindPhoneViewInit_BlueToothDisConnected(void); + void ClearAll(); + UIViewGroup *FindPhoneGroupView = nullptr; + UILabelExt *FindPhoneTitleLabel = nullptr; + UILabelExt *FindPhoneLabel = nullptr; + UIImageAnimatorView *FindPhoneImageAnimator = nullptr; + UILabelButtonExt *FindPhoneLabelButton = nullptr; + UIImageView *FindPhoneImageView{nullptr}; + const ImageInfo **FindPhonePathsArray{nullptr}; + ImageAnimatorInfo FindPhoneImageInfo[FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES]; + }; +} // namespace OHOS +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp new file mode 100644 index 000000000..793eb46c4 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp @@ -0,0 +1,56 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-03-27 15:21:30 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-10-12 17:18:27 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/src/FindPhoneModel.cpp + */ + +#include "findphone/include/FindPhoneModel.h" +#include +#include "wearable_log.h" + +#ifdef SUPPORT_BLE_SERVICE +#include "bleEvent.h" +#include "bletest.h" +#endif + +namespace OHOS +{ + FindPhoneModel &FindPhoneModel::GetInstance() + { + static FindPhoneModel instance; + return instance; + } + + /*设置蓝牙是否已连接*/ + void FindPhoneModel::SetBlueToothConnectedState(bool state) + { + isBlueToothConnected = state; + } + + /*获取与手机蓝牙是否已连接*/ + bool FindPhoneModel::GetBlueToothConnectedState() + { + // return ble_is_ready() && ble_is_connect_ready(); + uint8_t ret = uapi_dev_runtime_get_ble_connect_stat(); + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ble phone connect stat = %d", ret); + if (ret == 1) + return true; + else + return false; + } + + // 开始或停止查找手机 + void FindPhoneModel::start_or_stop_find_phone(uint8_t val) + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "start_or_stop_find_phone %d", val); + // 发送指令停止震动 + if (FindPhoneModel::GetInstance().GetBlueToothConnectedState()) + { + #ifdef SUPPORT_BLE_SERVICE + senfindphoneSend(val); + #endif + } + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp new file mode 100644 index 000000000..75a850edb --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp @@ -0,0 +1,137 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-03-27 10:47:40 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2025-02-25 17:43:45 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/src/FindPhonePresenter.cpp + */ +#include "AppViewIDs.h" +#include "UiConfig.h" +#include "components/ui_label_ext.h" +#include "ui_resource_string.h" +#include "NativeAbility.h" +#include "findphone/include/FindPhonePresenter.h" +#include "findphone/include/FindPhoneModel.h" +#include "findphone/include/FindPhoneView.h" +#include "gfx_utils/mem_check.h" +#include "bluetooth/include/BluetoothModel.h" +#include "custom_utils.h" +#include "common/key_code.h" +#include "NativeRegisterManager.h" + +#ifdef SUPPORT_BLE_SERVICE +#include "bleEvent.h" +#endif + +namespace OHOS +{ + REGIST_MENU_PRO(VIEW_FIND_PHONE, FindPhoneView, FindPhonePresenter, PNG_APPLIST_FINDPHONE_IMAGE_BIG, + PNG_APPLIST_FINDPHONE_IMAGE, PNG_APPLIST_FINDPHONE_IMAGE, "查找手机", STR_FIND_PHONE); + + // 当前Presenter属性实例化的内存指针 + static FindPhonePresenter *g_pFindPhonePresenter = nullptr; + + FindPhonePresenter::FindPhonePresenter() + { + g_pFindPhonePresenter = this; +#ifdef MEM_CHECK + MemCheck::GetInstance()->EnableLeakCheck(true); +#endif + } + + FindPhonePresenter::~FindPhonePresenter() + { + g_pFindPhonePresenter = nullptr; +#ifdef MEM_CHECK + MemCheck::GetInstance()->EnableLeakCheck(false); +#endif + } + + FindPhonePresenter *FindPhonePresenter::GetInstance() + { + return g_pFindPhonePresenter; + } + + void FindPhonePresenter::OnStart() + { +#ifdef SUPPORT_BLE_SERVICE + if (FindPhoneModel::GetInstance().GetBlueToothConnectedState() && + uapi_a2dp_snk_get_device_connect_state()) // 判断与手机蓝牙是否连接和判断a2dp是否是已连接状态 + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnStart a2dp is connected"); + uapi_a2dp_snk_disconnect(); // 先断开a2dp + } +#endif + } + + void FindPhonePresenter::OnPause(void) + { + Presenter::OnPause(); + } + + void FindPhonePresenter::OnResume(void) + { + Presenter::OnResume(); + } + + void FindPhonePresenter::OnStop(void) + { +#ifdef SUPPORT_BLE_SERVICE + FindPhoneModel::GetInstance().start_or_stop_find_phone(FINDPHONE_STOP); // 发送指令停止震动 + if (FindPhoneModel::GetInstance().GetBlueToothConnectedState() && + !uapi_a2dp_snk_get_device_connect_state()) // 判断与手机蓝牙是否连接和判断a2dp是为连接状态 + { + WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnStop a2dp is not connected"); + uapi_a2dp_snk_connect(); // 主动连接a2dp + } +#endif + } + + bool FindPhonePresenter::OnClick(UIView &view, const ClickEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnClick"); + UNUSED(event); + if (strcmp(view.GetViewId(), FINDPHONE_LABELBUTTON) == 0) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + return true; + } + + bool FindPhonePresenter::OnDrag(UIView &view, const DragEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnDrag"); + UNUSED(view); + if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动 + { + FindPhonePresenter::X_DRAG_FLAG = true; + } + return true; + } + + bool FindPhonePresenter::OnDragEnd(UIView &view, const DragEvent &event) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnDragEnd"); + UNUSED(event); + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && FindPhonePresenter::X_DRAG_FLAG) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + FindPhonePresenter::X_DRAG_FLAG = false; + } + return true; + } + + bool FindPhonePresenter::OnKeyAct(UIView &view, const KeyEvent &event) // 增加按键事件 + { + UNUSED(view); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnKeyAct"); + unsigned short keyID = event.GetKeyId(); + unsigned short keyState = event.GetState(); + // 如果是power键,且是亮屏状态,按键释放就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + return true; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneView.cpp new file mode 100644 index 000000000..ea029b8e9 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneView.cpp @@ -0,0 +1,290 @@ +/*** + * @Date: 2024-06-19 19:25:22 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-30 19:23:15 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/src/FindPhoneView.cpp + */ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-03-27 10:47:46 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2025-02-25 16:19:36 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/src/FindPhoneView.cpp + */ +#include "findphone/include/FindPhoneView.h" +#include "findphone/include/FindPhonePresenter.h" +#include "wearable_log.h" +#include "findphone/include/FindPhoneModel.h" +#include "UiConfig.h" +#include "ui_resource_string.h" +#include "uicomponents/UIComponents.h" + +#ifdef SUPPORT_BLE_SERVICE +#include "bletest.h" +#include "bleEvent.h" +#endif +namespace OHOS +{ + + static FindPhoneView *g_pFindPhoneView{nullptr}; + static constexpr const char *FIND_PONE_IMAGE_SRC = "/user/res/findphone/"; + + FindPhoneView::FindPhoneView() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneView::FindPhoneView"); + g_pFindPhoneView = this; + } + + FindPhoneView::~FindPhoneView() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneView::~FindPhoneView"); + ClearAll(); + g_pFindPhoneView = nullptr; + } + + FindPhoneView *FindPhoneView::GetInstance() + { + return g_pFindPhoneView; + } + + void FindPhoneView::ClearAll() + { + if (FindPhoneGroupView != nullptr) + { + FindPhoneGroupView->RemoveAll(); + + if (FindPhoneTitleLabel != nullptr) + { + delete FindPhoneTitleLabel; + FindPhoneTitleLabel = nullptr; + } + if (FindPhoneImageView != nullptr) + { + delete FindPhoneImageView; + FindPhoneImageView = nullptr; + } + if (FindPhoneImageAnimator != nullptr) + { + FindPhoneImageAnimator->Stop(); + delete FindPhoneImageAnimator; + FindPhoneImageAnimator = nullptr; + FreeImageInfoArray(FindPhonePathsArray, FIND_PONE_IMAGE_SRC, FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES); + } + if (FindPhoneLabel != nullptr) + { + delete FindPhoneLabel; + FindPhoneLabel = nullptr; + } + if (FindPhoneLabelButton != nullptr) + { + delete FindPhoneLabelButton; + FindPhoneLabelButton = nullptr; + } + delete FindPhoneGroupView; + FindPhoneGroupView = nullptr; + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneView::ClearAll over!!"); + } + } + + /*蓝牙如果是未连接状态*/ + void FindPhoneView::FindPhoneViewInit_BlueToothDisConnected(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneView::FindPhoneViewInit_BlueToothConnected"); + if (FindPhoneGroupView == nullptr) + { + /* --------------------------- FindPhoneGroupView --------------------------- */ + FindPhoneGroupView = new UIViewGroup(); + if (FindPhoneGroupView == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneGroupView new fail!!"); + return; + } + FindPhoneGroupView->SetPosition(0, 0, 466, 466); + FindPhoneGroupView->SetStyle(STYLE_BACKGROUND_OPA, 0); + FindPhoneGroupView->SetTouchable(true); + FindPhoneGroupView->SetDraggable(true); + FindPhoneGroupView->SetOnDragListener(presenter_); + /* --------------------------- FindPhoneTitleLabel -------------------------- */ + FindPhoneTitleLabel = new UILabelExt(); + if (FindPhoneTitleLabel == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneTitleLabel new fail!!"); + return; + } + FindPhoneTitleLabel->SetPosition(83, 50, 300, 35); + FindPhoneTitleLabel->SetStyle(STYLE_TEXT_FONT, 30); + FindPhoneTitleLabel->SetStyle(STYLE_LINE_HEIGHT, 35); + FindPhoneTitleLabel->SetTextId(STR_FIND_PHONE); // 查找手机 + FindPhoneTitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + FindPhoneTitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + FindPhoneTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* ----------------------- FindPhoneImageView ---------------------- */ + FindPhoneImageView = new UIImageView(); + if (FindPhoneImageView == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneTitleLabel new fail!!"); + return; + } + FindPhoneImageView->SetPosition(193, 140, 80, 80); +#ifdef FD230 + FindPhoneImageView->SetSrc(PNG_ATTENTION_IMAGE); +#endif + /* ----------------------------- FindPhoneLabel ----------------------------- */ + FindPhoneLabel = new UILabelExt(); + if (FindPhoneLabel == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneLabel new fail"); + return; + } + FindPhoneLabel->SetPosition(83, 270, 300, 35); + FindPhoneLabel->SetStyle(STYLE_TEXT_FONT, 30); + FindPhoneLabel->SetStyle(STYLE_LINE_HEIGHT, 35); + FindPhoneLabel->SetTextId(STR_BLUETOOTH_DISCONNECTED); // 蓝牙未连接 + FindPhoneLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + FindPhoneLabel->SetTextColor(Color::GetColorFromRGBA(0x4f, 0xc3, 0x4c, 0xff)); + FindPhoneLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + FindPhoneLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* -------------------------- FindPhoneLabelButton -------------------------- */ + FindPhoneLabelButton = new UILabelButtonExt(); + if (FindPhoneLabelButton == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneLabelButton new fail"); + return; + } + FindPhoneLabelButton->SetPosition(0, 366, 466, 100); + FindPhoneLabelButton->SetViewId(FINDPHONE_LABELBUTTON); +#ifdef FD230 + FindPhoneLabelButton->SetImageSrc(PNG_BUTTON_466x100_IMAGE, PNG_BUTTON_466x100_IMAGE); +#endif + FindPhoneLabelButton->SetTextId(STR_CLOSE); // 关闭 + FindPhoneLabelButton->SetTextColor(Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff)); + FindPhoneLabelButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + FindPhoneLabelButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + FindPhoneLabelButton->SetOnClickListener(presenter_); + /* ----------------------------------- Add ---------------------------------- */ + FindPhoneGroupView->Add(FindPhoneTitleLabel); + FindPhoneGroupView->Add(FindPhoneImageView); + FindPhoneGroupView->Add(FindPhoneLabel); + FindPhoneGroupView->Add(FindPhoneLabelButton); + AddViewToRootContainer(FindPhoneGroupView); + } + } + + /*蓝牙如果是已连接状态将初始化这个视图*/ + void FindPhoneView::FindPhoneViewInit_BlueToothConnected(void) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneView::FindPhoneViewInit_BlueToothConnected"); + if (FindPhoneGroupView == nullptr) + { + /* --------------------------- FindPhoneGroupView --------------------------- */ + FindPhoneGroupView = new UIViewGroup(); + if (FindPhoneGroupView == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneGroupView new fail!!"); + return; + } + FindPhoneGroupView->SetPosition(0, 0, 466, 466); + FindPhoneGroupView->SetStyle(STYLE_BACKGROUND_OPA, 0); + FindPhoneGroupView->SetTouchable(true); + FindPhoneGroupView->SetDraggable(true); + FindPhoneGroupView->SetOnDragListener(presenter_); + /* --------------------------- FindPhoneTitleLabel -------------------------- */ + FindPhoneTitleLabel = new UILabelExt(); + if (FindPhoneTitleLabel == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneTitleLabel new fail!!"); + return; + } + FindPhoneTitleLabel->SetPosition(83, 50, 300, 35); + FindPhoneTitleLabel->SetStyle(STYLE_TEXT_FONT, 30); + FindPhoneTitleLabel->SetStyle(STYLE_LINE_HEIGHT, 35); + FindPhoneTitleLabel->SetTextId(STR_FIND_PHONE); // 查找手机 + FindPhoneTitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + FindPhoneTitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + FindPhoneTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* ----------------------- FindPhoneImageAnimator ---------------------- */ + FindPhonePathsArray = CreateImageInfoArray(FIND_PONE_IMAGE_SRC, FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES); + if (FindPhoneImageAnimator == nullptr) + { + FindPhoneImageAnimator = new UIImageAnimatorView(); + if (FindPhoneImageAnimator == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneImageAnimator new fail"); + return; + } + for (uint8_t i = 0; i < FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES; i++) + { + // FindPhoneImageInfo[i].imagePath = (FindPhonePathsArray[i]); + // FindPhoneImageInfo[i].imageType = IMG_SRC_FILE_PATH; + FindPhoneImageInfo[i].imageInfo = (FindPhonePathsArray[i]); + FindPhoneImageInfo[i].imageType = IMG_SRC_IMAGE_INFO; + FindPhoneImageInfo[i].pos.x = FINDPHONE_IMAGE_ANIMATOR_VIEW_X; + FindPhoneImageInfo[i].pos.y = FINDPHONE_IMAGE_ANIMATOR_VIEW_Y; + FindPhoneImageInfo[i].width = FINDPHONE_IMAGE_ANIMATOR_VIEW_W; + FindPhoneImageInfo[i].height = FINDPHONE_IMAGE_ANIMATOR_VIEW_H; + } + FindPhoneImageAnimator->SetPosition(FINDPHONE_IMAGE_ANIMATOR_VIEW_X, FINDPHONE_IMAGE_ANIMATOR_VIEW_Y, FINDPHONE_IMAGE_ANIMATOR_VIEW_W, FINDPHONE_IMAGE_ANIMATOR_VIEW_H); + FindPhoneImageAnimator->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + FindPhoneImageAnimator->SetStyle(STYLE_BACKGROUND_OPA, 0xff); + FindPhoneImageAnimator->SetImageAnimatorSrc(FindPhoneImageInfo, FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES, FINDPHONE_IMAGE_ANIMATOR_VIEW_TIMEOFUPDATE); + FindPhoneImageAnimator->SetRepeat(true); + FindPhoneImageAnimator->Start(); + } + /* ----------------------------- FindPhoneLabel ----------------------------- */ + FindPhoneLabel = new UILabelExt(); + if (FindPhoneLabel == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneLabel new fail"); + return; + } + FindPhoneLabel->SetPosition(83, 270, 300, 35); + FindPhoneLabel->SetStyle(STYLE_TEXT_FONT, 30); + FindPhoneLabel->SetStyle(STYLE_LINE_HEIGHT, 35); + FindPhoneLabel->SetTextId(STR_PHONE_RINGING_VIBRATING); // 手机正在响铃/震动 + FindPhoneLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + FindPhoneLabel->SetTextColor(Color::GetColorFromRGBA(0x4f, 0xc3, 0x4c, 0xff)); + FindPhoneLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + FindPhoneLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + /* -------------------------- FindPhoneLabelButton -------------------------- */ + FindPhoneLabelButton = new UILabelButtonExt(); + if (FindPhoneLabelButton == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneLabelButton new fail"); + return; + } + FindPhoneLabelButton->SetPosition(0, 366, 466, 100); + FindPhoneLabelButton->SetViewId(FINDPHONE_LABELBUTTON); +#ifdef FD230 + FindPhoneLabelButton->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE); +#endif + // FindPhoneLabelButton->SetText("停止"); + FindPhoneLabelButton->SetTextId(STR_STOP); + FindPhoneLabelButton->SetTextColor(Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff)); + FindPhoneLabelButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + FindPhoneLabelButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED); + FindPhoneLabelButton->SetOnClickListener(presenter_); + /* ----------------------------------- Add ---------------------------------- */ + FindPhoneGroupView->Add(FindPhoneTitleLabel); + FindPhoneGroupView->Add(FindPhoneImageAnimator); + FindPhoneGroupView->Add(FindPhoneLabel); + FindPhoneGroupView->Add(FindPhoneLabelButton); + AddViewToRootContainer(FindPhoneGroupView); + } + } + + void FindPhoneView::OnStart() + { + if (FindPhoneModel::GetInstance().GetBlueToothConnectedState() == true) // 判断蓝牙是否是连接状态 + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phone is connected"); + FindPhoneViewInit_BlueToothConnected(); + FindPhoneModel::GetInstance().start_or_stop_find_phone(FINDPHONE_START); + } + else + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phone is not connected"); + FindPhoneViewInit_BlueToothDisConnected(); + } + return; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleData.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleData.h new file mode 100644 index 000000000..72e7a26b2 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleData.h @@ -0,0 +1,54 @@ + +#ifndef __SCHEDULEDATA_H__ +#define __SCHEDULEDATA_H__ + +// #include "ohos_types.h" +#include + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif +#endif + +// namespace OHOS +// { + #define SCHEDULE_DATA_FILE "/user/userdata/scheduleData.bin" + #define SCHEDULE_DATA_DIRECTORY "/user/userdata/" + + #define SCHEDULE_DATE_STR_MAX (8) + #define SCHEDULE_TOPIC_STR_MAX (64) + #define SCHEDULE_TIME_STR_MAX (16) + #define SCHEDULE_CONTENT_STR_MAX (256) + + typedef struct + { + char date[SCHEDULE_DATE_STR_MAX]; + char topic[SCHEDULE_TOPIC_STR_MAX]; + char time[SCHEDULE_TIME_STR_MAX]; + char content[SCHEDULE_CONTENT_STR_MAX]; + }C_ScheduleRevData; + + typedef struct + { + std::string date; // 7/8 + std::string topic; // xxxx + std::string time; //10:30-14:00 + std::string content; // yyyyyyy + }ScheduleRevData; + + #define SCHEDULE_DATA_COUNT_MAX (20) + + void C_ScheduleSetByApp(ScheduleRevData * data, uint8_t index, bool is_finish); + int C_ScheduleDataReadFromFile(void); + int C_ScheduleDataWriteToFile(void); +// } + + +#ifdef __cplusplus +#if __cplusplus +} +#endif +#endif + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListAdapter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListAdapter.h new file mode 100644 index 000000000..e60be8630 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListAdapter.h @@ -0,0 +1,32 @@ + +#ifndef __SCHEDULELISTADAPTER_H__ +#define __SCHEDULELISTADAPTER_H__ + +#include "View.h" +#include "components/abstract_adapter.h" +#include "schedule/include/ScheduleModel.h" +#include "schedule/include/ScheduleListItem.h" + + +namespace OHOS +{ + class ScheduleListAdapter : public AbstractAdapter + { + public: + ScheduleListAdapter(); + ~ScheduleListAdapter() override; + ScheduleListAdapter * GetInstance(); + + UIView * GetView(UIView * inView, int16_t index) override; + uint16_t GetCount() override; + void AddListItem(const ScheduleListItemInfo &item); + void ClearListItem(void); + + void SetItemClickListener(UIView::OnClickListener *itemClickListener); + + private: + List nodeList_; + UIView::OnClickListener * itemClickListener_; + }; +} +#endif diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListItem.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListItem.h new file mode 100644 index 000000000..3a3c125fd --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListItem.h @@ -0,0 +1,62 @@ + +#ifndef __SCHEDULELISTITEM_H__ +#define __SCHEDULELISTITEM_H__ + +#include "View.h" +#include "ohos_types.h" +#include "components/ui_view_group.h" +#include "components/ui_label_ext.h" +#include "components/ui_image_view.h" + + +namespace OHOS +{ + typedef struct + { + std::string DateStr; + std::string TopicStr; + std::string TimeStr; + std::string ContentStr; + uint8_t OriginalDataIndex; + bool IsDateItem; + uint8_t ChildIndex; // if(false == IsDateItem) + } ScheduleListItemInfo; + + + class ScheduleListItem : public UIViewGroup + { + public: + ScheduleListItem(); + ~ScheduleListItem() override; + void SetItemInfo(const ScheduleListItemInfo &itemInfo); + void ResetItemStyle(const ScheduleListItemInfo &itemInfo); + void ResetHeight(bool val); + + + private: + ScheduleListItem(const ScheduleListItem &); + ScheduleListItem &operator = (const ScheduleListItem &); + + UIViewGroup InfoGroup_; + UILabelExt LabelExtDate_; + UILabelExt LabelExtTopic_; + UILabelExt LabelExtTime_; + UIImageView Image_; + // ScheduleListItemInfo itemInfo_ = { nullptr, nullptr, nullptr, nullptr, 0 }; + + #define ITEM_WIDTH (380) + #define ITEM_HEIGHT (100) + #define ITEM_GAP (20) + + #define ODD_ITEM_BACKGROUND_COLOR (0Xff001833) + #define ODD_ITEM_TOPIC_COLOR (0Xff0176ff) + #define ODD_ITEM_TIME_COLOR (0Xff8bc0ff) + + #define EVEN_ITEM_BACKGROUND_COLOR (0Xff331f00) + #define EVEN_ITEM_TOPIC_COLOR (0Xffff7b01) + #define EVEN_ITEM_TIME_COLOR (0Xffffc28b) + + #define IMAGE_ITEM_ARROW "/user/res/Schedule/IMAGE_ITEM_ARROW.bin" + }; +} +#endif diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleModel.h new file mode 100644 index 000000000..3e028f7e5 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleModel.h @@ -0,0 +1,56 @@ + +#ifndef __SCHEDULEMODEL_H__ +#define __SCHEDULEMODEL_H__ + +#include "ohos_types.h" +#include "schedule/include/ScheduleListItem.h" +#include "schedule/include/ScheduleData.h" + + +namespace OHOS +{ + class ScheduleModel + { + public: + static ScheduleModel &GetInstance(void); + + ScheduleListItemInfo * ScheduleAllItemDataGet(void); + uint8_t ScheduleItemDataCountGet(void); + uint8_t ScheduleOriginalDataCountGet(void); + + std::string ScheduleItemDataDateStrGet(uint8_t index); + std::string ScheduleItemDataTopicStrGet(uint8_t index); + std::string ScheduleItemDataTimeStrGet(uint8_t index); + std::string ScheduleItemDataContentStrGet(uint8_t index); + uint8_t ScheduleItemDataOriginalDataIndexGet(uint8_t index); + + void ScheduleOriginalDataSetByApp(ScheduleRevData * data, uint8_t index, bool is_finish); + void ScheduleOriginalDataSetByUI(uint8_t index); + + int ScheduleDataReadFromFile(void); + int ScheduleDataWriteToFile(void); + + void DataStringToCharArray(void); + void DataCharArrayToString(uint8_t DataCount); + + private: + ScheduleModel(); + ~ScheduleModel(); + ScheduleModel(const ScheduleModel &) = delete; + ScheduleModel &operator=(const ScheduleModel &) = delete; + + void ScheduleItemDataCountSet(uint8_t count); + void ScheduleOriginalDataCountSet(uint8_t count); + void ScheduleOriginalDataToItemData(uint8_t DataCount); + + // original data + ScheduleRevData ScheduleOriginalData_[SCHEDULE_DATA_COUNT_MAX] = {nullptr, nullptr, nullptr, nullptr}; + C_ScheduleRevData C_ScheduleOriginalData_[SCHEDULE_DATA_COUNT_MAX] = {0}; + // item data + ScheduleListItemInfo ScheduleItemData_[SCHEDULE_DATA_COUNT_MAX*2] = {nullptr, nullptr, nullptr, nullptr, 0, false, 0}; + uint8_t ItemCount_{0}; + uint8_t DataCount_{0}; + }; +} + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/SchedulePresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/SchedulePresenter.h new file mode 100644 index 000000000..a4e9ed1e7 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/SchedulePresenter.h @@ -0,0 +1,42 @@ + +#ifndef __SCHEDULEPRESENTER_H__ +#define __SCHEDULEPRESENTER_H__ + +#include "Presenter.h" +#include "View.h" + +#include "schedule/include/ScheduleView.h" +#include "schedule/include/ScheduleModel.h" + + +namespace OHOS +{ + class ScheduleView; + class ScheduleModel; + class SchedulePresenter : public Presenter, + public UIView::OnClickListener, + public UIView::OnDragListener, + public RootView::OnKeyActListener + { + public: + SchedulePresenter(); + virtual ~SchedulePresenter(); + static SchedulePresenter * GetInstance(); + + void OnStart() override; + void OnResume() override; + void OnPause() override; + void OnStop() override; + + private: + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnDragEnd(UIView &view, const DragEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; + + ScheduleModel * ScheduleModel_; + bool X_DRAG_FLAG{false}; + }; +} + +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleView.h new file mode 100644 index 000000000..fe44f2b8e --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleView.h @@ -0,0 +1,129 @@ + +#ifndef __SCHEDULEVIEW_H__ +#define __SCHEDULEVIEW_H__ + +#include "View.h" +#include "ohos_types.h" +#include "components/ui_view_group.h" +#include "components/ui_label_ext.h" +#include "components/ui_image_view.h" +#include "components/ui_list.h" +#include "components/ui_scroll_view.h" +// #include "components/ui_button.h" +#include "components/ui_label_button_ext.h" +#include "common/screen.h" +#include "ui_resource_string.h" + +#include "schedule/include/SchedulePresenter.h" +#include "schedule/include/ScheduleListAdapter.h" +#include "schedule/include/ScheduleListItem.h" + + +namespace OHOS +{ + #define SCHEDULE_ViewId_NoDataGroup_ "SCHEDULE_ViewId_ContentDeleteButton_" + #define SCHEDULE_ViewId_DataGroup_ "SCHEDULE_ViewId_DataGroup_" + #define SCHEDULE_ViewId_ContentGroup_ "SCHEDULE_ViewId_ContentGroup_" + #define SCHEDULE_ViewId_DeleteGroup_ "SCHEDULE_ViewId_DeleteGroup_" + + #define SCHEDULE_ViewId_ContentDeleteButton_ "SCHEDULE_ViewId_ContentDeleteButton_" + #define SCHEDULE_ViewId_ContentCloseButton_ "SCHEDULE_ViewId_ContentCloseButton_" + #define SCHEDULE_ViewId_DeleteCancelButton_ "SCHEDULE_ViewId_DeleteCancelButton_" + #define SCHEDULE_ViewId_DeleteOKButton_ "SCHEDULE_ViewId_DeleteOKButton_" + + class SchedulePresenter; + class ScheduleView : public View + { + public: + ScheduleView(); + ~ScheduleView(); + static ScheduleView * GetInstance(void); + + void OnStart() override; + void OnStop() override; + + void ItemListAdd(const ScheduleListItemInfo &item); + void ItemListClear(void); + void ItemListContentUpdate(void); + void ItemListScrollByUpdate(bool isUpScroll = false); + + void ContentScreenItemIndexSet(uint8_t index); + uint8_t ContentScreenItemIndexGet(void); + + void DisplayDataOrNoScreen(void); + void DisplayContentScreen(void); + void DisplayDeleteScreen(void); + + void SetViewFocus(bool val); + + private: + + void ResetScheduleList(void); + + UIViewGroup * InitNoDataScreen(); + void DeinitNoDataScreen(); + UILabelExt * InitLabel(int16_t x, int16_t y, int16_t width, int16_t height, + uint16_t line_height, uint8_t font_size, uint16_t text_id, uint32_t text_color); + + UIViewGroup * NoDataGroup_{nullptr}; + UILabelExt * LabelExt0_{nullptr}; + UIImageView * ImageView_{nullptr}; + UILabelExt * LabelExt1_{nullptr}; + UILabelExt * LabelExt2_{nullptr}; + + + UIViewGroup * InitDataScreen(); + void DeinitDataScreen(); + UIViewGroup * DataGroup_{nullptr}; + UIList * ScheduleList_{nullptr}; + ScheduleListAdapter * ScheduleListAdapter_{nullptr}; + + + UIScrollView * InitContentScreen(); + void DeinitContentScreen(); + UIScrollView * ContentGroup_{nullptr}; + UILabelExt * ContentDateLabelExt_{nullptr}; + UILabelExt * ContentTopicLabelExt_{nullptr}; + UILabelExt * ContentTopicLabelExt1_{nullptr}; + UILabelExt * ContentTimeLabelExt_{nullptr}; + UILabelExt * ContentTimeLabelExt1_{nullptr}; + UILabelExt * ContentContentLabelExt_{nullptr}; + UILabelExt * ContentContentLabelExt1_{nullptr}; + UILabelButtonExt * ContentDeleteButton_{nullptr}; + UILabelButtonExt * ContentCloseButton_{nullptr}; + uint8_t ContentItemIndex_{0}; + + + UIViewGroup * InitDeleteScreen(); + void DeinitDeleteScreen(); + UIViewGroup * DeleteGroup_{nullptr}; + UILabelExt * DeleteTitleLabelExt_{nullptr}; + UILabelExt * DeletePromptLabelExt_{nullptr}; + UILabelButtonExt * DeleteCancelButton_{nullptr}; + UILabelButtonExt * DeleteOKButton_{nullptr}; + + + void DisplaySelectScreen(uint8_t ScreenIndex); + typedef enum + { + ENUM_SCHEDULE_SCREEN_NO_DATA, + ENUM_SCHEDULE_SCREEN_LIST, + ENUM_SCHEDULE_SCREEN_CONTENT, + ENUM_SCHEDULE_SCREEN_DELETE, + + ENUM_SCHEDULE_SCREEN_MAX + }ENUM_SCHEDULE_SCREEN; + UIViewGroup * ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_MAX]{nullptr}; + + + #define SCREEN_WIDTH (Screen::GetInstance().GetWidth()) + #define SCREEN_HEIGHT (Screen::GetInstance().GetHeight()) + #define LIST_LEFT (43) + #define LIST_TOP (50) + #define LIST_WIDTH (SCREEN_WIDTH - LIST_LEFT * 2) + #define LIST_HEIGHT (SCREEN_HEIGHT - LIST_TOP * 2) + + #define NO_DATA_IMAGE "/user/res/Schedule/schedule_no_data.bin" + }; +} +#endif diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListAdapter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListAdapter.cpp new file mode 100644 index 000000000..83e52d74f --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListAdapter.cpp @@ -0,0 +1,88 @@ +#include "schedule/include/ScheduleListAdapter.h" +#include "wearable_log.h" + +namespace OHOS +{ + static ScheduleListAdapter * p_ScheduleListAdapterInstance = nullptr; + + ScheduleListAdapter::ScheduleListAdapter() + { + p_ScheduleListAdapterInstance = this; + } + + ScheduleListAdapter::~ScheduleListAdapter() + { + p_ScheduleListAdapterInstance = nullptr; + nodeList_.Clear(); + } + + ScheduleListAdapter * ScheduleListAdapter::GetInstance() + { + return p_ScheduleListAdapterInstance; + } + + UIView * ScheduleListAdapter::GetView(UIView * inView, int16_t index) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:GetView,%d", __LINE__, index); + if(nodeList_.IsEmpty() || nodeList_.Size() <= index || 0 > index) + { + return nullptr; + } + + ScheduleListItem * item = nullptr; + ListNode * node = nodeList_.Begin(); + for (uint16_t i = 0; i < index; i++) + { + node = node->next_; + } + + if (nullptr == inView) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:GetView", __LINE__); + item = new ScheduleListItem(); + if (nullptr == item) + return nullptr; + } + else + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:GetView", __LINE__); + item = static_cast(inView); + } + + if (item != nullptr) + { + item->SetViewIndex(index); + item->ResetItemStyle(node->data_); + item->SetItemInfo(node->data_); + item->SetOnClickListener(itemClickListener_); + } + if(nodeList_.Size() > 2 && index == nodeList_.Size() - 1) + item->ResetHeight(true); + else + item->ResetHeight(false); + + return item; + } + + uint16_t ScheduleListAdapter::GetCount() + { + return nodeList_.Size(); + } + + void ScheduleListAdapter::AddListItem(const ScheduleListItemInfo &item) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:AddListItem", __LINE__); + nodeList_.PushBack(item); + } + + void ScheduleListAdapter::ClearListItem(void) + { + nodeList_.Clear(); + } + + void ScheduleListAdapter::SetItemClickListener(UIView::OnClickListener *itemClickListener) + { + itemClickListener_ = itemClickListener; + } + +} diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListItem.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListItem.cpp new file mode 100644 index 000000000..416340289 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListItem.cpp @@ -0,0 +1,157 @@ + +#include "schedule/include/ScheduleListItem.h" +#include "wearable_log.h" + +namespace OHOS +{ + ScheduleListItem::ScheduleListItem() + { + SetPosition(0, 0, ITEM_WIDTH, ITEM_HEIGHT + ITEM_GAP); + SetStyle(STYLE_BACKGROUND_COLOR, OHOS::Color::Black().full); + SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + // SetStyle(STYLE_BORDER_RADIUS, 20); + // SetTouchable(true); + + InfoGroup_.SetPosition(0, ITEM_GAP>>1, ITEM_WIDTH, ITEM_HEIGHT); + InfoGroup_.SetStyle(STYLE_BACKGROUND_COLOR, OHOS::Color::Black().full); + InfoGroup_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + InfoGroup_.SetStyle(STYLE_BORDER_RADIUS, 20); + InfoGroup_.SetTouchable(true); + + LabelExtDate_.SetPosition((ITEM_WIDTH - 300)>>1, (ITEM_HEIGHT - 55)>>1, 300, 55); + LabelExtDate_.SetStyle(STYLE_TEXT_FONT, 30); + LabelExtDate_.SetStyle(STYLE_LINE_HEIGHT, 35); + // LabelExtDate_.SetTextId(text_id); + LabelExtDate_.SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + LabelExtDate_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + LabelExtDate_.SetRollSpeed(23); + LabelExtDate_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + LabelExtDate_.SetStyle(STYLE_TEXT_COLOR, 0xffff5a36); + + LabelExtTopic_.SetPosition(47, 22, 250, 35); + LabelExtTopic_.SetStyle(STYLE_TEXT_FONT, 30); + LabelExtTopic_.SetStyle(STYLE_LINE_HEIGHT, 35); + // LabelExtTopic_.SetTextId(text_id); + LabelExtTopic_.SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + LabelExtTopic_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP); + LabelExtTopic_.SetRollSpeed(23); + LabelExtTopic_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + // LabelExtTopic_.SetStyle(STYLE_TEXT_COLOR, 0xffff5a36); + + LabelExtTime_.SetPosition(47, 57, 115, 24); + LabelExtTime_.SetStyle(STYLE_TEXT_FONT, 20); + LabelExtTime_.SetStyle(STYLE_LINE_HEIGHT, 24); + // LabelExtTime_.SetTextId(text_id); + LabelExtTime_.SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + LabelExtTime_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP); + LabelExtTime_.SetRollSpeed(23); + LabelExtTime_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 20); + // LabelExtTime_.SetStyle(STYLE_TEXT_COLOR, 0xffff5a36); + + Image_.SetPosition(326, 37, 14, 26); + Image_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE); + Image_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT); + Image_.SetResizeMode(UIImageView::CENTER); + Image_.SetAutoEnable(false); + Image_.SetSrc(IMAGE_ITEM_ARROW); + + InfoGroup_.Add(&LabelExtDate_); + InfoGroup_.Add(&LabelExtTopic_); + InfoGroup_.Add(&LabelExtTime_); + InfoGroup_.Add(&Image_); + Add(&InfoGroup_); + } + + ScheduleListItem::~ScheduleListItem() + { + RemoveAll(); + InfoGroup_.RemoveAll(); + } + + void ScheduleListItem::SetItemInfo(const ScheduleListItemInfo &itemInfo) + { + if(true == itemInfo.IsDateItem) + { + LabelExtDate_.SetText(itemInfo.DateStr.c_str()); + } + else + { + if(0 == (itemInfo.ChildIndex % 2)) + { + LabelExtTopic_.SetText(itemInfo.TopicStr.c_str()); + LabelExtTime_.SetText(itemInfo.TimeStr.c_str()); + } + else + { + LabelExtTopic_.SetText(itemInfo.TopicStr.c_str()); + LabelExtTime_.SetText(itemInfo.TimeStr.c_str()); + } + } + } + + void ScheduleListItem::ResetItemStyle(const ScheduleListItemInfo &itemInfo) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ResetItemStyle,%d,%d", + __LINE__, itemInfo.IsDateItem, itemInfo.ChildIndex); + + if(true == itemInfo.IsDateItem) + { + // SetHeight(ITEM_HEIGHT- ITEM_GAP); + + // InfoGroup_.SetHeight(ITEM_HEIGHT- ITEM_GAP); + InfoGroup_.SetStyle(STYLE_BACKGROUND_COLOR, OHOS::Color::Black().full); + InfoGroup_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + InfoGroup_.SetTouchable(false); + + LabelExtDate_.SetVisible(true); + LabelExtTopic_.SetVisible(false); + LabelExtTime_.SetVisible(false); + Image_.SetVisible(false); + } + else + { + if(0 == (itemInfo.ChildIndex % 2)) + { + InfoGroup_.SetStyle(STYLE_BACKGROUND_COLOR, ODD_ITEM_BACKGROUND_COLOR); + InfoGroup_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + InfoGroup_.SetTouchable(true); + + LabelExtDate_.SetVisible(false); + LabelExtTopic_.SetVisible(true); + LabelExtTime_.SetVisible(true); + Image_.SetVisible(true); + + LabelExtTopic_.SetStyle(STYLE_TEXT_COLOR, ODD_ITEM_TOPIC_COLOR); + LabelExtTime_.SetStyle(STYLE_TEXT_COLOR, ODD_ITEM_TIME_COLOR); + } + else + { + InfoGroup_.SetStyle(STYLE_BACKGROUND_COLOR, EVEN_ITEM_BACKGROUND_COLOR); + InfoGroup_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + InfoGroup_.SetTouchable(true); + + LabelExtDate_.SetVisible(false); + LabelExtTopic_.SetVisible(true); + LabelExtTime_.SetVisible(true); + Image_.SetVisible(true); + + LabelExtTopic_.SetStyle(STYLE_TEXT_COLOR, EVEN_ITEM_TOPIC_COLOR); + LabelExtTime_.SetStyle(STYLE_TEXT_COLOR, EVEN_ITEM_TIME_COLOR); + } + } + } + + void ScheduleListItem::ResetHeight(bool val) + { + //防止list中元素超过3个后最后一个被遮住,且仅在最后一个元素设置其高度为160 + if (val) + { + SetHeight(ITEM_HEIGHT + ITEM_GAP*3); + } + else + { + SetHeight(ITEM_HEIGHT + ITEM_GAP); + } + } + +} diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleModel.cpp new file mode 100644 index 000000000..fcfd984eb --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleModel.cpp @@ -0,0 +1,299 @@ + +// #include +// #include +// #include +#include "schedule/include/ScheduleModel.h" +#include "wearable_log.h" + +namespace OHOS +{ + ScheduleModel::ScheduleModel(){} + + ScheduleModel::~ScheduleModel(){} + + ScheduleModel &ScheduleModel::GetInstance() + { + static ScheduleModel instance; + return instance; + } + + uint8_t ScheduleModel::ScheduleItemDataCountGet(void) + { + return ItemCount_; + } + + void ScheduleModel::ScheduleItemDataCountSet(uint8_t count) + { + ItemCount_ = count; + } + + uint8_t ScheduleModel::ScheduleOriginalDataCountGet(void) + { + return DataCount_; + } + + void ScheduleModel::ScheduleOriginalDataCountSet(uint8_t count) + { + DataCount_ = count; + } + + ScheduleListItemInfo *ScheduleModel::ScheduleAllItemDataGet(void) + { + return ScheduleItemData_; + } + + std::string ScheduleModel::ScheduleItemDataDateStrGet(uint8_t index) + { + return ScheduleItemData_[index].DateStr.c_str(); + } + + std::string ScheduleModel::ScheduleItemDataTopicStrGet(uint8_t index) + { + return ScheduleItemData_[index].TopicStr.c_str(); + } + + std::string ScheduleModel::ScheduleItemDataTimeStrGet(uint8_t index) + { + return ScheduleItemData_[index].TimeStr.c_str(); + } + + std::string ScheduleModel::ScheduleItemDataContentStrGet(uint8_t index) + { + return ScheduleItemData_[index].ContentStr.c_str(); + } + + uint8_t ScheduleModel::ScheduleItemDataOriginalDataIndexGet(uint8_t index) + { + return ScheduleItemData_[index].OriginalDataIndex; + } + + void ScheduleModel::ScheduleOriginalDataSetByApp(ScheduleRevData *data, uint8_t index, bool is_finish) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleOriginalDataSetByApp,%d,%d", index, is_finish); + uint8_t len = 0; + if (index >= SCHEDULE_DATA_COUNT_MAX) + { + return; + } + + ScheduleOriginalData_[index].date.assign(data->date); + + len = ((SCHEDULE_TOPIC_STR_MAX - 1 > data->topic.length()) ? data->topic.length() : SCHEDULE_TOPIC_STR_MAX - 1); + ScheduleOriginalData_[index].topic.assign(data->topic, 0, len); + + ScheduleOriginalData_[index].time.assign(data->time); + + len = ((SCHEDULE_CONTENT_STR_MAX - 1 > data->content.length()) ? data->content.length() : SCHEDULE_CONTENT_STR_MAX - 1); + ScheduleOriginalData_[index].content.assign(data->content, 0, len); + + if (true == is_finish) + { + uint8_t DataCount = index + 1; + ScheduleOriginalDataCountSet(DataCount); + ScheduleOriginalDataToItemData(DataCount); + } + } + + void ScheduleModel::ScheduleOriginalDataSetByUI(uint8_t index) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleModel::ScheduleOriginalDataSetByUI,%d", index); + + uint8_t DataCount = ScheduleOriginalDataCountGet(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleModel::DataCount:%d", DataCount); + uint8_t i = 0; + for (i = index; i < (DataCount - 1); i++) + { + ScheduleOriginalData_[i].date.assign(ScheduleOriginalData_[i + 1].date); + ScheduleOriginalData_[i].topic.assign(ScheduleOriginalData_[i + 1].topic); + ScheduleOriginalData_[i].time.assign(ScheduleOriginalData_[i + 1].time); + ScheduleOriginalData_[i].content.assign(ScheduleOriginalData_[i + 1].content); + } + + ScheduleOriginalData_[i].date.clear(); + ScheduleOriginalData_[i].topic.clear(); + ScheduleOriginalData_[i].time.clear(); + ScheduleOriginalData_[i].content.clear(); + + DataCount -= 1; + ScheduleOriginalDataCountSet(DataCount); + ScheduleOriginalDataToItemData(DataCount); + } + + void ScheduleModel::ScheduleOriginalDataToItemData(uint8_t DataCount) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleModel::ScheduleOriginalDataToItemData,%d", DataCount); + uint8_t i = 0; + uint8_t j = 0; + + memset(ScheduleItemData_, 0x0, sizeof(ScheduleListItemInfo) * SCHEDULE_DATA_COUNT_MAX * 2); + ScheduleItemDataCountSet(0); + + for (i = 0, j = 0; i < DataCount; i++) + { + if (0 == i) + { + ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date); + ScheduleItemData_[j].OriginalDataIndex = i; + ScheduleItemData_[j].IsDateItem = true; + + j++; + ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date); + ScheduleItemData_[j].TopicStr.assign(ScheduleOriginalData_[i].topic); + ScheduleItemData_[j].TimeStr.assign(ScheduleOriginalData_[i].time); + ScheduleItemData_[j].ContentStr.assign(ScheduleOriginalData_[i].content); + ScheduleItemData_[j].OriginalDataIndex = i; + ScheduleItemData_[j].IsDateItem = false; + ScheduleItemData_[j].ChildIndex = 0; + } + else + { + if (0 == ScheduleOriginalData_[i].date.compare(ScheduleOriginalData_[i - 1].date)) + { + j++; + ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date); + ScheduleItemData_[j].TopicStr.assign(ScheduleOriginalData_[i].topic); + ScheduleItemData_[j].TimeStr.assign(ScheduleOriginalData_[i].time); + ScheduleItemData_[j].ContentStr.assign(ScheduleOriginalData_[i].content); + ScheduleItemData_[j].OriginalDataIndex = i; + ScheduleItemData_[j].IsDateItem = false; + ScheduleItemData_[j].ChildIndex = ScheduleItemData_[j - 1].ChildIndex + 1; + } + else + { + j++; + ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date); + ScheduleItemData_[j].OriginalDataIndex = i; + ScheduleItemData_[j].IsDateItem = true; + + j++; + ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date); + ScheduleItemData_[j].TopicStr.assign(ScheduleOriginalData_[i].topic); + ScheduleItemData_[j].TimeStr.assign(ScheduleOriginalData_[i].time); + ScheduleItemData_[j].ContentStr.assign(ScheduleOriginalData_[i].content); + ScheduleItemData_[j].OriginalDataIndex = i; + ScheduleItemData_[j].IsDateItem = false; + ScheduleItemData_[j].ChildIndex = 0; + } + } + + if ((SCHEDULE_DATA_COUNT_MAX * 2) <= j) + { + break; + } + } + + if (0 != DataCount) + { + uint8_t ItemCount = j + 1; + ScheduleItemDataCountSet(ItemCount); + } + + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleModel::ScheduleOriginalDataToItemData,%d,%s", j, ScheduleItemData_[0].DateStr.c_str()); + } + + void ScheduleModel::DataStringToCharArray(void) + { + uint8_t DataCount = ScheduleOriginalDataCountGet(); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:DataStringToCharArray,%d", __LINE__, DataCount); + + memset(C_ScheduleOriginalData_, 0x0, sizeof(C_ScheduleRevData) * SCHEDULE_DATA_COUNT_MAX); + + uint8_t i = 0; + for (i = 0; i < DataCount; i++) + { + memcpy(C_ScheduleOriginalData_[i].date, ScheduleOriginalData_[i].date.c_str(), SCHEDULE_DATE_STR_MAX - 1); + memcpy(C_ScheduleOriginalData_[i].topic, ScheduleOriginalData_[i].topic.c_str(), SCHEDULE_TOPIC_STR_MAX - 1); + memcpy(C_ScheduleOriginalData_[i].time, ScheduleOriginalData_[i].time.c_str(), SCHEDULE_TIME_STR_MAX - 1); + memcpy(C_ScheduleOriginalData_[i].content, ScheduleOriginalData_[i].content.c_str(), SCHEDULE_CONTENT_STR_MAX - 1); + } + } + + void ScheduleModel::DataCharArrayToString(uint8_t DataCount) + { + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:DataCharArrayToString,%d", __LINE__, DataCount); + + uint8_t i = 0; + for (i = 0; i < DataCount; i++) + { + ScheduleOriginalData_[i].date.assign(C_ScheduleOriginalData_[i].date); + ScheduleOriginalData_[i].topic.assign(C_ScheduleOriginalData_[i].topic); + ScheduleOriginalData_[i].time.assign(C_ScheduleOriginalData_[i].time); + ScheduleOriginalData_[i].content.assign(C_ScheduleOriginalData_[i].content); + } + ScheduleOriginalDataCountSet(DataCount); + } + + // int C_ScheduleDataReadFromFile(void) + int ScheduleModel::ScheduleDataReadFromFile(void) + { + FILE *fp = fopen(SCHEDULE_DATA_FILE, "rb"); + if (fp == nullptr) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:C_ScheduleDataReadFromFile", __LINE__); + return OHOS_FAILURE; + } + + fseek(fp, 0, SEEK_END); + int len = ftell(fp); + fseek(fp, 0, SEEK_SET); + uint8_t DataCount = len / sizeof(C_ScheduleRevData); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:%d,%d", __LINE__, DataCount, len); + fread((char *)C_ScheduleOriginalData_, sizeof(C_ScheduleRevData), DataCount, fp); + fclose(fp); + + DataCharArrayToString(DataCount); + + ScheduleOriginalDataCountSet(DataCount); + ScheduleOriginalDataToItemData(DataCount); + + return OHOS_SUCCESS; + } + + // int C_ScheduleDataWriteToFile(void) + int ScheduleModel::ScheduleDataWriteToFile(void) + { + uint8_t DataCount = ScheduleOriginalDataCountGet(); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ScheduleDataWriteToFile,%d", __LINE__, DataCount); + if (0 == DataCount) + { + return OHOS_FAILURE; + } + + FILE *fp = fopen(SCHEDULE_DATA_FILE, "wb+"); + if (nullptr == fp) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ScheduleDataWriteToFile fail", __LINE__); + return OHOS_FAILURE; + } + + DataStringToCharArray(); + + size_t ret = fwrite(C_ScheduleOriginalData_, sizeof(C_ScheduleRevData), DataCount, fp); + if (DataCount != ret) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ScheduleDataWriteToFile fail", __LINE__); + } + fclose(fp); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ScheduleDataWriteToFile success", __LINE__); + + return OHOS_SUCCESS; + } +} + +// c func +void C_ScheduleSetByApp(ScheduleRevData *data, uint8_t index, bool is_finish) +{ + OHOS::ScheduleModel::GetInstance().ScheduleOriginalDataSetByApp(data, index, is_finish); +} + +int C_ScheduleDataReadFromFile(void) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:C_ScheduleDataReadFromFile", __LINE__); + return OHOS::ScheduleModel::GetInstance().ScheduleDataReadFromFile(); +} + +int C_ScheduleDataWriteToFile(void) +{ + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:C_ScheduleDataWriteToFile", __LINE__); + return OHOS::ScheduleModel::GetInstance().ScheduleDataWriteToFile(); +} diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/SchedulePresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/SchedulePresenter.cpp new file mode 100644 index 000000000..15504ed13 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/SchedulePresenter.cpp @@ -0,0 +1,159 @@ +/* + * @Author: luozheng 1732036298@qq.com + * @Date: 2024-06-20 15:11:17 + * @LastEditors: luozheng 1732036298@qq.com + * @LastEditTime: 2024-12-13 16:28:48 + * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/SchedulePresenter.cpp + */ +#include "AppViewIDs.h" +#include "NativeAbility.h" +#include "common/key_code.h" +#include +#include "UiConfig.h" +#include "schedule/include/SchedulePresenter.h" +#include "schedule/include/ScheduleView.h" +#include "NativeRegisterManager.h" +namespace OHOS +{ + REGIST_MENU_PRO(VIEW_SCHEDULE, ScheduleView, SchedulePresenter, + PNG_APPLIST_SCHEDULE_IMAGE_BIG, PNG_APPLIST_SCHEDULE_IMAGE,PNG_APPLIST_SCHEDULE_IMAGE, "日程", STR_SCHEDULE); + + // 当前Presenter属性实例化的内存指针 + static SchedulePresenter * p_SchedulePresenterInstance = nullptr; + + SchedulePresenter::SchedulePresenter() + { + ScheduleModel_ = &ScheduleModel::GetInstance(); + p_SchedulePresenterInstance = this; + } + + SchedulePresenter::~SchedulePresenter() + { + p_SchedulePresenterInstance = nullptr; + } + + SchedulePresenter *SchedulePresenter::GetInstance() + { + return p_SchedulePresenterInstance; + } + + // 启动时执行的逻辑 + void SchedulePresenter::OnStart() + { + } + + // 页面已经展示后的调用逻辑 + void SchedulePresenter::OnResume(void) + { + Presenter::OnResume(); + if (nullptr == view_) + { + return; + } + + view_->ItemListContentUpdate(); + } + + // 页面准备切换到后台前执行的逻辑 + void SchedulePresenter::OnPause(void) + { + Presenter::OnPause(); + } + + // 页面完全置于后台时的逻辑。 + void SchedulePresenter::OnStop(void) + { + } + + bool SchedulePresenter::OnClick(UIView &view, const ClickEvent &event) + { + UNUSED(event); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:OnClick", __LINE__); + + // if (nullptr == &view) + // { + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:OnClick", __LINE__); + // return false; + // } + + if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_ContentDeleteButton_)) + { + view_->DisplayDeleteScreen(); + return true; + } + if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_ContentCloseButton_)) + { + view_->DisplayDataOrNoScreen(); + return true; + } + + if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_DeleteCancelButton_)) + { + view_->DisplayContentScreen(); + return true; + } + if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_DeleteOKButton_)) + { + ScheduleModel_->ScheduleOriginalDataSetByUI(view_->ContentScreenItemIndexGet() / 2); + view_->ItemListContentUpdate(); + view_->DisplayDataOrNoScreen(); + view_->ItemListScrollByUpdate(); + return true; + } + + ScheduleListItem * item = static_cast(&view); + view_->ContentScreenItemIndexSet(item->GetViewIndex()); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:OnClick,index:%d", __LINE__,item->GetViewIndex()); + view_->DisplayContentScreen(); + + return true; + } + + bool SchedulePresenter::OnDrag(UIView &view, const DragEvent &event) + { + UNUSED(view); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SchedulePresenter::OnDrag"); + if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动 + { + SchedulePresenter::X_DRAG_FLAG = true; + } + return true; + } + + bool SchedulePresenter::OnDragEnd(UIView &view, const DragEvent &event) + { + UNUSED(view); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SchedulePresenter::OnDragEnd"); + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && SchedulePresenter::X_DRAG_FLAG) + { + if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_ContentGroup_)) + { + view_->DisplayDataOrNoScreen(); + return true; + } + if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_DeleteGroup_)) + { + view_->DisplayContentScreen(); + return true; + } + + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + SchedulePresenter::X_DRAG_FLAG = false; + } + return true; + } + + bool SchedulePresenter::OnKeyAct(UIView &view, const KeyEvent &event) // 增加按键事件 + { + UNUSED(view); + // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SchedulePresenter::OnKeyAct"); + uint16_t keyID = event.GetKeyId(); + uint16_t keyState = event.GetState(); + // 如果是power键,且是亮屏状态,按键释放就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + } + return true; + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleView.cpp new file mode 100644 index 000000000..e1d50d889 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleView.cpp @@ -0,0 +1,802 @@ + +#include "schedule/include/ScheduleView.h" +#include "UiConfig.h" +#include "wearable_log.h" + +namespace OHOS +{ + static ScheduleView * p_ScheduleViewInstance = nullptr; + + ScheduleView::ScheduleView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleView::ScheduleView"); + p_ScheduleViewInstance = this; + } + + ScheduleView::~ScheduleView() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleView::~ScheduleView"); + DeinitNoDataScreen(); + DeinitDataScreen(); + DeinitContentScreen(); + DeinitDeleteScreen(); + p_ScheduleViewInstance = nullptr; + } + + ScheduleView * ScheduleView::GetInstance() + { + return p_ScheduleViewInstance; + } + + void ScheduleView::OnStart() + { + ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_NO_DATA] = InitNoDataScreen(); + ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_LIST] = InitDataScreen(); + ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_CONTENT] = InitContentScreen(); + ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_DELETE] = InitDeleteScreen(); + + uint8_t i = 0; + for(i = 0; i < ENUM_SCHEDULE_SCREEN_MAX; i++) + { + if(nullptr != ScreenGroupArray_[i]) + { + AddViewToRootContainer(ScreenGroupArray_[i]); + } + } + + DisplayDataOrNoScreen(); + } + + void ScheduleView::OnStop() + { + + } + + void ScheduleView::DisplaySelectScreen(uint8_t ScreenIndex) + { + if(ENUM_SCHEDULE_SCREEN_MAX <= ScreenIndex) + { + return; + } + + uint8_t i = 0; + for(i = 0; i < ENUM_SCHEDULE_SCREEN_MAX; i++) + { + if(nullptr != ScreenGroupArray_[i]) + { + if(i == ScreenIndex) + { + ScreenGroupArray_[i]->SetVisible(true); + } + else + { + ScreenGroupArray_[i]->SetVisible(false); + } + } + } + } + + void ScheduleView::DisplayDataOrNoScreen(void) + { + if(0 == ScheduleModel::GetInstance().ScheduleItemDataCountGet()) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:DisplayMainScreen", __LINE__); + DisplaySelectScreen(ENUM_SCHEDULE_SCREEN_NO_DATA); + } + else + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:DisplayMainScreen", __LINE__); + DisplaySelectScreen(ENUM_SCHEDULE_SCREEN_LIST); + + ResetScheduleList(); + SetViewFocus(true);//列表获取聚焦 + ScheduleList_->RefreshList(); + } + } + + void ScheduleView::DisplayContentScreen(void) + { + DisplaySelectScreen(ENUM_SCHEDULE_SCREEN_CONTENT); + SetViewFocus(false);//数据显示视图获取聚焦 + + uint8_t index = ContentScreenItemIndexGet(); + ContentDateLabelExt_->SetText(ScheduleModel::GetInstance().ScheduleItemDataDateStrGet(index).c_str()); + + int16_t temp_y = 0; + temp_y = ContentDateLabelExt_->GetY() + ContentDateLabelExt_->GetHeight() + 50; + ContentTopicLabelExt_->SetY(temp_y); + ContentTopicLabelExt1_->SetY(temp_y); + ContentTopicLabelExt1_->SetText(ScheduleModel::GetInstance().ScheduleItemDataTopicStrGet(index).c_str()); + + temp_y = ContentTopicLabelExt_->GetY() + ContentTopicLabelExt_->GetHeight() + 20; + ContentTimeLabelExt_->SetY(temp_y); + ContentTimeLabelExt1_->SetY(temp_y); + ContentTimeLabelExt1_->SetText(ScheduleModel::GetInstance().ScheduleItemDataTimeStrGet(index).c_str()); + + if(true == ScheduleModel::GetInstance().ScheduleItemDataContentStrGet(index).empty()) + { + ContentContentLabelExt_->SetVisible(false); + ContentContentLabelExt1_->SetVisible(false); + + temp_y = ContentTimeLabelExt_->GetY() + ContentTimeLabelExt_->GetHeight() + 50; + ContentDeleteButton_->SetY(temp_y); + } + else + { + ContentContentLabelExt_->SetVisible(true); + ContentContentLabelExt1_->SetVisible(true); + + temp_y = ContentTimeLabelExt_->GetY() + ContentTimeLabelExt_->GetHeight() + 20; + ContentContentLabelExt_->SetY(temp_y); + ContentContentLabelExt1_->SetY(temp_y); + ContentContentLabelExt1_->SetText(ScheduleModel::GetInstance().ScheduleItemDataContentStrGet(index).c_str()); + + temp_y = ContentContentLabelExt1_->GetY() + ContentContentLabelExt1_->GetHeight() + 50; + ContentDeleteButton_->SetY(temp_y); + } + + temp_y = ContentDeleteButton_->GetY() + ContentDeleteButton_->GetHeight() + 20; + ContentCloseButton_->SetY(temp_y); + } + + void ScheduleView::DisplayDeleteScreen(void) + { + DisplaySelectScreen(ENUM_SCHEDULE_SCREEN_DELETE); + } + + void ScheduleView::DeinitNoDataScreen() + { + if (nullptr != NoDataGroup_) + { + NoDataGroup_->RemoveAll(); + if (nullptr != LabelExt0_) + { + delete LabelExt0_; + LabelExt0_ = nullptr; + } + if (nullptr != ImageView_) + { + delete ImageView_; + ImageView_ = nullptr; + } + if (nullptr != LabelExt1_) + { + delete LabelExt1_; + LabelExt1_ = nullptr; + } + if (nullptr != LabelExt2_) + { + delete LabelExt2_; + LabelExt2_ = nullptr; + } + + delete NoDataGroup_; + NoDataGroup_ = nullptr; + } + } + + UIViewGroup * ScheduleView::InitNoDataScreen() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]", __LINE__); + if(nullptr == NoDataGroup_) + { + NoDataGroup_ = new UIViewGroup(); + if(nullptr == NoDataGroup_) + return nullptr; + + NoDataGroup_->SetPosition(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + NoDataGroup_->SetViewId(SCHEDULE_ViewId_NoDataGroup_); + NoDataGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + NoDataGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); + NoDataGroup_->SetOnDragListener(presenter_); + NoDataGroup_->SetTouchable(true); + NoDataGroup_->SetDraggable(true); + + if(nullptr == LabelExt0_) + { + LabelExt0_ = InitLabel(83, 50, 300, 35, 35, 30, STR_SCHEDULE_TITLE, Color::White().full); + if(nullptr == LabelExt0_) + { + return nullptr; + } + } + + if(nullptr == ImageView_) + { + ImageView_ = new UIImageView(); + if(nullptr == ImageView_) + { + return nullptr; + } + + ImageView_->SetPosition(175, 150, 116, 120); + ImageView_->SetSrc(NO_DATA_IMAGE); + } + + if(nullptr == LabelExt1_) + { + LabelExt1_ = InitLabel(53, 330, 360, 35, 35, 30, STR_SCHEDULE_NO_DATA, 0xff999999); + if(nullptr == LabelExt1_) + { + return nullptr; + } + } + + if(nullptr == LabelExt2_) + { + LabelExt2_ = InitLabel(53, 370, 360, 35, 35, 30, STR_SCHEDULE_NO_DATA_PROMPT, 0xff999999); + if(nullptr == LabelExt2_) + { + return nullptr; + } + } + + NoDataGroup_->Add(LabelExt0_); + NoDataGroup_->Add(ImageView_); + NoDataGroup_->Add(LabelExt1_); + NoDataGroup_->Add(LabelExt2_); + } + + return NoDataGroup_; + } + + void ScheduleView::DeinitDataScreen() + { + if (nullptr != DataGroup_) + { + DataGroup_->RemoveAll(); + if (nullptr != ScheduleListAdapter_) + { + delete ScheduleListAdapter_; + ScheduleListAdapter_ = nullptr; + } + if (nullptr != ScheduleList_) + { + delete ScheduleList_; + ScheduleList_ = nullptr; + } + + delete DataGroup_; + DataGroup_ = nullptr; + } + } + + UIViewGroup * ScheduleView::InitDataScreen() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]", __LINE__); + if(nullptr == DataGroup_) + { + DataGroup_ = new UIViewGroup(); + if(nullptr == DataGroup_) + return nullptr; + + DataGroup_->SetPosition(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + DataGroup_->SetViewId(SCHEDULE_ViewId_DataGroup_); + DataGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + DataGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); + DataGroup_->SetOnDragListener(presenter_); + DataGroup_->SetTouchable(true); + DataGroup_->SetDraggable(true); + + if(nullptr == ScheduleListAdapter_) + { + ScheduleListAdapter_ = new ScheduleListAdapter(); + if(nullptr == ScheduleListAdapter_) + return nullptr; + + ScheduleListAdapter_->SetItemClickListener(presenter_); + } + + if(nullptr == ScheduleList_) + { + ScheduleList_ = new UIList(); + if(nullptr == ScheduleList_) + { + return nullptr; + } + } + ScheduleList_->SetPosition(LIST_LEFT, LIST_TOP, LIST_WIDTH, LIST_HEIGHT); + // ScheduleList_->SetSelectPosition(VERTICAL_RESOLUTION / 2); + ScheduleList_->SetDraggable(true); + ScheduleList_->SetThrowDrag(true); + // ScheduleList_->EnableAutoAlign(true); + ScheduleList_->SetAdapter(ScheduleListAdapter_); + // ScheduleList_->SetScrollStateListener(presenter_); + ScheduleList_->SetMaxScrollDistance(1000); // 1000: max scroll distance + ScheduleList_->SetSwipeACCLevel(200); // 800: compensation distance + ScheduleList_->SetDragACCLevel(5); // 5: drag acceleration + ScheduleList_->SetYScrollBarVisible(false); + + // ScheduleList_->SetScrollBlankSize(40); + ScheduleList_->SetReboundSize(30); + + ScheduleList_->SetRotateFactor(2); // 增加表冠控制 + ScheduleList_->RequestFocus(); + ResetScheduleList(); + + DataGroup_->Add(ScheduleList_); + } + + return DataGroup_; + } + + void ScheduleView::DeinitContentScreen() + { + if(nullptr != ContentGroup_) + { + ContentGroup_->RemoveAll(); + if(nullptr != ContentDateLabelExt_) + { + delete ContentDateLabelExt_; + ContentDateLabelExt_ = nullptr; + } + if(nullptr != ContentTopicLabelExt_) + { + delete ContentTopicLabelExt_; + ContentTopicLabelExt_ = nullptr; + } + if(nullptr != ContentTopicLabelExt1_) + { + delete ContentTopicLabelExt1_; + ContentTopicLabelExt1_ = nullptr; + } + if(nullptr != ContentTimeLabelExt_) + { + delete ContentTimeLabelExt_; + ContentTimeLabelExt_ = nullptr; + } + if(nullptr != ContentTimeLabelExt1_) + { + delete ContentTimeLabelExt1_; + ContentTimeLabelExt1_ = nullptr; + } + if(nullptr != ContentContentLabelExt_) + { + delete ContentContentLabelExt_; + ContentContentLabelExt_ = nullptr; + } + if(nullptr != ContentContentLabelExt1_) + { + delete ContentContentLabelExt1_; + ContentContentLabelExt1_ = nullptr; + } + if(nullptr != ContentDeleteButton_) + { + delete ContentDeleteButton_; + ContentDeleteButton_ = nullptr; + } + if(nullptr != ContentCloseButton_) + { + delete ContentCloseButton_; + ContentCloseButton_ = nullptr; + } + + delete ContentGroup_; + ContentGroup_ = nullptr; + } + } + + UIScrollView * ScheduleView::InitContentScreen() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]", __LINE__); + if(nullptr == ContentGroup_) + { + ContentGroup_ = new UIScrollView(); + if(nullptr == ContentGroup_) + return nullptr; + + // ContentGroup_->SetViewIndex(ENUM_SCHEDULE_CONTENT_SCREEN); + ContentGroup_->SetPosition(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + ContentGroup_->SetViewId(SCHEDULE_ViewId_ContentGroup_); + ContentGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + ContentGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); + ContentGroup_->SetOnDragListener(presenter_); + ContentGroup_->SetTouchable(true); + ContentGroup_->SetDraggable(true); + + ContentGroup_->SetScrollBlankSize(40); + ContentGroup_->SetReboundSize(40); + ContentGroup_->SetDirection(1); + ContentGroup_->SetMaxScrollDistance(1000); + ContentGroup_->SetThrowDrag(true); + // ContentGroup_->RequestFocus(); + ContentGroup_->SetRotateFactor(2); + + if(nullptr == ContentDateLabelExt_) + { + ContentDateLabelExt_ = new UILabelExt(); + if(nullptr == ContentDateLabelExt_) + return nullptr; + + ContentDateLabelExt_->SetPosition(83, 50, 300, 35); + ContentDateLabelExt_->SetStyle(STYLE_TEXT_FONT, 30); + ContentDateLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35); + // ContentDateLabelExt_->SetTextId(text_id); + ContentDateLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + ContentDateLabelExt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + ContentDateLabelExt_->SetRollSpeed(23); + ContentDateLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentDateLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xffff5a36); + } + + if(nullptr == ContentTopicLabelExt_) + { + ContentTopicLabelExt_ = new UILabelExt(); + if(nullptr == ContentTopicLabelExt_) + return nullptr; + + ContentTopicLabelExt_->SetPosition(53, 0, 360, 35); + ContentTopicLabelExt_->SetStyle(STYLE_TEXT_FONT, 30); + ContentTopicLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35); + ContentTopicLabelExt_->SetTextId(STR_SCHEDULE_TOPIC); + // ContentTopicLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + ContentTopicLabelExt_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP); + ContentTopicLabelExt_->SetRollSpeed(23); + ContentTopicLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentTopicLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xff999999); + + if(nullptr == ContentTopicLabelExt1_) + { + ContentTopicLabelExt1_ = new UILabelExt(); + if(nullptr == ContentTopicLabelExt1_) + return nullptr; + + uint16 x = ContentTopicLabelExt_->GetX(); + uint16 w = ContentTopicLabelExt_->GetTextWidth(); + ContentTopicLabelExt1_->SetPosition(x + w + 5, 0, 360 - w - 5, 35); + ContentTopicLabelExt1_->SetStyle(STYLE_TEXT_FONT, 30); + ContentTopicLabelExt1_->SetStyle(STYLE_LINE_HEIGHT, 35); + ContentTopicLabelExt1_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + ContentTopicLabelExt1_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP); + ContentTopicLabelExt1_->SetRollSpeed(23); + ContentTopicLabelExt1_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentTopicLabelExt1_->SetStyle(STYLE_TEXT_COLOR, Color::White().full); + } + } + + if(nullptr == ContentTimeLabelExt_) + { + ContentTimeLabelExt_ = new UILabelExt(); + if(nullptr == ContentTimeLabelExt_) + return nullptr; + + ContentTimeLabelExt_->SetPosition(53, 0, 360, 35); + ContentTimeLabelExt_->SetStyle(STYLE_TEXT_FONT, 30); + ContentTimeLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35); + ContentTimeLabelExt_->SetTextId(STR_SCHEDULE_TIME); + // ContentTimeLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + ContentTimeLabelExt_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP); + ContentTimeLabelExt_->SetRollSpeed(23); + ContentTimeLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentTimeLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xff999999); + + if(nullptr == ContentTimeLabelExt1_) + { + ContentTimeLabelExt1_ = new UILabelExt(); + if(nullptr == ContentTimeLabelExt1_) + return nullptr; + + uint16 x = ContentTimeLabelExt_->GetX(); + uint16 w = ContentTimeLabelExt_->GetTextWidth(); + ContentTimeLabelExt1_->SetPosition(x + w + 5, 0, 360 - w - 5, 35); + ContentTimeLabelExt1_->SetStyle(STYLE_TEXT_FONT, 30); + ContentTimeLabelExt1_->SetStyle(STYLE_LINE_HEIGHT, 35); + ContentTimeLabelExt1_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + ContentTimeLabelExt1_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP); + ContentTimeLabelExt1_->SetRollSpeed(23); + ContentTimeLabelExt1_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentTimeLabelExt1_->SetStyle(STYLE_TEXT_COLOR, Color::White().full); + } + } + + if(nullptr == ContentContentLabelExt_) + { + ContentContentLabelExt_ = new UILabelExt(); + if(nullptr == ContentContentLabelExt_) + return nullptr; + + ContentContentLabelExt_->SetPosition(53, 0, 360, 35); + ContentContentLabelExt_->SetStyle(STYLE_TEXT_FONT, 30); + ContentContentLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35); + ContentContentLabelExt_->SetTextId(STR_SCHEDULE_NOTES); + // ContentContentLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); + ContentContentLabelExt_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP); + ContentContentLabelExt_->SetRollSpeed(23); + ContentContentLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentContentLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xff999999); + + if(nullptr == ContentContentLabelExt1_) + { + ContentContentLabelExt1_ = new UILabelExt(); + if(nullptr == ContentContentLabelExt1_) + return nullptr; + + uint16 x = ContentContentLabelExt_->GetX(); + uint16 w = ContentContentLabelExt_->GetTextWidth(); + ContentContentLabelExt1_->SetPosition(x + w + 5, 0, 360 - w - 5, 35); + ContentContentLabelExt1_->SetStyle(STYLE_TEXT_FONT, 30); + ContentContentLabelExt1_->SetStyle(STYLE_LINE_HEIGHT, 35); + ContentContentLabelExt1_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); + ContentContentLabelExt1_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP); + ContentContentLabelExt1_->SetRollSpeed(23); + ContentContentLabelExt1_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentContentLabelExt1_->SetStyle(STYLE_TEXT_COLOR, Color::White().full); + } + } + + if(nullptr == ContentDeleteButton_) + { + ContentDeleteButton_ = new UILabelButtonExt(); + if(nullptr == ContentDeleteButton_) + return nullptr; + + ContentDeleteButton_->SetPosition(93, 0, 280, 90); + ContentDeleteButton_->SetViewId(SCHEDULE_ViewId_ContentDeleteButton_); + ContentDeleteButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xfffd5213); + ContentDeleteButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + ContentDeleteButton_->SetStyle(STYLE_BORDER_RADIUS, 100); + ContentDeleteButton_->SetTextId(STR_DELETE); + ContentDeleteButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentDeleteButton_->SetStyle(STYLE_LINE_HEIGHT, 35); + ContentDeleteButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xfffd5213, UIButton::PRESSED); + ContentDeleteButton_->SetOnClickListener(presenter_); + } + + if(nullptr == ContentCloseButton_) + { + ContentCloseButton_ = new UILabelButtonExt(); + if(nullptr == ContentCloseButton_) + return nullptr; + + ContentCloseButton_->SetPosition(93, 0, 280, 90); + ContentCloseButton_->SetViewId(SCHEDULE_ViewId_ContentCloseButton_); + ContentCloseButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919); + ContentCloseButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + ContentCloseButton_->SetStyle(STYLE_BORDER_RADIUS, 100); + ContentCloseButton_->SetTextId(STR_CLOSE); + ContentCloseButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + ContentCloseButton_->SetStyle(STYLE_LINE_HEIGHT, 35); + ContentCloseButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff191919, UIButton::PRESSED); + ContentCloseButton_->SetOnClickListener(presenter_); + } + + ContentGroup_->Add(ContentDateLabelExt_); + ContentGroup_->Add(ContentTopicLabelExt_); + ContentGroup_->Add(ContentTopicLabelExt1_); + ContentGroup_->Add(ContentTimeLabelExt_); + ContentGroup_->Add(ContentTimeLabelExt1_); + ContentGroup_->Add(ContentContentLabelExt_); + ContentGroup_->Add(ContentContentLabelExt1_); + ContentGroup_->Add(ContentDeleteButton_); + ContentGroup_->Add(ContentCloseButton_); + } + + return ContentGroup_; + } + + void ScheduleView::DeinitDeleteScreen() + { + if(nullptr != DeleteGroup_) + { + DeleteGroup_->RemoveAll(); + if(nullptr != DeleteTitleLabelExt_) + { + delete DeleteTitleLabelExt_; + DeleteTitleLabelExt_ = nullptr; + } + if(nullptr != DeletePromptLabelExt_) + { + delete DeletePromptLabelExt_; + DeletePromptLabelExt_ = nullptr; + } + if(nullptr != DeleteCancelButton_) + { + delete DeleteCancelButton_; + DeleteCancelButton_ = nullptr; + } + if(nullptr != DeleteOKButton_) + { + delete DeleteOKButton_; + DeleteOKButton_ = nullptr; + } + + delete DeleteGroup_; + DeleteGroup_ = nullptr; + } + } + + UIViewGroup * ScheduleView::InitDeleteScreen() + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]", __LINE__); + if(nullptr == DeleteGroup_) + { + DeleteGroup_ = new UIViewGroup(); + if(nullptr == DeleteGroup_) + return nullptr; + + DeleteGroup_->SetPosition(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); + DeleteGroup_->SetViewId(SCHEDULE_ViewId_DeleteGroup_); + DeleteGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE); + DeleteGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full); + DeleteGroup_->SetTouchable(true); + DeleteGroup_->SetDraggable(true); + DeleteGroup_->SetOnDragListener(presenter_); + + if(nullptr == DeleteTitleLabelExt_) + { + DeleteTitleLabelExt_ = new UILabelExt(); + if(nullptr == DeleteTitleLabelExt_) + return nullptr; + + DeleteTitleLabelExt_->SetPosition(83, 50, 300, 35); + DeleteTitleLabelExt_->SetStyle(STYLE_TEXT_FONT, 30); + DeleteTitleLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35); + DeleteTitleLabelExt_->SetTextId(STR_DELETE); + DeleteTitleLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + DeleteTitleLabelExt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + DeleteTitleLabelExt_->SetRollSpeed(23); + DeleteTitleLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + DeleteTitleLabelExt_->SetStyle(STYLE_TEXT_COLOR, Color::White().full); + } + + if(nullptr == DeletePromptLabelExt_) + { + DeletePromptLabelExt_ = new UILabelExt(); + if(nullptr == DeletePromptLabelExt_) + return nullptr; + + DeletePromptLabelExt_->SetPosition(98, 187, 270, 35); + DeletePromptLabelExt_->SetStyle(STYLE_TEXT_FONT, 30); + DeletePromptLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35); + DeletePromptLabelExt_->SetTextId(STR_SCHEDULE_DELETE_PROMPT); + DeletePromptLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); + DeletePromptLabelExt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + DeletePromptLabelExt_->SetRollSpeed(23); + DeletePromptLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + DeletePromptLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xff999999); + } + + if(nullptr == DeleteCancelButton_) + { + DeleteCancelButton_ = new UILabelButtonExt(); + if(nullptr == DeleteCancelButton_) + return nullptr; + + DeleteCancelButton_->SetPosition(111, 299, 100, 100); + DeleteCancelButton_->SetViewId(SCHEDULE_ViewId_DeleteCancelButton_); + DeleteCancelButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + DeleteCancelButton_->SetStyle(STYLE_BACKGROUND_OPA, 25); // 10% + DeleteCancelButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffffff, UIButton::PRESSED); + DeleteCancelButton_->SetStyleForState(STYLE_BACKGROUND_OPA, 25, UIButton::PRESSED); + DeleteCancelButton_->SetStyle(STYLE_BORDER_RADIUS, 100); + DeleteCancelButton_->SetImagePosition(0, 0); + DeleteCancelButton_->SetImageSrc(PNG_SYSTEM_CHECK_OFF_IMAGE, PNG_SYSTEM_CHECK_OFF_IMAGE); + DeleteCancelButton_->SetOnClickListener(presenter_); + } + + if(nullptr == DeleteOKButton_) + { + DeleteOKButton_ = new UILabelButtonExt(); + if(nullptr == DeleteOKButton_) + return nullptr; + + DeleteOKButton_->SetPosition(256, 299, 100, 100); + DeleteOKButton_->SetViewId(SCHEDULE_ViewId_DeleteOKButton_); + DeleteOKButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff); + DeleteOKButton_->SetStyle(STYLE_BACKGROUND_OPA, 25); // 10% + DeleteOKButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffffff, UIButton::PRESSED); + DeleteOKButton_->SetStyleForState(STYLE_BACKGROUND_OPA, 25, UIButton::PRESSED); + DeleteOKButton_->SetStyle(STYLE_BORDER_RADIUS, 100); + DeleteOKButton_->SetImagePosition(0, 0); + DeleteOKButton_->SetImageSrc(PNG_SYSTEM_CHECK_ON_IMAGE, PNG_SYSTEM_CHECK_ON_IMAGE); + DeleteOKButton_->SetOnClickListener(presenter_); + } + + DeleteGroup_->Add(DeleteTitleLabelExt_); + DeleteGroup_->Add(DeletePromptLabelExt_); + DeleteGroup_->Add(DeleteCancelButton_); + DeleteGroup_->Add(DeleteOKButton_); + } + + return DeleteGroup_; + } + + UILabelExt * ScheduleView::InitLabel(int16_t x, int16_t y, int16_t width, int16_t height, + uint16_t line_height, uint8_t font_size, uint16_t text_id, uint32_t text_color) + { + UILabelExt * LabelExt = new UILabelExt(); + if(nullptr == LabelExt) + { + return nullptr; + } + + LabelExt->SetPosition(x, y, width, height); + LabelExt->SetStyle(STYLE_TEXT_FONT, font_size); + LabelExt->SetStyle(STYLE_LINE_HEIGHT, line_height); + LabelExt->SetTextId(text_id); + LabelExt->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); + LabelExt->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + LabelExt->SetRollSpeed(23); + LabelExt->SetFont(DEFAULT_VECTOR_FONT_FILENAME, font_size); + LabelExt->SetStyle(STYLE_TEXT_COLOR, text_color); + + return LabelExt; + } + + void ScheduleView::ContentScreenItemIndexSet(uint8_t index) + { + ContentItemIndex_ = index; + } + + uint8_t ScheduleView::ContentScreenItemIndexGet(void) + { + return ContentItemIndex_; + } + + void ScheduleView::ItemListAdd(const ScheduleListItemInfo &item) + { + ScheduleListAdapter_->AddListItem(item); + } + + void ScheduleView::ItemListClear(void) + { + ScheduleListAdapter_->ClearListItem(); + } + + void ScheduleView::ItemListContentUpdate(void) + { + uint8_t ItemCount = ScheduleModel::GetInstance().ScheduleItemDataCountGet(); + if(0 != ItemCount) + { + ItemListClear(); + ScheduleListItemInfo * ItemInfo = ScheduleModel::GetInstance().ScheduleAllItemDataGet(); + for (uint8_t i = 0; i < ItemCount; i++) + { + ItemListAdd(ItemInfo[i]); + } + } + } + + /// @brief 列表滚动更新 + /// @param isUpScroll true 向上滚动,反之向下滚动 + void ScheduleView::ItemListScrollByUpdate(bool isUpScroll) + { + if(ScheduleList_) + { + ScheduleList_->ScrollBy(isUpScroll ? -240 : 240); + } + } + + void ScheduleView::ResetScheduleList(void) + { + if(ScheduleListAdapter_ == nullptr || ScheduleList_== nullptr) + { + return; + } + + if(ScheduleListAdapter_->GetCount() > 2) + { + ScheduleList_->SetReboundSize(30); + } + else + { + ScheduleList_->SetReboundSize(0); + } + } + + void ScheduleView::SetViewFocus(bool val) + { + if(!ContentGroup_ || !ScheduleList_) + { + return; + } + if(val) + { + ScheduleList_->RequestFocus(); + } + else + { + ContentGroup_->RequestFocus(); + } + } +} \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosModel.h new file mode 100644 index 000000000..6fc9522c5 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosModel.h @@ -0,0 +1,28 @@ + +/*** + * @Date: 2024-05-09 17:46:43 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-05-09 18:04:51 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/include/TakephotosModel.h + */ + +#ifndef Takephotos_MODEL_H +#define Takephotos_MODEL_H +#include "TakephotosView.h" +namespace OHOS +{ + class TakephotosModel + { + public: + TakephotosModel(); + ~TakephotosModel(); + static TakephotosModel *GetInstance(void); + void Init(); + void SetPopStaust(PopupPhoto status); + PopupPhoto GetPopStaust(); + + private: + PopupPhoto popupStatus = PopupPhoto::CreamPopup; + }; +} +#endif \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosPresenter.h new file mode 100644 index 000000000..5353abf6d --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosPresenter.h @@ -0,0 +1,35 @@ +#ifndef _Takephotos_PRESENTER_H +#define _Takephotos_PRESENTER_H + +#include "Presenter.h" +#include "TakephotosView.h" +#include "common/key_code.h" + +namespace OHOS +{ + class TakephotosView; + + class TakephotosPresenter : public Presenter, + public UIView::OnClickListener, + public RootView::OnKeyActListener, + public UIView::OnDragListener + { + public: + TakephotosPresenter(); + virtual ~TakephotosPresenter(); + + void OnStart() override; + void OnPause() override; + void OnResume() override; + void OnStop() override; + static TakephotosPresenter *GetInstance(); + + private: + // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承; + bool OnClick(UIView &view, const ClickEvent &event) override; + bool OnDrag(UIView &view, const DragEvent &event) override; + bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件 + }; +} // namespace OHOS + +#endif // SLEEPDETAIL_PRESENTER_H \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosView.h new file mode 100644 index 000000000..5107e1dc5 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosView.h @@ -0,0 +1,96 @@ +/*** + * @Date: 2024-05-08 16:11:48 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-05-08 18:11:27 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/include/TakephotosView.h + */ +#ifndef _Takephotos_VIEW_H +#define _Takephotos_VIEW_H + + +#include "View.h" +#include "components/ui_scroll_view.h" +#include "components/ui_view_group.h" +#include "components/ui_label.h" +#include "components/ui_label_ext.h" +#include "components/ui_image_view.h" +#include "components/ui_button.h" +#include "components/ui_image_animator.h" +#include "components/ui_label_button_ext.h" +#include "components/ui_chart.h" +#include "components/ui_list.h" +#include "components/icon_adapter.h" +#include "wearable_log.h" +#include "ohos_types.h" +#include "components/ui_card_page.h" +#include "uicomponents/UIComponents.h" +#include "TakephotosPresenter.h" + +#ifdef FD230_650 +#include "traing/include/TraingModel.h" +#include "traing/Training_UiConfig.h" +#endif + +namespace OHOS +{ +#define BUTTONGO "button_go" +#define BUTTONTAKE "button_take" + + enum class PopupPhoto + { + CreamPopup, + TakePopup + }; + + class TakephotosPresenter; + class TakephotosView : public View + { + public: + TakephotosView(); + virtual ~TakephotosView(); + static TakephotosView *GetInstance(void); + + void OnStart() override; + void OnStop() override; + void InitView(); + void DeInit(); + void PreLoad(void); + + void ShowCreamView(); + void ShowTakeView(); + void SetPopupViewStatus(PopupPhoto view, bool status); + UILabel *GetClileLabel(); + void Updatenum(int num); + + private: + UIView::OnDragListener *draglistener{nullptr}; + TakephotosView(TakephotosView &&) = delete; + TakephotosView &operator=(TakephotosView &&) = delete; + UIScrollView *scrollview_ = nullptr; + + /*拍照提醒界面*/ + UIScrollView *creamView{nullptr}; + UILabelExt *labeltitle_ = nullptr; + UILabelExt *labelnote_ = nullptr; + UILabelButtonExt *buttongo = nullptr; + UIImageAnimatorView *creamAnimator{nullptr}; + + /*拍照界面*/ + UIScrollView *takeView{nullptr}; + UILabelExt *labeltake_ = nullptr; + UILabelExt *labelclick_ = nullptr; + UILabelButtonExt *buttontake = nullptr; + UIImageAnimatorView *smileAnimator{nullptr}; + + bool viewiInitStatus{false}; + + std::string creambasePath = "/user/res/takephotos/cream/"; + const ImageInfo **creamimageInfos; + ImageAnimatorInfo *creamimageAnimatorInfo{nullptr}; + + std::string smilebasePath = "/user/res/takephotos/cream/"; + const ImageInfo **smileimageInfos; + ImageAnimatorInfo *smileimageAnimatorInfo{nullptr}; + }; +} // namespace OHOS +#endif // Takephotos_PRESENTER_H diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosModel.cpp new file mode 100644 index 000000000..d9e41dca4 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosModel.cpp @@ -0,0 +1,180 @@ +/*** + * @Date: 2024-07-06 16:27:31 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-07-15 20:30:24 + * @FilePath: + * /FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp + */ +/*** + * @Date: 2024-05-09 17:46:58 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-05-09 18:05:27 + * @FilePath: + * /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp + */ + +#include "takephotos/include/TakephotosModel.h" +#include "AppViewIDs.h" +#include "NativeAbility.h" +#include "broadcast_feature.h" +#include "broadcast_service.h" +#include "custom_utils.h" +#include "samgr_lite.h" +#include "takephotos/include/TakephotosView.h" +#include "thread_adapter.h" + +#include "wearable_log.h" +#include +#include + +#ifdef SUPPORT_BLE_SERVICE +#include "bleEvent.h" +#endif + +#ifdef FD230_650 +#include "vibrator_service.h" +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + static void Notify(void *args, const Topic topic, Request *request); + + using namespace OHOS; + + Subscriber TakephotosSubscirber = { + .identity = NULL, + .args = NULL, + .Notify = Notify, + }; + void TakephotosSubscribeTopic(Topic topic) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "stepsubscribeTopic, topic=%u", topic); + BroadcastApi *broadcastApi = NULL; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, + BROADCAST_FEATURE_NAME); + if (api == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "stepsubscribeTopic, GetFeatureApi failed"); + return; + } + int result = + api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "stepsubscribeTopic, QueryInterface failed"); + return; + } + broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic, + &TakephotosSubscirber); + broadcastApi->Release((IUnknown *)broadcastApi); + } + + void TakephotosUnsubscribeTopic(Topic topic) + { + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TakephotosUnsubscribeTopic, topic=%u", + topic); + BroadcastApi *broadcastApi = NULL; + IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME, + BROADCAST_FEATURE_NAME); + if (api == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "TakephotosUnsubscribeTopic, GetFeatureApi failed"); + return; + } + int result = + api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi); + if (result != 0 || broadcastApi == NULL) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, + "TakephotosUnsubscribeTopic, QueryInterface failed"); + return; + } + broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic, + &TakephotosSubscirber); + broadcastApi->Release((IUnknown *)broadcastApi); + } + + static void Notify(void *args, const Topic topic, Request *request) + { + UNUSED(args); + UNUSED(topic); + if (request == NULL) + { + return; + } + // 进入拍照界面 + if (request->msgId == TOPIC_EVENT_ENTER_CMAERA) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " 遥控拍照 \r\n"); + uapi_set_screen_on_api(); // 亮屏 + TakephotosModel::GetInstance()->SetPopStaust(PopupPhoto::TakePopup); + // 获取当前界面Id + int16_t curviewid = OHOS::NativeAbility::GetInstance().GetCurSliceId(); + // 已经处于遥控拍照界面 + if (curviewid == VIEW_TAKEPHOTOS) + { + NativeAbility::GetInstance().ChangeSlice(VIEW_TAKEPHOTOS); + } + else + { + NativeAbility::GetInstance().EnterSlice(VIEW_TAKEPHOTOS); + } + } + // 退出拍照 + if (request->msgId == TOPIC_EVENT_CANCEL_CMAERA) + { + // 获取当前界面Id + int16_t curviewid = OHOS::NativeAbility::GetInstance().GetCurSliceId(); + // 已经处于遥控拍照界面 + if (curviewid == VIEW_TAKEPHOTOS) + { + // 点亮屏幕 + uapi_set_screen_on_api(); + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); +#ifdef SUPPORT_BLE_SERVICE + cameraSend(3); +#endif + TakephotosModel::GetInstance()->SetPopStaust(PopupPhoto::CreamPopup); + } + } + } +#ifdef __cplusplus +} +#endif + +namespace OHOS +{ + TakephotosModel ::TakephotosModel() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TakephotosModel::TakephotosModel()"); + // sportdata->Initialize(); // 初始化结构体 + } + TakephotosModel ::~TakephotosModel() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TakephotosModel::~TakephotosModel()"); + TakephotosUnsubscribeTopic(TOPIC_EVENT_ENTER_CMAERA); // 取消订阅 + TakephotosUnsubscribeTopic(TOPIC_EVENT_CANCEL_CMAERA); + } + TakephotosModel *TakephotosModel::GetInstance(void) + { + static TakephotosModel instance; + return &instance; + } + + void TakephotosModel ::Init() + { + TakephotosSubscribeTopic(TOPIC_EVENT_ENTER_CMAERA); // 进行消息订阅 + TakephotosSubscribeTopic(TOPIC_EVENT_CANCEL_CMAERA); + } + + // 设置弹窗状态 + void TakephotosModel ::SetPopStaust(PopupPhoto status) { popupStatus = status; } + + // 获取弹窗状态 + PopupPhoto TakephotosModel ::GetPopStaust() { return popupStatus; } +} // namespace OHOS \ No newline at end of file diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosPresenter.cpp new file mode 100644 index 000000000..b99e34f94 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosPresenter.cpp @@ -0,0 +1,136 @@ +/*** + * @Date: 2024-05-08 16:14:06 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-05-08 18:06:25 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosPresenter.cpp + */ +#include "AppViewIDs.h" +#include "components/ui_label_ext.h" +#include "ui_resource_string.h" +#include "NativeAbility.h" + +#include +#include +#include + +#include "uicomponents/UIComponents.h" +#include "common/key_code.h" +#include "KeyInputListener.h" +#include "custom_utils.h" +#include "takephotos/include/TakephotosPresenter.h" +#include "takephotos/include/TakephotosModel.h" +#include "gfx_utils/mem_check.h" +// #include "TakephotosView.h" +#include "NativeRegisterManager.h" +#ifdef SUPPORT_BLE_SERVICE +#include "bleEvent.h" +#endif + +namespace OHOS +{ + + REGIST_MENU_PRO(VIEW_TAKEPHOTOS, TakephotosView, TakephotosPresenter, + PNG_APPLIST_TACKEPHOTOS_IMAGE_BIG, PNG_APPLIST_TACKEPHOTOS_IMAGE, PNG_APPLIST_TACKEPHOTOS_IMAGE, "遥控拍照", STR_REMOTE_SHOOTING); + // 当前Presenter属性实例化的内存指针 + static TakephotosPresenter *g_pTakephotosPresenter = nullptr; + int TakePhotosNum = 0; + + TakephotosPresenter::TakephotosPresenter() + { +#ifdef MEM_CHECK + MemCheck::GetInstance()->EnableLeakCheck(true); +#endif + } + + TakephotosPresenter::~TakephotosPresenter() + { + g_pTakephotosPresenter = nullptr; +#ifdef MEM_CHECK + MemCheck::GetInstance()->EnableLeakCheck(false); +#endif + } + + TakephotosPresenter *TakephotosPresenter::GetInstance() + { + return g_pTakephotosPresenter; + } + + void TakephotosPresenter::OnStart() + { + } + + void TakephotosPresenter::OnPause(void) + { + Presenter::OnPause(); + } + + void TakephotosPresenter::OnResume(void) + { + Presenter::OnResume(); + } + + void TakephotosPresenter::OnStop(void) + { + TakePhotosNum = 0; + } + + bool TakephotosPresenter::OnDrag(UIView &view, const DragEvent &event) + { + if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && + (event.GetDeltaX() > 20) && (event.GetDeltaX() > (2 * MATH_ABS(event.GetDeltaY())))) + { + + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + + /*如果是拍照界面需要发送拍照结束的消息*/ + if (TakephotosModel::GetInstance()->GetPopStaust() == PopupPhoto::TakePopup) + { + // 设置状态为 cream + TakephotosModel::GetInstance()->SetPopStaust(PopupPhoto::CreamPopup); +#ifdef SUPPORT_BLE_SERVICE + cameraSend(3); +#endif + } + } + return true; + } + + bool TakephotosPresenter::OnClick(UIView &view, const ClickEvent &event) + { + // 返回按键 + if (strcmp(view.GetViewId(), BUTTONGO) == 0) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + return true; + } + if (strcmp(view.GetViewId(), BUTTONTAKE) == 0) + { + TakePhotosNum++; +#ifdef SUPPORT_BLE_SERVICE + cameraSend(2); // 进行拍照操作 +#endif + TakephotosView::GetInstance()->Updatenum(TakePhotosNum); // 计数 + } + return true; + } + + bool TakephotosPresenter::OnKeyAct(UIView &view, const KeyEvent &event) + { + unsigned short keyID = event.GetKeyId(); + unsigned short keyState = event.GetState(); + // 如果是power键,且是亮屏状态,按键释放就返回上一级 + if (keyID == static_cast(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0) + { + NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS); + /*如果是拍照界面需要发送拍照结束的消息*/ + if (TakephotosModel::GetInstance()->GetPopStaust() == PopupPhoto::TakePopup) + { +#ifdef SUPPORT_BLE_SERVICE + cameraSend(3); +#endif + } + } + return true; + } + +} diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosView.cpp new file mode 100644 index 000000000..e27ee4f25 --- /dev/null +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosView.cpp @@ -0,0 +1,368 @@ +/*** + * @Date: 2024-08-29 19:34:29 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-08-30 19:46:48 + * @FilePath: + * /FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosView.cpp + */ + +#include "takephotos/include/TakephotosView.h" +#include "takephotos/include/TakephotosModel.h" + +#include "UiConfig.h" +#include "common/image_cache_manager.h" +#include "components/ui_button.h" +#include "ui_resource_image.h" +#include "uicomponents/UIComponents.h" +#include "components/ui_scroll_view.h" +namespace OHOS +{ + static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6; + // 遥控拍照 + static constexpr int IMAGE_SIZE = 140; + static constexpr int CREAM_IMAGE_X = 163; + static constexpr int CREAM_IMAGE_Y = 103; + static constexpr int CREAM_IMAGE_NUM = 50; + static constexpr int CREAM_DELAY = 50; + // 遥控拍照 + static ImageAnimatorInfo g_imageAnimatorInfo_takephoto[50] = { + {PNG_TAKE_PHOTO_IMAGE_0, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_1, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_2, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_3, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_4, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_5, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_6, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_7, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_8, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_9, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_10, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_11, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_12, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_13, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_14, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_15, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_16, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_17, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_18, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_19, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_20, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_21, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_22, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_23, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_24, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_25, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_26, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_27, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_28, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_30, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_31, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_32, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_33, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_34, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_35, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_36, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_37, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_38, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_39, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_40, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_41, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_42, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_43, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_44, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_45, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_46, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_47, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_48, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + {PNG_TAKE_PHOTO_IMAGE_49, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH}, + }; + + static TakephotosView *g_pTakephotosView{nullptr}; + + TakephotosView::TakephotosView() { g_pTakephotosView = this; } + + TakephotosView::~TakephotosView() + { + + // UIViewGroup *tmpGroup = dynamic_cast(scrollview_); + // UIViewGroup::RemoveAndDeleteAllRecursively(tmpGroup); + + DeInit(); + + g_pTakephotosView = nullptr; + } + + TakephotosView *TakephotosView::GetInstance() { return g_pTakephotosView; } + + /* InitView:初始化界面*/ + void TakephotosView ::InitView() + { + if (scrollview_ == nullptr) + { + scrollview_ = new UIScrollView(); + scrollview_->SetPosition(0, 0, 466, 466); + scrollview_->SetStyle(STYLE_BACKGROUND_OPA, 0); + } + // 设置进入弹窗 + PopupPhoto staust = TakephotosModel::GetInstance()->GetPopStaust(); + SetPopupViewStatus(staust, true); + } + + /* DeInit:删除组件 */ + void TakephotosView::DeInit() + { + + if (scrollview_) + { + scrollview_->RemoveAll(); + } + if (creamView) + { + creamView->RemoveAll(); + } + if (takeView) + { + takeView->RemoveAll(); + } + + delete labeltitle_; + labeltitle_ = nullptr; + + delete labelnote_; + labelnote_ = nullptr; + + delete labelnote_; + labelnote_ = nullptr; + + delete buttongo; + buttongo = nullptr; + + if (creamAnimator) + { + creamAnimator->Stop(); + delete creamAnimator; + creamAnimator = nullptr; + } + + delete labeltake_; + labeltake_ = nullptr; + + delete labelclick_; + labelclick_ = nullptr; + + delete buttontake; + buttontake = nullptr; + + if (smileAnimator) + { + smileAnimator->Stop(); + delete smileAnimator; + smileAnimator = nullptr; + } + + delete creamView; + creamView = nullptr; + + delete takeView; + takeView = nullptr; + } + + void TakephotosView::PreLoad(void) + { + if (!viewiInitStatus) + { + InitView(); + viewiInitStatus = true; + } + } + /*显示拍照界面*/ + void TakephotosView::ShowCreamView() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowcreamView start"); + creamView = new UIScrollView(); + if (creamView == nullptr) + { + return; + } + creamView->SetPosition(0, 0); + creamView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); + creamView->SetScrollBlankSize(20); + creamView->SetReboundSize(50); + creamView->SetDirection(1); + /*初始化label*/ + InitLabelExt(labeltitle_, 83, 50, 300, 35, "labletitle", STR_REMOTE_SHOOTING, + DEFAULT_VECTOR_FONT_FILENAME, 30); + + // 设置标签的位置和大小 + labelnote_ = new UILabelExt(); + labelnote_->SetPosition(53, 250); + labelnote_->Resize(360, 200); + // 设置标签的视图 ID + labelnote_->SetViewId("labelTake"); + // 设置标签的样式 + labelnote_->SetStyle(STYLE_TEXT_FONT, 30); + labelnote_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30); + // 设置标签的文本和其他属性 + labelnote_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER); + labelnote_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP); + // SetLabelId(labelnote_, STR_TACK); + labelnote_->SetTextId(STR_CAMERA); // TODO:多国语言 + + /*初始化按键*/ + InitButtonExt(buttongo, 0, 366, 466, 100, BUTTONGO, STR_KONW, 30); + buttongo->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE); + buttongo->SetOnClickListener(static_cast( + TakephotosPresenter::GetInstance())); + + // 初始化图片数组以及动画 + creamAnimator = new UIImageAnimatorView(); + if (creamAnimator == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageAnimatorView fail"); + return; + } + creamAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_takephoto, CREAM_IMAGE_NUM, CREAM_DELAY); + creamAnimator->SetRepeat(true); + + creamView->Add(creamAnimator); + creamView->Add(labeltitle_); + creamView->Add(labelnote_); + creamView->Add(buttongo); + + scrollview_->Add(creamView); + + creamView->SetDraggable(true); + creamView->SetTouchable(true); + + UIView::OnDragListener *draglistener = + static_cast(TakephotosPresenter::GetInstance()); + if (draglistener == nullptr) + { + return; + } + creamView->SetOnDragListener(draglistener); + + creamView->SetVisible(false); // 界面隐藏 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowcreamView end"); + } + /*遥控拍照界面*/ + void TakephotosView::ShowTakeView() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowTakeView start"); + takeView = new UIScrollView(); + if (takeView == nullptr) + { + return; + } + takeView->SetPosition(0, 0); + takeView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); + takeView->SetScrollBlankSize(20); + takeView->SetReboundSize(50); + takeView->SetDirection(1); + + /*初始化label*/ + InitLabelExt(labeltake_, 83, 50, 300, 35, "labletitle", STR_REMOTE_SHOOTING, + DEFAULT_VECTOR_FONT_FILENAME, 30); + InitRollLabel(labelclick_, 53, 278, 360, 70, "labelclick_", STR_TACKNUM, + DEFAULT_VECTOR_FONT_FILENAME, 30); + UpdateLabel(labelclick_, 0, STR_TACKNUM); // 初始化为0 + + /*初始化按键*/ + InitButtonExt(buttontake, 93, 330, 280, 90, BUTTONTAKE, STR_CLICK, 26); + buttontake->SetStyle(STYLE_BACKGROUND_COLOR, 0xff4fc34c); // 设置按键颜色 + buttontake->SetOnClickListener(static_cast( + TakephotosPresenter::GetInstance())); + + // 初始化图片数组以及动画 + smileAnimator = new UIImageAnimatorView(); + if (smileAnimator == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BloodBandoffView::new UIImageAnimatorView fail"); + return; + } + smileAnimator->SetImageAnimatorSrc(g_imageAnimatorInfo_takephoto, CREAM_IMAGE_NUM, CREAM_DELAY); + smileAnimator->SetRepeat(true); + + takeView->Add(smileAnimator); + takeView->Add(labeltake_); + takeView->Add(labelclick_); + takeView->Add(buttontake); + + scrollview_->Add(takeView); + + takeView->SetDraggable(true); + takeView->SetTouchable(true); + + UIView::OnDragListener *draglistener = + static_cast(TakephotosPresenter::GetInstance()); + if (draglistener == nullptr) + { + return; + } + takeView->SetOnDragListener(draglistener); + + takeView->SetVisible(false); // 界面隐藏 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowTakeView end"); + } + /*控制显示界面*/ + void TakephotosView::SetPopupViewStatus(PopupPhoto view, bool status) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetPopupViewStatus %d", view); + + if (view == PopupPhoto::CreamPopup) + { + creamView->SetVisible(true); + takeView->SetVisible(false); + + creamAnimator->Start(); + smileAnimator->Stop(); + } + else if (view == PopupPhoto::TakePopup) + { + takeView->SetVisible(true); + creamView->SetVisible(false); + + smileAnimator->Start(); + creamAnimator->Stop(); + } + } + + void TakephotosView::OnStart() + { + scrollview_ = new UIScrollView(); + scrollview_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), + Screen::GetInstance().GetHeight()); + scrollview_->SetOnDragListener(presenter_); + scrollview_->SetTouchable(true); + scrollview_->SetDraggable(true); + + ShowCreamView(); + ShowTakeView(); + PreLoad(); + + AddViewToRootContainer(scrollview_); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TakephotosView OnStart is ok"); + } + + UILabel *TakephotosView::GetClileLabel() { return labelclick_; } + void TakephotosView::Updatenum(int num) + { + if (smileAnimator->GetState() == true && labelclick_ != nullptr) + { + UpdateLabel(labelclick_, num, STR_TACKNUM); + labelclick_->Invalidate(); + } + } + + void TakephotosView::OnStop() + { + if (scrollview_ != nullptr) + { + scrollview_->RemoveAll(); + delete scrollview_; + scrollview_ = nullptr; + } + return; + } +} // namespace OHOS diff --git a/code/sdk/application/wearable/fd230/service/broadcast/include/broadcast_feature.h b/code/sdk/application/wearable/fd230/service/broadcast/include/broadcast_feature.h index 2ce1f73d3..3c9fcf0f3 100644 --- a/code/sdk/application/wearable/fd230/service/broadcast/include/broadcast_feature.h +++ b/code/sdk/application/wearable/fd230/service/broadcast/include/broadcast_feature.h @@ -19,6 +19,8 @@ extern "C" { #endif #endif +#define SUPPORT_CAT1_MODEM + #ifndef BROADCAST_FEATURE_NAME #define BROADCAST_FEATURE_NAME "BROADCAST" #endif @@ -31,24 +33,78 @@ typedef enum { TOPIC_DEMO_ACORE_MSG = TOPIC_START_NUM, TOPIC_DEMO_ALL_MSG, TOPIC_EVENT_ALARM_RING, + TOPIC_EVENT_ON_TIME, TOPIC_EVENT_UTCTIME_UPDATE, TOPIC_EVENT_NEXTDAY_UPDATE, TOPIC_EVENT_WEARSTATE_UPDATE, TOPIC_EVENT_STEPDATA_UPDATE, TOPIC_EVENT_SHUTDOWN, TOPIC_EVENT_HEARTRATE_UPDATA, + TOPIC_EVENT_STATIC_HEARTRATE_UPDATA, TOPIC_EVENT_HFP_INCOMMING, TOPIC_EVENT_HFP_PHONE_ACTIVE, TOPIC_EVENT_HFP_WATCH_ACTIVE, TOPIC_EVENT_HFP_FINISHED, TOPIC_EVENT_HFP_PHONE_TO_WATCH, TOPIC_EVENT_HFP_WATCH_TO_PHONE, + TOPIC_EVENT_HFP_HINT, +#ifdef CYWEE_SPORT + TOPIC_EVENT_ACTIVITY_UPDATE, + TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE, + TOPIC_EVENT_AR_ALERT_TYPE_UPDATE, + TOPIC_EVENT_INACTIVITY_UPDATE, + TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE, + TOPIC_EVENT_BLE_TRAINING, + TOPIC_EVENT_BLE_TRANSMIT, + TOPIC_EVENT_GOAL_SHOW_VIEW, +#endif +#ifdef SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION + TOPIC_EVENT_CHARGE_PLUG, + TOPIC_EVENT_CHARGE_UNPLUG, + TOPIC_EVENT_LOWPOWER_ALARM, +#endif +#ifdef SUPPORT_SPO2_NOTIFICATION + TOPIC_EVENT_SPO2_UPDATE, + TOPIC_EVENT_START_HRS_MONITORING, + TOPIC_EVENT_STOP_HRS_MONITORING, + TOPIC_EVENT_START_SPO2_MONITORING, + TOPIC_EVENT_STOP_SPO2_MONITORING, + TOPIC_EVENT_GRAYCARD_UPDATA, + TOPIC_EVENT_LEAKLIGHT_UPDATA, +#endif +#ifdef SUPPORT_CAT1_MODEM + TOPIC_EVENT_CAT1_INCOMMING, + TOPIC_EVENT_CAT1_CALLCONNTED, + TOPIC_EVENT_CAT1_CALLENDED, + TOPIC_EVENT_CAT1_CALLDIAL, + TOPIC_EVENT_CAT1_SIGNAL_UPDATE, + TOPIC_EVENT_CAT1_POWER_ON, + TOPIC_EVENT_CAT1_POWER_OFF, + TOPIC_EVENT_CAT1_CALL_FAIL, +#endif + +#ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION + TOPIC_EVENT_DEVICE_BIND, + TOPIC_EVENT_DEVICE_UNBIND, + TOPIC_EVENT_DEVICE_UNBINDING_REQUEST, +#endif + TOPIC_EVENT_ENTER_CMAERA, + TOPIC_EVENT_CANCEL_CMAERA, + TOPIC_EVENT_FIND_WATCH, //查找手表 + TOPIC_EVENT_CANCEL_FIND_WATCH,//取消查找 + TOPIC_EVENT_DRINKREMINDER,//喝水提醒 + TOPIC_EVENT_MESSAGENOTE, //消息通知 + TOPIC_EVENT_MESSAGE_UPDATA, //消息更新通知 + TOPIC_EVENT_SLEEPNOTE, //睡眠通知 + TOPIC_EVENT_DEBUGOUTPUT,//开发调试专用窗口 + TOPIC_EVENT_ASSISTANT_NOTE,//语音助手结束 + TOPIC_EVENT_SHUTDOWN_ANIMATIOR,//关机Animator TOPIC_END_NUM = 20000, } TopicNum; /* topic数量 */ #ifndef MAX_BROACCAST_TOPIC_NUMBER -#define MAX_BROACCAST_TOPIC_NUMBER 32 +#define MAX_BROACCAST_TOPIC_NUMBER 64 #endif /* 每个topic 对应的bitmap长度 */ diff --git a/code/sdk/application/wearable/service/broadcast/src/broadcast_implement.c b/code/sdk/application/wearable/service/broadcast/src/broadcast_implement.c index 2560ff487..7404f171f 100644 --- a/code/sdk/application/wearable/service/broadcast/src/broadcast_implement.c +++ b/code/sdk/application/wearable/service/broadcast/src/broadcast_implement.c @@ -20,18 +20,73 @@ static const TopicToCore topicToCoreArray[] = { {TOPIC_DEMO_ACORE_MSG, A_CORE_MASK, 1}, {TOPIC_DEMO_ALL_MSG, A_CORE_MASK, 1}, {TOPIC_EVENT_ALARM_RING, A_CORE_MASK, 1}, + {TOPIC_EVENT_ON_TIME, A_CORE_MASK, 1}, {TOPIC_EVENT_UTCTIME_UPDATE, A_CORE_MASK, 1}, {TOPIC_EVENT_NEXTDAY_UPDATE, A_CORE_MASK, 1}, {TOPIC_EVENT_WEARSTATE_UPDATE, A_CORE_MASK, 1}, {TOPIC_EVENT_STEPDATA_UPDATE, A_CORE_MASK, 1}, {TOPIC_EVENT_SHUTDOWN, A_CORE_MASK, 1}, {TOPIC_EVENT_HEARTRATE_UPDATA, A_CORE_MASK, 1}, + {TOPIC_EVENT_STATIC_HEARTRATE_UPDATA, A_CORE_MASK, 1}, +#ifdef CYWEE_SPORT + {TOPIC_EVENT_ACTIVITY_UPDATE, A_CORE_MASK, 1}, + {TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE, A_CORE_MASK, 1}, + {TOPIC_EVENT_AR_ALERT_TYPE_UPDATE, A_CORE_MASK, 1}, + {TOPIC_EVENT_INACTIVITY_UPDATE, A_CORE_MASK, 1}, + {TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE, A_CORE_MASK, 1}, + {TOPIC_EVENT_BLE_TRAINING,A_CORE_MASK,1}, + {TOPIC_EVENT_BLE_TRANSMIT,A_CORE_MASK,1}, + {TOPIC_EVENT_GOAL_SHOW_VIEW,A_CORE_MASK,1}, + +#endif +#ifdef SUPPORT_SPO2_NOTIFICATION + {TOPIC_EVENT_SPO2_UPDATE, A_CORE_MASK, 1}, + {TOPIC_EVENT_START_HRS_MONITORING, A_CORE_MASK, 1}, + {TOPIC_EVENT_STOP_HRS_MONITORING, A_CORE_MASK, 1}, + {TOPIC_EVENT_START_SPO2_MONITORING, A_CORE_MASK, 1}, + {TOPIC_EVENT_STOP_SPO2_MONITORING, A_CORE_MASK, 1}, + {TOPIC_EVENT_GRAYCARD_UPDATA, A_CORE_MASK, 1}, + {TOPIC_EVENT_LEAKLIGHT_UPDATA, A_CORE_MASK, 1}, +#endif {TOPIC_EVENT_HFP_INCOMMING, A_CORE_MASK, 1}, {TOPIC_EVENT_HFP_PHONE_ACTIVE, A_CORE_MASK, 1}, {TOPIC_EVENT_HFP_WATCH_ACTIVE, A_CORE_MASK, 1}, {TOPIC_EVENT_HFP_FINISHED, A_CORE_MASK, 1}, {TOPIC_EVENT_HFP_PHONE_TO_WATCH, A_CORE_MASK, 1}, {TOPIC_EVENT_HFP_WATCH_TO_PHONE, A_CORE_MASK, 1}, + {TOPIC_EVENT_HFP_HINT, A_CORE_MASK, 1}, + +#ifdef SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION + {TOPIC_EVENT_CHARGE_PLUG, A_CORE_MASK, 1}, + {TOPIC_EVENT_CHARGE_UNPLUG, A_CORE_MASK, 1}, + {TOPIC_EVENT_LOWPOWER_ALARM, A_CORE_MASK, 1}, +#endif +#ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION + {TOPIC_EVENT_DEVICE_BIND,A_CORE_MASK, 1}, + // {TOPIC_EVENT_DEVICE_UNBIND,A_CORE_MASK, 1}, + // {TOPIC_EVENT_DEVICE_UNBINDING_REQUEST,A_CORE_MASK, 1}, +#endif + {TOPIC_EVENT_ENTER_CMAERA,A_CORE_MASK, 1},//遥控拍照 + {TOPIC_EVENT_ASSISTANT_NOTE,A_CORE_MASK, 1},//语音助手 + {TOPIC_EVENT_CANCEL_CMAERA,A_CORE_MASK, 1}, + {TOPIC_EVENT_FIND_WATCH,A_CORE_MASK, 1},//查找手表 + {TOPIC_EVENT_CANCEL_FIND_WATCH,A_CORE_MASK, 1}, + {TOPIC_EVENT_DRINKREMINDER,A_CORE_MASK, 1}, + {TOPIC_EVENT_MESSAGENOTE,A_CORE_MASK, 1}, + {TOPIC_EVENT_MESSAGE_UPDATA,A_CORE_MASK, 1}, + {TOPIC_EVENT_SLEEPNOTE,A_CORE_MASK, 1}, + {TOPIC_EVENT_DEBUGOUTPUT,A_CORE_MASK, 1}, + {TOPIC_EVENT_SHUTDOWN_ANIMATIOR,A_CORE_MASK, 1}, +#ifdef SUPPORT_CAT1_MODEM + {TOPIC_EVENT_CAT1_INCOMMING, A_CORE_MASK, 1}, + {TOPIC_EVENT_CAT1_CALLCONNTED, A_CORE_MASK, 1}, + {TOPIC_EVENT_CAT1_CALLENDED, A_CORE_MASK, 1}, + {TOPIC_EVENT_CAT1_CALLDIAL, A_CORE_MASK, 1}, + {TOPIC_EVENT_CAT1_SIGNAL_UPDATE, A_CORE_MASK, 1}, + {TOPIC_EVENT_CAT1_POWER_ON, A_CORE_MASK, 1}, + {TOPIC_EVENT_CAT1_POWER_OFF, A_CORE_MASK, 1}, + {TOPIC_EVENT_CAT1_CALL_FAIL,A_CORE_MASK, 1}, +#endif }; /* 所有的topic,其对应的位图 */ -- 2.17.1