VIEW_DIALING_METHOD, // 拨号方式
VIEW_TEST, // 测试
VIEW_CALCULATOR, // 计算器
- VIEW_SCHEDULE, // schedule
+ VIEW_SCHEDULE, // 日程
VIEW_SLEEPMODE, // sleep mode
VIEW_SET_DESKTOP, // 设置主题
/*屏蔽Slice*/
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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<CalendarView>,
+ 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
--- /dev/null
+/*
+ * 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<CalendarPresenter>
+{
+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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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<uint16_t>(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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-11-21 16:06:32\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h\r
+ */\r
+#ifndef COUNTDOWN_MODEL_H\r
+#define COUNTDOWN_MODEL_H\r
+\r
+#include <iostream>\r
+#include "source.h"\r
+#include "audio_manager.h"\r
+#include "../../../../../../middleware/services/media/foundation/player/interfaces/kits/player.h"\r
+namespace OHOS\r
+{\r
+ using OHOS::Media::Player;\r
+ using OHOS::Media::Source;\r
+ using namespace OHOS::Media;\r
+ using namespace Audio;\r
+ using Audio::AudioManager;\r
+\r
+ // 计时器铃声播放监听类\r
+ class CountDownRingPlayerListener : public InterruptListener\r
+ {\r
+ public:\r
+ CountDownRingPlayerListener() {}\r
+ ~CountDownRingPlayerListener() {}\r
+\r
+ void SetOwner(std::shared_ptr<Player> player);\r
+ void RestFlag();\r
+ bool IsPaused();\r
+ bool IsDelayed();\r
+ bool IsResumed();\r
+ bool IsBeginStopped();\r
+ bool IsEndStopped();\r
+ void StopCountDownRing();\r
+ void StartCountDownRing();\r
+ void OnInterrupt(int32_t type, int32_t hint) override;\r
+\r
+ private:\r
+ std::shared_ptr<Player> player_{nullptr};\r
+ bool isPaused_{false};\r
+ bool isDelayed_{false};\r
+ bool isResumed_{false};\r
+ bool isBeginStopped_{false};\r
+ bool isEndStopped_{false};\r
+ };\r
+\r
+ /*处理计时器铃声媒体播放事件的类*/\r
+ class CountDownRingPlayerCallbackImpl : public OHOS::Media::PlayerCallback\r
+ {\r
+ public:\r
+ CountDownRingPlayerCallbackImpl() {}\r
+ ~CountDownRingPlayerCallbackImpl() {}\r
+ /*媒体播放完毕时被调用*/\r
+ void OnPlaybackComplete();\r
+ /*当播放过程中发生错误时,此方法将被调用,提供了错误类型和错误代码以供分析和处理。*/\r
+ void OnError(int32_t errorType, int32_t errorCode);\r
+ /*在播放过程中,为处理某些信息而调用该方法,信息类型和额外数据通过参数提供。*/\r
+ void OnInfo(int type, int extra);\r
+ /*当跳转操作完成时(例如快进到某个特定位置),该方法被调用*/\r
+ void OnRewindToComplete();\r
+ };\r
+\r
+ class CountDownModel\r
+ {\r
+ public:\r
+ static CountDownModel *GetInstance(); // shared_ptr:当没有引用指向这个实例时会自动释放内存\r
+\r
+ bool CountDownTimerIsEnd(); // 计时器是否结束\r
+ bool GetChanageToStartCountDownView();\r
+ void SetChanageToStartCountDownView(bool val);\r
+ bool CountDownViewIsExit(); // 计时器界面是否退出\r
+ void HandCountDownEndOperator(void);\r
+ bool GetCountDownTimerIsPause();\r
+ void SetCountDownTimerIsPause(bool val);\r
+\r
+ void SetCountDownTime(const std::string &countdowntime); // 设置倒计时时间\r
+ std::string GetCountDownTime(void); // 获取倒计时时间\r
+ std::string GetBackupCountDownTime(void);\r
+ void SetRingTime(const std::string &ringtime); // 设置响铃时间\r
+ std::string GetRingTime(void); // 获取响铃时间\r
+ void ParseCountDownTime(const char *countdowntime);\r
+ std::string ParseRingTime(const std::string &ringtime);\r
+ const char *DisplayCountDownDuration();\r
+ void CountDown_StartTimer(uint32_t interval);\r
+ void CountDown_StopTimer(void);\r
+ void CountDown_PauseTimer(void);\r
+ void CountDown_ResumeTimer(uint32_t interval);\r
+\r
+ /*播放器相关函数*/\r
+ int CountDownRingPlayerInit(const char *RingMusicName);\r
+ int InitializeAndPlayRingtone(void);\r
+ int StartRingtonePlayback(void);\r
+ int StopRingtonePlaybackAndReleaseResources(void);\r
+ void RequestStartRingtone(void);\r
+ void RequestStopRingtone(void);\r
+ int ResetRingtonePlayback(void);\r
+\r
+ void countdownstart();\r
+ void countdownpause();\r
+ void countdownresume();\r
+ void countdownstop();\r
+\r
+ void SetisRunning(bool val) {\r
+ isRunning = val;\r
+ }\r
+ bool GetisRunning(void) const {\r
+ return isRunning;\r
+ }\r
+ void SetisPaused(bool val) {\r
+ isPaused = val;\r
+ }\r
+ bool GetisPaused(void) const {\r
+ return isPaused;\r
+ }\r
+ uint32_t get_current_time();//获取当前系统时间戳\r
+ public:\r
+ static int g_CountDownTimes;\r
+ static int totalSeconds; //要到计时总秒数\r
+ static uint32_t startTime; //开始时间戳\r
+ static uint32_t pauseTime; //暂停时间戳\r
+ static uint32_t endTime; //结束时间戳\r
+\r
+ private:\r
+ CountDownModel() {}\r
+ ~CountDownModel() {}\r
+ CountDownModel(const CountDownModel &) = delete;\r
+ CountDownModel &operator=(const CountDownModel &) = delete;\r
+\r
+ std::string uri;\r
+ std::shared_ptr<PlayerCallback> playerCallback{nullptr};\r
+ std::shared_ptr<Player> playerCtr{nullptr};\r
+ std::map<std::string, std::string> header;\r
+ std::shared_ptr<Source> source{nullptr};\r
+ std::shared_ptr<CountDownRingPlayerListener> playerInterruptListener{nullptr};\r
+ AudioSession sessionId;\r
+ AudioInterrupt interrupt;\r
+ // const char *RingMusicPath = "/user/music/alarm.mp3"; // 铃声路径\r
+#ifdef SINGLE_USER_PARTITION \r
+ const char *RingMusicPath = "/user/music/ring/alarm.mp3"; // 铃声路径\r
+#else\r
+ const char *RingMusicPath = "/music/ring/alarm.mp3"; // 铃声路径\r
+#endif\r
+ std::string countdownDuration{nullptr};\r
+ std::string RingTime{"00:00:00"}; // 响铃时间\r
+ std::string CountTime{"00:00:00"}; // 倒计时时间\r
+ std::string CountTimeBackup{"00:00:00"};\r
+ bool IsChanageToStartCountDownViewFlag{false};//是否需要切换到开始倒计时界面标志\r
+ bool CountDownTimerIsPauseFlag{false};\r
+\r
+ bool isRunning{false};//记录倒计时是否正在运行\r
+ bool isPaused{false}; //记录倒计时是否暂停\r
+ };\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2025-02-21 15:22:25\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownTimeConfigView.h\r
+ */\r
+#ifndef COUNTDOWN_TIME_CONFIG_VIEW_H\r
+#define COUNTDOWN_TIME_CONFIG_VIEW_H\r
+\r
+#include "common/screen.h"\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_time_picker.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_button.h"\r
+/*倒计时时间配置*/\r
+namespace OHOS\r
+{\r
+ static constexpr const char *COLONEIMAGESPATH = "/user/res/countdown/COUNTDOWN_COLONE.bin"; // 冒号图片\r
+ static constexpr const char *START_COUNTDOWN_BUTTON_IMAGEPATH = "/user/res/countdown/COUNTDOWM_PAUSE.bin"; // 开始倒计时按钮图片\r
+ static constexpr const char *STARTCOUNTDOWN_BUTTON = "startCountdownButton"; // 开始倒计时按钮视图id\r
+ static constexpr const char *COUNTDOWN_TIMECONFIG_VIEW = "CountDownTimeConfigView";\r
+ class CountDownTimeConfigView\r
+ {\r
+ public:\r
+ CountDownTimeConfigView();\r
+ virtual ~CountDownTimeConfigView();\r
+ static CountDownTimeConfigView *GetInstance(void);\r
+ UIScrollView *CountDownTimeConfigViewInit(void);\r
+ void ClearAll(void);\r
+ UITimePicker * GetTimePicker(void);\r
+\r
+ private:\r
+ UIScrollView *scrollView = nullptr;\r
+ UILabelExt *Title = nullptr;\r
+ UITimePicker *timePicker = nullptr;\r
+ UIImageView *Img[2]{nullptr};\r
+ UIButton *startCountdownButton{nullptr};\r
+ };\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-04-08 14:52:37\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownTimeNotNullView.h\r
+ */\r
+#ifndef COUNTDOWN_TIME_NOT_NULL_VIEW_H\r
+#define COUNTDOWN_TIME_NOT_NULL_VIEW_H\r
+\r
+\r
+#include "View.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_button_ext.h"\r
+\r
+/*倒计时时间不能为0*/\r
+namespace OHOS\r
+{\r
+ static constexpr const char *COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON = "ReturnButton"; // 点击该按钮后回到倒计时设置界面\r
+ static constexpr const char *COUNTDOWNTIMENOTNULLVIEW = "CountDownTimeNotNullView";\r
+ class CountDownTimeNotNullView\r
+ {\r
+\r
+ public:\r
+ CountDownTimeNotNullView();\r
+ virtual ~CountDownTimeNotNullView();\r
+ static CountDownTimeNotNullView *GetInstance(void);\r
+ UIScrollView * CountDownTimeNotNullViewInit(void);\r
+ void ClearAll(void);\r
+\r
+ private:\r
+ UIScrollView *scrollView = nullptr;\r
+ UILabelExt *Title = nullptr;\r
+ UIImageView *Attention = nullptr;\r
+ UILabelExt *AttentionLabel = nullptr;\r
+ UILabelButtonExt *button = nullptr;\r
+ };\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-10-19 17:07:09\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownPresenter.h\r
+ */\r
+#ifndef MAIN_COUNTDOWN_PRESENTER_H\r
+#define MAIN_COUNTDOWN_PRESENTER_H\r
+\r
+#include "View.h"\r
+#include "Presenter.h"\r
+#include "MainCountDownView.h"\r
+#include "ui_resource_string.h"\r
+#include "ModelListenerSample.h"\r
+/*倒计时的主界面*/\r
+namespace OHOS\r
+{\r
+ typedef enum\r
+ {\r
+ MAIN_COUNTDOWN = 0, // 倒计时主视图\r
+ TIMECONFIG_COUNTDOWN, // 自定义倒计时\r
+ START_COUNTDOWN, // 开始倒计时\r
+ COUNTDOWN_TIMENOTNULL, // 倒计时时间不能为空\r
+ COUNTDOWN_MAX,\r
+ } CountDownViewId;\r
+\r
+ static constexpr const int COUNTDOWN_TIMER_DURATION = 1000; // 计时器的定时器周期\r
+ class MainCountDownView;\r
+ class MainCountDownPresenter : public Presenter<MainCountDownView>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ UITimePicker::SelectedListener,\r
+ public UICheckBox::OnChangeListener,\r
+ public RootView::OnKeyActListener,\r
+ public ModelListenerSample\r
+ {\r
+ public:\r
+ MainCountDownPresenter();\r
+ virtual ~MainCountDownPresenter();\r
+\r
+ void OnStart() override;\r
+ void OnPause() override;\r
+ void OnResume() override;\r
+ void OnStop() override;\r
+\r
+ static MainCountDownPresenter *GetInstance();\r
+\r
+ private:\r
+ // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ bool OnDragEnd(UIView &view, const DragEvent &event) override;\r
+ bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件\r
+ bool OnChange(UICheckBox::UICheckBoxState state) override;\r
+ void OnTimePickerStoped(UITimePicker &picker) override;\r
+ void Notify() override;\r
+\r
+ std::string countdowntime{0};\r
+ std::string ringtime{0};\r
+ bool X_DRAG_FLAG{false};\r
+ };\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2025-02-24 18:39:35\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h\r
+ */\r
+#ifndef MAIN_COUNTDOWN_VIEW_H\r
+#define MAIN_COUNTDOWN_VIEW_H\r
+\r
+\r
+#include "View.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "countdown/include/CountDownTimeConfigView.h"\r
+#include "countdown/include/CountDownTimeNotNullView.h"\r
+#include "countdown/include/StartCountDownView.h"\r
+/*倒计时的主界面*/\r
+namespace OHOS\r
+{\r
+#define CountDownImageSrc "/user/res/countdown/"\r
+\r
+ // 图片路径\r
+ static const char *COUNTDOWM_TIMER_ICON = CountDownImageSrc "COUNTDOWM_TIMER_ICON.bin";\r
+\r
+ // 视图ID\r
+ static constexpr const char *COUNTDOWN_LABELBUTTON_VIEWID = "COUNTDOWN_LABELBUTTON"; // 自定义时间ID\r
+ static constexpr const char *COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID = "COUNTDOWN_ONE_MINUTE_BUTTON"; // 1分钟\r
+ static constexpr const char *COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID = "COUNTDOWN_FIVE_MINUTE_BUTTON"; // 5分钟\r
+ static constexpr const char *COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID = "COUNTDOWN_TEN_MINUTE_BUTTON"; // 10分钟\r
+ static constexpr const char *COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID = "COUNTDOWN_THIRTY_MINUTE_BUTTON"; // 30 分钟\r
+ static constexpr const char *MAINCOUNTDOWNVIEW = "MainCountDownView";\r
+}\r
+namespace OHOS\r
+{\r
+#define COUNTDOWN_MAX_VIEW 4\r
+\r
+ class MainCountDownPresenter;\r
+ class MainCountDownView : public View<MainCountDownPresenter>\r
+ {\r
+\r
+ public:\r
+ MainCountDownView();\r
+ virtual ~MainCountDownView();\r
+ static MainCountDownView *GetInstance(void);\r
+ bool ClickFunc(int16_t interface);\r
+ bool CheckViewParam(int16_t hideView, int16_t showView);\r
+ void ChangeView(int16_t hideView, int16_t showView);\r
+ bool ChangeMainCountDown(int16_t thisView);\r
+ bool ChangeTimeConfigCountdown(int16_t thisView);\r
+ bool ChangeCountdownTimeNotNull(int16_t thisView);\r
+ bool ChangeStartCountDown(int16_t thisView);\r
+ StartCountDownView *GetStartCountDownView(void);\r
+\r
+ public:\r
+ void OnStart() override;\r
+\r
+ private:\r
+ CountDownTimeConfigView *p_CountDownTimeConfigView{nullptr};\r
+ CountDownTimeNotNullView *p_CountDownTimeNotNullView{nullptr};\r
+ StartCountDownView *p_StartCountDownView{nullptr};\r
+\r
+ private:\r
+ UIScrollView * MainCountDownViewInit(void);\r
+ void ClearAll(void);\r
+ UILabelButtonExt *SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text,int textId);\r
+ UIScrollView *scrollView[COUNTDOWN_MAX_VIEW]{nullptr};\r
+ UILabelExt *Title{nullptr};\r
+ UILabelExt *QuickStart{nullptr};\r
+ UILabelButtonExt *CUSTOM_COUNTDOWN{nullptr}; // 自定义倒计时\r
+ UILabelButtonExt *COUNTDOWN_ONE_MINUTE_BUTTON = nullptr;\r
+ UILabelButtonExt *COUNTDOWN_FIVE_MINUTE_BUTTON = nullptr;\r
+ UILabelButtonExt *COUNTDOWN_TEN_MINUTE_BUTTON = nullptr;\r
+ UILabelButtonExt *COUNTDOWN_THIRTY_MINUTE_BUTTON = nullptr;\r
+ bool viewInitStatus{false};\r
+ };\r
+} // namespace OHOS\r
+#endif // MainCountDown_PRESENTER_H
\ No newline at end of file
--- /dev/null
+/***\r
+ * @Date: 2024-08-06 18:11:47\r
+ * @LastEditors: Caisking 3449750381@qq.com\r
+ * @LastEditTime: 2024-08-27 18:27:41\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/StartCountDownView.h\r
+ */\r
+#ifndef START_COUNTDOWN_VIEW_H\r
+#define START_COUNTDOWN_VIEW_H\r
+\r
+\r
+#include "View.h"\r
+\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_toggle_button.h"\r
+#include "components/ui_button.h"\r
+#include "components/ui_checkbox.h"\r
+\r
+/*开始倒计时*/\r
+namespace OHOS\r
+{\r
+ static constexpr const char *EndButton_ImagePath = "/user/res/countdown/COUNTDOWM_END.bin"; // 结束返回按钮图片\r
+ static constexpr const char *CountDown_Play_ImagePath = "/user/res/countdown/COUNTDOWM_PLAY.bin"; // 开始倒计时image\r
+ static constexpr const char *CountDown_PAUSE_ImagePath = "/user/res/countdown/COUNTDOWM_PAUSE.bin"; // 暂停倒计时image\r
+ static constexpr const char *RepeatButtonImagePath = "/user/res/countdown/repeat_button.bin";\r
+ static constexpr const char *VectorImagesPath = "/user/res/countdown/COUNTDOWM_VECTOR.bin";\r
+ static constexpr const char *VectorBigImagesPath = "/user/res/countdown/Vector_Big.bin";\r
+ static constexpr const char *PlayOrPauseToggleButton_ViewID = "PlayOrPauseToggleButton"; // 暂停和开始toggleButton视图id\r
+ static constexpr const char *STARTCOUNTDOWNVIEWRETURNBUTTON = "StartCountDownViewReturnButton";\r
+ static constexpr const char *STARTCOUNTDOWNVIEW = "StartCountDownView";\r
+ static constexpr const char *RepeatButtonViewID = "RepeatButtonViewID";\r
+ class StartCountDownView\r
+ {\r
+\r
+ public:\r
+ StartCountDownView();\r
+ virtual ~StartCountDownView();\r
+ static StartCountDownView *GetInstance(void);\r
+ UIScrollView *StartCountDownViewInit(void);\r
+ void ClearAll(void);\r
+ UILabelExt *GetShowCountDownTimelabel(void); // 获取显示倒计时时间标签\r
+ UILabelExt *GetShowTheRingTimelabel(void); // 获取显示响铃时间标签\r
+ UIToggleButton *GetPlayOrPauseToggleButton(void);\r
+ UIButton *GetRepeatButton(void);\r
+\r
+ void SetEndView();\r
+ void SetImageAndLabel(bool state);\r
+ void ShowEndView(bool state);\r
+ void UpdateimageAndLabelPosition(void);\r
+ private:\r
+ UIScrollView *scrollView = nullptr;\r
+ UILabelExt *Title = nullptr;\r
+ UILabelExt *showCountDownTimelabel = nullptr;\r
+ UILabelExt *showTheRingTime = nullptr;\r
+ UIImageView *vectorImage = nullptr;\r
+\r
+ UILabelExt *showTheEndRingTime = nullptr;\r
+ UIImageView *vectorbigImage = nullptr;\r
+\r
+ UIToggleButton *play_or_pause_toggleButton = nullptr;\r
+ UIButton *endbutton = nullptr;\r
+ UIButton *RepeatButton = nullptr;\r
+ bool viewInitStatus{false};\r
+ };\r
+} // namespace OHOS\r
+#endif
\ No newline at end of file
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-04-07 18:15:53\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-12-18 17:42:19\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp\r
+ */\r
+#include "countdown/include/CountDownModel.h"\r
+#include <cmsis_os2.h>\r
+#include <ohos_types.h>\r
+#include <service/graphic_service.h>\r
+#include "wearable_log.h"\r
+#include "countdown/include/MainCountDownView.h"\r
+#include <cmsis_os.h>\r
+#include "ConfigModel.h"\r
+#include "ui_resource_string.h"\r
+#include "custom_runtime.h"\r
+#include "uiservice/include/ui_service.h"\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include <custom_utils.h>\r
+#include <errcode.h>\r
+#include <custom_save_runtime.h>\r
+namespace OHOS\r
+{\r
+ /* -------------------------------------------------------------------------- */\r
+ // 声明定时器变量\r
+ static osTimerId_t g_timer = nullptr;\r
+ int CountDownModel::g_CountDownTimes = {0};\r
+ int CountDownModel::totalSeconds = 0; //总的倒计时时间\r
+ uint32_t CountDownModel::startTime = 0;\r
+ uint32_t CountDownModel::pauseTime = 0;\r
+ uint32_t CountDownModel::endTime = 0;\r
+ static constexpr int32 NUM_TEN = 10; // 主要用于格式化输出,当小时、分钟或秒小于10时,在其前面添加一个’0’以保持常规时间格式,例如“09:05:03”。\r
+ static constexpr int16 NUM_TIME_MIN = 60;\r
+ static constexpr int16 NUM_TIME_HOUR = 3600;\r
+ static constexpr int32 NUM_TIME_DAY = 86400;\r
+\r
+ /* -------------------------------------------------------------------------- */\r
+ // 定义了 GetInstance() 方法来获取 CountDownModel 的实例,确保只有一个全局实例存在。\r
+ CountDownModel *CountDownModel::GetInstance()\r
+ {\r
+ static CountDownModel instance;\r
+ return &instance;\r
+ }\r
+\r
+ // 函数用于解析"HH:MM:SS"格式的时间字符串,并更新g_CountDownTimes\r
+ void CountDownModel::ParseCountDownTime(const char *countdowntime)\r
+ {\r
+ int hours, minutes, seconds;\r
+\r
+ // 使用sscanf从字符串中读取格式化数据\r
+ // "%2d:%2d:%2d"用于检查两个数字,后面跟一个冒号,这样的模式重复两次,从而捕获三个整数\r
+ if (sscanf(countdowntime, "%2d:%2d:%2d", &hours, &minutes, &seconds) == 3)\r
+ {\r
+ // 解析成功,现在转换为总秒数\r
+ g_CountDownTimes = hours * NUM_TIME_HOUR + minutes * NUM_TIME_MIN + seconds;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_CountDownTimes = %d", g_CountDownTimes);\r
+ }\r
+ else\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::ParseCountDownTime Parsing failure");\r
+ }\r
+ }\r
+\r
+ std::string CountDownModel::ParseRingTime(const std::string &timeStr)\r
+ {\r
+ int hours, minutes, seconds;\r
+ std::string formattedTime;\r
+ // 使用 sscanf 从字符串中读取时间数据\r
+ if (sscanf(timeStr.c_str(), "%2d:%2d:%2d", &hours, &minutes, &seconds) == 3)\r
+ {\r
+ // 如果小时部分为0,则格式化去掉小时部分\r
+ if (hours == 0)\r
+ {\r
+ formattedTime = (minutes < NUM_TEN ? "0" : "") + std::to_string(minutes) + ":" + (seconds < NUM_TEN ? "0" : "") + std::to_string(seconds);\r
+ }\r
+ else\r
+ {\r
+ // 如果小时部分不为0,保持原有格式\r
+ formattedTime = timeStr;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ // 解析失败逻辑处理:可以选择记录错误、返回原字符串或其他合适的处理方式\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrimTimeFormat Parsing failure: Invalid format");\r
+ formattedTime = timeStr; // 例子中选择返回原字符串\r
+ }\r
+ return formattedTime;\r
+ }\r
+\r
+ // 设置倒计时时间\r
+ void CountDownModel::SetCountDownTime(const std::string &countdowntime)\r
+ {\r
+ CountTime = countdowntime;\r
+ CountTimeBackup = countdowntime;\r
+ ParseCountDownTime(CountTime.c_str());\r
+ }\r
+\r
+ // 获取倒计时时间\r
+ std::string CountDownModel::GetCountDownTime(void)\r
+ {\r
+ return CountTime;\r
+ }\r
+\r
+ std::string CountDownModel::GetBackupCountDownTime(void)\r
+ {\r
+ return CountTimeBackup;\r
+ }\r
+\r
+ // 设置响铃时间\r
+ void CountDownModel::SetRingTime(const std::string &ringtime)\r
+ {\r
+ RingTime = ParseRingTime(ringtime);\r
+ }\r
+\r
+ // 获取响铃时间\r
+ std::string CountDownModel::GetRingTime(void)\r
+ {\r
+ return RingTime;\r
+ }\r
+\r
+ /*\r
+ * @brief 初始化音乐播放器以播放一个指定的铃声文件\r
+ * @param {char*} RingMusicName 铃声文件\r
+ */\r
+ int CountDownModel::CountDownRingPlayerInit(const char *RingMusicName)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDownRingPlayerInit");\r
+ /* ------------------------------- 1.播放文件路径设置 ------------------------------- */\r
+ uri = RingMusicName;\r
+ /* -------------------------------- 2.播放器对象创建 ------------------------------- */\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ playerCtr = std::make_shared<Player>();\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr new fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ }\r
+ /* ------------------------------- 3.播放器回调对象创建 ------------------------------ */\r
+ if (playerCallback.get() == nullptr)\r
+ {\r
+ playerCallback = std::make_shared<CountDownRingPlayerCallbackImpl>();\r
+ if (playerCallback.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCallback new fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] PlayerInit success!");\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ /*\r
+ * @brief 对铃声播放器进行设置并开始播放铃声。\r
+ */\r
+ int CountDownModel::InitializeAndPlayRingtone(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::InitializeAndPlayRingtone");\r
+ /* -------------------------------- 1.检查播放器实例 ------------------------------- */\r
+ int32_t ret;\r
+ int32_t state;\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr.get() == nullptr");\r
+ return OHOS_FAILURE;\r
+ }\r
+ playerCtr->GetPlayerState(state);\r
+ /* -------------------------------- 2.设置播放器回调 ------------------------------- */\r
+ playerCtr->SetPlayerCallback(playerCallback);\r
+ /* -------------------------------- 3.创建并设置音频源 -------------------------------- */\r
+ source = std::make_shared<Source>(uri, header);\r
+ if (source.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] source.get() == fail");\r
+ return OHOS_FAILURE;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Player url:%s", uri.c_str());\r
+ playerCtr->SetSource(*source);\r
+ /* --------------------------------- 4.配置播放器 -------------------------------- */\r
+ playerCtr->SetAudioStreamType(AUDIO_STREAM_NOTIFICATION_SYSTEM); // 设置播放器的音频流类型\r
+ playerCtr->Prepare(); // 准备播放器对象以播放音频。\r
+ /* -------------------------------- 5.请求音频焦点 -------------------------------- */\r
+ AudioManager &amIntance = AudioManager::GetInstance();\r
+ sessionId = amIntance.MakeSessionId();\r
+ if (sessionId == AUDIO_SESSION_ID_NONE)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] sessionId invalid!!");\r
+ return OHOS_FAILURE;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownModel] MakeSessionId = %d", sessionId);\r
+ playerInterruptListener = std::make_shared<CountDownRingPlayerListener>(); // 创建音频中断监听器\r
+ if (playerInterruptListener.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerInterruptListener playerInterruptListener.get() == nullptr");\r
+ return OHOS_FAILURE;\r
+ }\r
+ playerInterruptListener->SetOwner(playerCtr);\r
+ interrupt = {AUDIO_STREAM_NOTIFICATION_SYSTEM, sessionId, playerInterruptListener};\r
+ // 激活音频中断 5s超时\r
+ if (amIntance.ActivateAudioInterrupt(interrupt) == INTERRUPT_FAILED)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ActivateAudioInterrupt faild");\r
+ return OHOS_FAILURE;\r
+ }\r
+ // playerCtr->SetVolume(50, 50); // 将左声道和右声道音量都设置为50\r
+ playerCtr->SetAudioSessionId(sessionId);\r
+ // 播放\r
+ ret = playerCtr->Play();\r
+ if(ret == 0)\r
+ {\r
+ //如果倒计时铃声播放成功,记录该事件\r
+ uapi_save_runtime_log(RUNTIME_LOG_RING_PLAY_START_COUNTDOWN);//TOOD*\r
+ }\r
+ playerCtr->EnableSingleLooping(true); // 设置是否循环播放\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ /*\r
+ * @brief 开始铃声的播放\r
+ */\r
+ int CountDownModel::StartRingtonePlayback(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::StartRingtonePlayback");\r
+ if (CountDownRingPlayerInit(RingMusicPath) != OHOS_SUCCESS)\r
+ {\r
+ // 错误处理,例如记录日志或者返回错误状态码\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDownRingPlayerInit error!!");\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ if (InitializeAndPlayRingtone() != OHOS_SUCCESS)\r
+ {\r
+ // 错误处理,例如记录日志或者返回错误状态码\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::InitializeAndPlayRingtone error!!");\r
+ return OHOS_FAILURE;\r
+ }\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ /*\r
+ * @brief 停止播放铃声,重置并释放播放器资源,并去激活之前设置的音频中断。\r
+ */\r
+ int CountDownModel::StopRingtonePlaybackAndReleaseResources(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::StopRingtonePlaybackAndReleaseResources");\r
+ int32_t ret = 0;\r
+ int32_t state = 0;\r
+ AudioManager &amIntance = AudioManager::GetInstance();\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr.get() == nullptr");\r
+ return OHOS_FAILURE;\r
+ }\r
+ playerCtr->GetPlayerState(state);\r
+ if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PAUSED)\r
+ {\r
+ ret = playerCtr->Stop();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to stop the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ //如果倒计时铃声停止播放成功,记录该事件\r
+ uapi_save_runtime_log(RUNTIME_LOG_RING_PLAY_STOP_COUNTDOWN);//TOOD*\r
+ }\r
+ ret = playerCtr->Reset();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to reset the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ ret = playerCtr->Release();\r
+ playerCtr.reset();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to release the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ if (amIntance.DeactivateAudioInterrupt(interrupt) != 0)\r
+ {\r
+ return OHOS_FAILURE;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reset, ret:%d", ret);\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ int CountDownModel::ResetRingtonePlayback(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownModel::ResetRingtonePlayback");\r
+ int32_t ret = 0;\r
+ int32_t state = 0;\r
+ if (playerCtr.get() == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] playerCtr is null");\r
+ return OHOS_FAILURE;\r
+ }\r
+ playerCtr->GetPlayerState(state);\r
+ if (state == PlayerStates::PLAYER_STARTED || state == PlayerStates::PLAYER_PAUSED)\r
+ {\r
+ ret = playerCtr->Stop();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to stop the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ }\r
+ ret = playerCtr->Reset();\r
+ if (ret != 0)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDownModel] Failed to reset the player");\r
+ return OHOS_FAILURE;\r
+ }\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ template <typename Func>\r
+ static void PostRingtoneEvent(Func function)\r
+ {\r
+ GraphicService::GetInstance()->PostGraphicEvent(\r
+ std::bind(function, CountDownModel::GetInstance()));\r
+ }\r
+\r
+ /*触发铃声的开始*/\r
+ void CountDownModel::RequestStartRingtone(void)\r
+ {\r
+ if (uapi_sleep_mode_flag_get())\r
+ {\r
+ return;\r
+ }\r
+ if (true != ConfigModel::GetInstance()->GetDnotdisturb())\r
+ {\r
+ PostRingtoneEvent(&CountDownModel::StartRingtonePlayback);\r
+ }\r
+ }\r
+\r
+ /*触发铃声的停止*/\r
+ void CountDownModel::RequestStopRingtone(void)\r
+ {\r
+ PostRingtoneEvent(&CountDownModel::StopRingtonePlaybackAndReleaseResources);\r
+ }\r
+\r
+ // 判断计时器是否结束\r
+ bool CountDownModel::CountDownTimerIsEnd() // 计时器是否结束\r
+ {\r
+ if (g_timer == nullptr)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+ // 获取是否需要跳转到开始到计时界面\r
+ bool CountDownModel::GetChanageToStartCountDownView()\r
+ {\r
+ return IsChanageToStartCountDownViewFlag;\r
+ }\r
+\r
+ // 设置是否需要跳转到开始到计时界面\r
+ void CountDownModel::SetChanageToStartCountDownView(bool val)\r
+ {\r
+ IsChanageToStartCountDownViewFlag = val;\r
+ }\r
+\r
+ bool CountDownModel::CountDownViewIsExit() // 计时器界面是否退出\r
+ {\r
+ MainCountDownView *g_CountDownView = MainCountDownView::GetInstance();\r
+ if (g_CountDownView == nullptr)\r
+ {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ // 处理倒计时到期时的一些操作\r
+ void CountDownModel::HandCountDownEndOperator(void)\r
+ {\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+ if (p_StartCountDownView)\r
+ {\r
+ CountDown_StopTimer(); // 停止定时器\r
+ uapi_set_screen_on_api(); // 点亮屏幕\r
+ CountDownModel::GetInstance()->RequestStartRingtone(); // 播放铃声\r
+\r
+ StartCountDownView::GetInstance()->GetPlayOrPauseToggleButton()->SetVisible(false);\r
+ p_StartCountDownView->GetRepeatButton()->SetVisible(true);\r
+ /*倒计时结束 显示大图标 */\r
+ p_StartCountDownView->ShowEndView(true);\r
+ }\r
+ }\r
+\r
+ bool CountDownModel::GetCountDownTimerIsPause()\r
+ {\r
+ return CountDownTimerIsPauseFlag;\r
+ }\r
+ void CountDownModel::SetCountDownTimerIsPause(bool val)\r
+ {\r
+ CountDownTimerIsPauseFlag = val;\r
+ }\r
+ /* ----------------------------------- 定时器 ---------------------------------- */\r
+\r
+ /*\r
+ * @brief 显示计时器(时、分、秒)\r
+ */\r
+ const char *CountDownModel::DisplayCountDownDuration()\r
+ {\r
+ countdownDuration.clear(); // 更正为clear(),更加表明意图,与erase()等价\r
+ std::string hours;\r
+ std::string minute;\r
+ std::string seconds;\r
+\r
+ if (g_CountDownTimes >= NUM_TIME_DAY)\r
+ {\r
+ g_CountDownTimes = 0;\r
+ }\r
+\r
+ int hour = g_CountDownTimes / NUM_TIME_HOUR;\r
+ int min = (g_CountDownTimes % NUM_TIME_HOUR) / NUM_TIME_MIN;\r
+ int sec = (g_CountDownTimes % NUM_TIME_HOUR) % NUM_TIME_MIN;\r
+\r
+ hours = (hour < NUM_TEN) ? "0" + std::to_string(hour) : std::to_string(hour);\r
+ minute = (min < NUM_TEN) ? "0" + std::to_string(min) : std::to_string(min);\r
+ seconds = (sec < NUM_TEN) ? "0" + std::to_string(sec) : std::to_string(sec);\r
+ countdownDuration = hours + ":" + minute + ":" + seconds;\r
+\r
+ return countdownDuration.c_str(); // 返回 std::string 的 c_str(),但需要注意生命周期\r
+ }\r
+ /*\r
+ * @brief 在这里添加定时器到期后的处理逻辑\r
+ */\r
+ static void CountDown_TimerCallbackProc(int data)\r
+ {\r
+ if (CountDownModel::GetInstance()->CountDownViewIsExit()) // 如果已经退出了界面定时器还在跑,就先跳转Slice\r
+ {\r
+ CountDownModel::GetInstance()->CountDown_StopTimer(); // 停止定时器\r
+ CountDownModel::GetInstance()->SetChanageToStartCountDownView(true);\r
+ NativeAbility::GetInstance().EnterSlice(VIEW_MAIN_COUNTDOWN);\r
+ }\r
+ else\r
+ {\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+ if (p_StartCountDownView)\r
+ {\r
+ CountDownModel::GetInstance()->HandCountDownEndOperator();\r
+ }\r
+ }\r
+ return;\r
+ }\r
+\r
+ /*\r
+ * @brief 计时器回调函数\r
+ */\r
+ static void CountDown_TimerCallback(int data)\r
+ {\r
+\r
+ /*拿系统时间实现倒计时功能*/\r
+ bool isRunning = CountDownModel::GetInstance()->GetisRunning();\r
+ bool isPaused = CountDownModel::GetInstance()->GetisPaused();\r
+\r
+ if (isRunning &&!isPaused) \r
+ {\r
+ uint32_t currentTime = CountDownModel::GetInstance()->get_current_time();\r
+ CountDownModel::g_CountDownTimes = CountDownModel::totalSeconds - (currentTime - CountDownModel::startTime);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前时间戳:%u,倒计时剩余时间:%d", currentTime ,CountDownModel::g_CountDownTimes);\r
+ if (CountDownModel::g_CountDownTimes <= 0 && currentTime == CountDownModel::endTime) {\r
+ // 这里可以添加倒计时结束后的操作,比如发出提示音等\r
+ GraphicService::GetInstance()->PostGraphicEvent(std::bind(CountDown_TimerCallbackProc, data));\r
+ }\r
+ }\r
+ }\r
+\r
+ uint32_t CountDownModel::get_current_time()\r
+ {\r
+ uint32_t time;\r
+ if (uapi_get_timestampe_ss(&time) != ERRCODE_SUCC) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");\r
+ return 0;\r
+ }\r
+ return time;\r
+ }\r
+\r
+ void CountDownModel::countdownstart()\r
+ {\r
+ isRunning = true;\r
+ isPaused = false;\r
+ CountDownModel::totalSeconds = CountDownModel::g_CountDownTimes;\r
+ CountDownModel::startTime = get_current_time(); //获取开始时间戳\r
+ CountDownModel::endTime = CountDownModel::startTime + g_CountDownTimes; //获取结束时间戳\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,endTime:%u",CountDownModel::startTime,CountDownModel::endTime);\r
+\r
+ }\r
+ \r
+ void CountDownModel::countdownpause()\r
+ {\r
+ if (isRunning &&!isPaused) {\r
+ isPaused = true;\r
+ CountDownModel::pauseTime = get_current_time();\r
+ }\r
+ }\r
+ void CountDownModel::countdownresume()\r
+ {\r
+ if (isRunning && isPaused) {\r
+ isPaused = false;\r
+ uint32_t currentTime = get_current_time();\r
+ uint32_t pauseDuration = currentTime - CountDownModel::pauseTime;\r
+ CountDownModel::endTime = CountDownModel::endTime + pauseDuration;\r
+ CountDownModel::totalSeconds = CountDownModel::totalSeconds + pauseDuration;\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "startTime:%u,pauseDuration:%u,endTime:%u",CountDownModel::startTime,pauseDuration,CountDownModel::endTime);\r
+ }\r
+ }\r
+ \r
+ void CountDownModel::countdownstop()\r
+ {\r
+ isRunning = false;\r
+ isPaused = false;\r
+ }\r
+\r
+ /*\r
+ * @brief 开启定时器函数\r
+ * @param interval 时间间隔,单位ms\r
+ */\r
+ void CountDownModel::CountDown_StartTimer(uint32_t interval)\r
+ {\r
+ /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */\r
+ if (g_timer != nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDown_StartTimer Timer already exists!!");\r
+ return;\r
+ }\r
+\r
+ countdownstart();\r
+\r
+ /* --------------------------------- 2.创建定时器 -------------------------------- */\r
+ g_timer = osTimerNew((osTimerFunc_t)CountDown_TimerCallback, osTimerPeriodic, nullptr, nullptr);\r
+ // 检查定时器创建是否成功\r
+ if (g_timer == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDown_StartTimer Timer create failed!!");\r
+ return;\r
+ }\r
+\r
+ /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */\r
+ int tick = osMs2Tick(interval);\r
+\r
+ /* --------------------------------- 4.启动定时器 -------------------------------- */\r
+ // g_timerStartTimestamp = GetCurrentTimestamp(); // 假设GetCurrentTimestamp()是获取当前时间戳的函数\r
+ osStatus_t ret = osTimerStart(g_timer, tick);\r
+ /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 nullptr -------------------- */\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDown_StartTimer] osTimerDelete failed, ret = %lx!!", ret);\r
+ if (g_timer != nullptr)\r
+ {\r
+ ret = osTimerDelete(g_timer);\r
+ }\r
+ g_timer = nullptr;\r
+ return;\r
+ }\r
+ return;\r
+ }\r
+\r
+ /*\r
+ * @brief 停止定时器\r
+ */\r
+ void CountDownModel::CountDown_StopTimer(void)\r
+ {\r
+ // 检查定时器是否存在\r
+ if (g_timer != nullptr)\r
+ {\r
+ countdownstop();\r
+\r
+ osTimerStop(g_timer);\r
+ // 删除定时器并置为 nullptr\r
+ osStatus_t ret = osTimerDelete(g_timer);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ScanTimerCallback osTimerDelete failed, ret = %lx!!", ret);\r
+ }\r
+ g_timer = nullptr;\r
+ g_CountDownTimes = 0;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stop timer success!!");\r
+ }\r
+ }\r
+ /*\r
+ * @brief 暂停定时器\r
+ */\r
+ void CountDownModel::CountDown_PauseTimer(void)\r
+ {\r
+ // 检查定时器是否存在\r
+ if (g_timer != nullptr)\r
+ {\r
+ countdownpause();\r
+\r
+ // 暂停定时器,但不删除它\r
+ osStatus_t ret = osTimerStop(g_timer);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_PauseTimer osTimerStop failed, ret = %lx!!", ret);\r
+ }\r
+ }\r
+ }\r
+\r
+ /*\r
+ * @brief 恢复定时器\r
+ */\r
+ void CountDownModel::CountDown_ResumeTimer(uint32_t interval)\r
+ {\r
+ // 检查定时器是否存在\r
+ if (g_timer != nullptr)\r
+ {\r
+ countdownresume();\r
+\r
+ int tick = osMs2Tick(interval);\r
+ // 恢复定时器\r
+ osStatus_t ret = osTimerStart(g_timer, tick);\r
+ if (ret != osOK)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDown_ResumeTimer osTimerStart failed, ret = %lx!!", ret);\r
+ }\r
+ }\r
+ }\r
+\r
+ /* ----------------------- CountDownRingPlayerListener ---------------------- */\r
+\r
+ void CountDownRingPlayerListener::SetOwner(std::shared_ptr<Player> player)\r
+ {\r
+ player_ = player;\r
+ }\r
+\r
+ /*重置标志位*/\r
+ void CountDownRingPlayerListener::RestFlag()\r
+ {\r
+ isPaused_ = false;\r
+ isDelayed_ = false;\r
+ isResumed_ = false;\r
+ isBeginStopped_ = false;\r
+ isEndStopped_ = false;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsPaused()\r
+ {\r
+ return isPaused_;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsDelayed()\r
+ {\r
+ return isDelayed_;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsResumed()\r
+ {\r
+ return isResumed_;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsBeginStopped()\r
+ {\r
+ return isBeginStopped_;\r
+ }\r
+\r
+ bool CountDownRingPlayerListener::IsEndStopped()\r
+ {\r
+ return isEndStopped_;\r
+ }\r
+\r
+ static void Start(void)\r
+ {\r
+ CountDownModel::GetInstance()->RequestStartRingtone();\r
+ }\r
+\r
+ static void Stop(void)\r
+ {\r
+ CountDownModel::GetInstance()->RequestStopRingtone();\r
+ }\r
+\r
+ /*开始计时器铃声播放*/\r
+ void CountDownRingPlayerListener::StartCountDownRing(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownRingPlayerListener::StartCountDownRing] start");\r
+ GraphicService::GetInstance()->PostGraphicEvent(Start);\r
+ }\r
+\r
+ /*停止计时器铃声播放*/\r
+ void CountDownRingPlayerListener::StopCountDownRing(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CountDownRingPlayerListener::StopCountDownRing] start");\r
+ GraphicService::GetInstance()->PostGraphicEvent(Stop);\r
+ }\r
+\r
+ /*响应外部的音频中断事件*/\r
+ void CountDownRingPlayerListener::OnInterrupt(int32_t type, int32_t hint)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnInterrupt go in, type %d, hint %d.", type, hint);\r
+ if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_PAUSE)\r
+ {\r
+ isDelayed_ = true;\r
+ }\r
+\r
+ if (type == INTERRUPT_TYPE_BEGIN && hint == INTERRUPT_HINT_STOP)\r
+ {\r
+ StopCountDownRing();\r
+ }\r
+ else if (type == INTERRUPT_TYPE_END && isDelayed_ == true)\r
+ {\r
+ // 重新开始计时器的铃声播放\r
+ StartCountDownRing();\r
+ isDelayed_ = false;\r
+ }\r
+ return;\r
+ }\r
+\r
+ /* --------------------- CountDownRingPlayerCallbackImpl -------------------- */\r
+ void CountDownRingPlayerCallbackImpl::OnPlaybackComplete(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnPlaybackComplete");\r
+ // CountDownModel::GetInstance()->RequestStopRingtone();\r
+ // CountDownModel::GetInstance()->RequestStartRingtone();\r
+ }\r
+\r
+ void CountDownRingPlayerCallbackImpl::OnError(int32_t errorType, int32_t errorCode)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnError test, errorType %d, errorCode %d", errorType, errorCode);\r
+ // 此处实现代码处理错误事件\r
+ }\r
+\r
+ void CountDownRingPlayerCallbackImpl::OnInfo(int type, int extra)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnInfo test, type %d, extra %d.", type, extra);\r
+ // 此处实现代码处理普通事件\r
+ }\r
+\r
+ void CountDownRingPlayerCallbackImpl::OnRewindToComplete(void)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnRewindToComplete test");\r
+ // 此处实现代码处理进度控制完成的事件\r
+ }\r
+}\r
--- /dev/null
+#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<UIView::OnDragListener *>(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<UIView::OnClickListener *>(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
--- /dev/null
+#include "countdown/include/CountDownTimeNotNullView.h"\r
+#include "countdown/include/MainCountDownPresenter.h"\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+/*倒计时时间不能为0*/\r
+namespace OHOS\r
+{\r
+\r
+ static CountDownTimeNotNullView *g_pCountDownTimeNotNullView{nullptr};\r
+\r
+ CountDownTimeNotNullView::CountDownTimeNotNullView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::CountDownTimeNotNullView");\r
+\r
+ g_pCountDownTimeNotNullView = this;\r
+ }\r
+\r
+ CountDownTimeNotNullView::~CountDownTimeNotNullView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::~CountDownTimeNotNullView");\r
+ ClearAll();\r
+ g_pCountDownTimeNotNullView = nullptr;\r
+ }\r
+\r
+ CountDownTimeNotNullView *CountDownTimeNotNullView::GetInstance()\r
+ {\r
+\r
+ return g_pCountDownTimeNotNullView;\r
+ }\r
+\r
+ void CountDownTimeNotNullView::ClearAll()\r
+ {\r
+ scrollView->RemoveAll();\r
+ if (Title != nullptr)\r
+ {\r
+ delete Title;\r
+ Title = nullptr;\r
+ }\r
+ if (Attention != nullptr)\r
+ {\r
+ delete Attention;\r
+ Attention = nullptr;\r
+ }\r
+ if (AttentionLabel != nullptr)\r
+ {\r
+ delete AttentionLabel;\r
+ AttentionLabel = nullptr;\r
+ }\r
+ if (button != nullptr)\r
+ {\r
+ delete button;\r
+ button = nullptr;\r
+ }\r
+ if (scrollView != nullptr)\r
+ {\r
+ delete scrollView;\r
+ scrollView = nullptr;\r
+ }\r
+ }\r
+\r
+ UIScrollView *CountDownTimeNotNullView::CountDownTimeNotNullViewInit()\r
+ {\r
+ if (scrollView == nullptr)\r
+ {\r
+ scrollView = new UIScrollView();\r
+ scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ scrollView->SetViewId(COUNTDOWNTIMENOTNULLVIEW);\r
+ scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
+ /* -------------------------------------------------------------------------- */\r
+ Title = new UILabelExt();\r
+ if (Title == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Title is new fail!!");\r
+ return nullptr;\r
+ }\r
+ Title->SetPosition(83, 50, 300, 35);\r
+ Title->SetStyle(STYLE_TEXT_FONT, 30);\r
+ Title->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ Title->SetTextId(STR_COUNT_DOWN); // 倒计时\r
+ Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ Title->SetRollSpeed(23);\r
+ Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* -------------------------------------------------------------------------- */\r
+ Attention = new UIImageView();\r
+ if (Attention == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Attention is new fail!!");\r
+ return nullptr;\r
+ }\r
+ Attention->SetPosition(193, 121, 80, 80);\r
+ Attention->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ #ifdef FD230\r
+ Attention->SetSrc(PNG_ATTENTION_IMAGE);\r
+ #endif\r
+ /* -------------------------------------------------------------------------- */\r
+ AttentionLabel = new UILabelExt();\r
+ if (AttentionLabel == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::AttentionLabel is new fail!!");\r
+ return nullptr;\r
+ }\r
+ AttentionLabel->SetPosition(53, 253, 360, 35);\r
+ AttentionLabel->SetStyle(STYLE_TEXT_FONT, 30);\r
+ AttentionLabel->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ AttentionLabel->SetTextId(STR_SET_COUNT_DOWN_NOTE); // 请先设置好倒计时间\r
+ AttentionLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ AttentionLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ AttentionLabel->SetRollSpeed(23);\r
+ AttentionLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* -------------------------------------------------------------------------- */\r
+ button = new UILabelButtonExt();\r
+ if (button == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::button is new fail!!");\r
+ return nullptr;\r
+ }\r
+ button->SetPosition(0, 366, 466, 100);\r
+ button->SetViewId(COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON);\r
+ #ifdef FD230\r
+ button->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE);\r
+ #endif\r
+ button->SetTextId(STR_KONW); // 知道了\r
+ button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ button->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ button->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED);\r
+ UIView::OnClickListener *buttonClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
+ if (buttonClick == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::buttonClick is new fail!!");\r
+ return nullptr;\r
+ }\r
+ button->SetOnClickListener(buttonClick);\r
+ /* ----------------------------------- Add ---------------------------------- */\r
+ scrollView->Add(Title);\r
+ scrollView->Add(Attention);\r
+ scrollView->Add(AttentionLabel);\r
+ scrollView->Add(button);\r
+ }\r
+\r
+ return scrollView;\r
+ }\r
+\r
+}
\ No newline at end of file
--- /dev/null
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "UiConfig.h"\r
+#include "countdown/include/MainCountDownPresenter.h"\r
+#include "countdown/include/CountDownModel.h"\r
+#include "countdown/include/StartCountDownView.h"\r
+#include "common/key_code.h"\r
+#include "custom_utils.h"\r
+#include "NativeRegisterManager.h"\r
+\r
+namespace OHOS\r
+{\r
+ REGIST_MENU_PRO(VIEW_MAIN_COUNTDOWN, MainCountDownView, MainCountDownPresenter,\r
+ PNG_APPLIST_COUNTDOWN_IMAGE_BIG, PNG_APPLIST_COUNTDOWN_IMAGE,PNG_APPLIST_COUNTDOWN_IMAGE, "计时器", STR_TIMER);\r
+\r
+ static constexpr const char *OneMinuteTime = "00:01:00"; // 1分钟\r
+ static constexpr const char *FiveMinuteTime = "00:05:00"; // 5分钟\r
+ static constexpr const char *TenMinuteTime = "00:10:00"; // 10分钟\r
+ static constexpr const char *ThirtyMinuteTime = "00:30:00"; // 30分钟\r
+\r
+ // 当前Presenter属性实例化的内存指针\r
+ static MainCountDownPresenter *g_pMainCountDownPresenter = nullptr;\r
+ MainCountDownPresenter::MainCountDownPresenter()\r
+ {\r
+ g_pMainCountDownPresenter = this;\r
+ }\r
+\r
+ MainCountDownPresenter::~MainCountDownPresenter()\r
+ {\r
+ g_pMainCountDownPresenter = nullptr;\r
+ }\r
+\r
+ MainCountDownPresenter *MainCountDownPresenter::GetInstance()\r
+ {\r
+\r
+ return g_pMainCountDownPresenter;\r
+ }\r
+\r
+ void MainCountDownPresenter::OnStart()\r
+ {\r
+ // ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 长亮屏\r
+ }\r
+\r
+ void MainCountDownPresenter::OnPause(void)\r
+ {\r
+\r
+ Presenter<MainCountDownView>::OnPause();\r
+ }\r
+\r
+ void MainCountDownPresenter::OnResume(void)\r
+ {\r
+\r
+ Presenter<MainCountDownView>::OnResume();\r
+ }\r
+\r
+ void MainCountDownPresenter::OnStop(void)\r
+ {\r
+ // ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); // 取消长亮屏\r
+ CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources(); // 清理播放器资源\r
+ }\r
+\r
+ bool MainCountDownPresenter::OnDrag(UIView &view, const DragEvent &event)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnDrag");\r
+ UNUSED(view);\r
+ if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动\r
+ {\r
+ MainCountDownPresenter::X_DRAG_FLAG = true;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ bool MainCountDownPresenter::OnDragEnd(UIView &view, const DragEvent &event)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnDragEnd");\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && MainCountDownPresenter::X_DRAG_FLAG)\r
+ {\r
+ if (strcmp(view.GetViewId(), MAINCOUNTDOWNVIEW) == 0)\r
+ {\r
+ NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);\r
+ }\r
+ else if (strcmp(view.GetViewId(), COUNTDOWN_TIMECONFIG_VIEW) == 0)\r
+ {\r
+ MainCountDownView::GetInstance()->ChangeView(TIMECONFIG_COUNTDOWN, MAIN_COUNTDOWN);\r
+ }\r
+ MainCountDownPresenter::X_DRAG_FLAG = false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ static bool SetCountDownAndChangeView(MainCountDownView *p_MainCountDownView, const std::string &timeValue)\r
+ {\r
+ CountDownModel *model = CountDownModel::GetInstance();\r
+ model->SetCountDownTime(timeValue);\r
+ model->SetRingTime(timeValue);\r
+\r
+ // Update label texts if necessary\r
+ if (p_MainCountDownView->GetStartCountDownView() != nullptr)\r
+ {\r
+ p_MainCountDownView->GetStartCountDownView()->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str());\r
+ p_MainCountDownView->GetStartCountDownView()->GetShowTheRingTimelabel()->SetText(CountDownModel::GetInstance()->GetRingTime().c_str());\r
+ p_MainCountDownView->GetStartCountDownView()->GetPlayOrPauseToggleButton()->SetVisible(true);\r
+ p_MainCountDownView->GetStartCountDownView()->GetRepeatButton()->SetVisible(false);\r
+ }\r
+\r
+ p_MainCountDownView->ChangeView(MAIN_COUNTDOWN, START_COUNTDOWN);\r
+ return true;\r
+ }\r
+\r
+ bool MainCountDownPresenter::OnClick(UIView &view, const ClickEvent &event)\r
+ {\r
+ UNUSED(event);\r
+\r
+ MainCountDownView *p_MainCountDownView = MainCountDownView::GetInstance();\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+\r
+ if (p_MainCountDownView == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::GetInstance fail!!");\r
+ return false;\r
+ }\r
+\r
+ if (strcmp(view.GetViewId(), COUNTDOWN_LABELBUTTON_VIEWID) == 0)\r
+ {\r
+ p_MainCountDownView->ChangeView(MAIN_COUNTDOWN, TIMECONFIG_COUNTDOWN);\r
+ return true;\r
+ }\r
+\r
+ /*四个快速开始倒计时按钮*/\r
+ if (strcmp(view.GetViewId(), COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID) == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID");\r
+ return SetCountDownAndChangeView(p_MainCountDownView, OneMinuteTime);\r
+ }\r
+ else if (strcmp(view.GetViewId(), COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID) == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID");\r
+ return SetCountDownAndChangeView(p_MainCountDownView, FiveMinuteTime);\r
+ }\r
+ else if (strcmp(view.GetViewId(), COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID) == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID");\r
+ return SetCountDownAndChangeView(p_MainCountDownView, TenMinuteTime);\r
+ }\r
+ else if (strcmp(view.GetViewId(), COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID) == 0)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID");\r
+ return SetCountDownAndChangeView(p_MainCountDownView, ThirtyMinuteTime);\r
+ }\r
+\r
+ if (strcmp(view.GetViewId(), STARTCOUNTDOWN_BUTTON) == 0) // 在自定义倒计时界面点击开始按钮跳转到开始倒计时界面\r
+ {\r
+ UITimePicker *timePicker = CountDownTimeConfigView::GetInstance()->GetTimePicker();\r
+\r
+ std::string timeValue = timePicker->GetSelectValue();\r
+ if (nullptr != timePicker && ("00:00:00" != timeValue))\r
+ {\r
+ CountDownModel::GetInstance()->SetCountDownTime(timePicker->GetSelectValue()); // 设置倒计时时间\r
+ CountDownModel::GetInstance()->SetRingTime(timePicker->GetSelectValue()); // 设置响铃时间\r
+ }\r
+\r
+ if (strcmp(CountDownModel::GetInstance()->GetCountDownTime().c_str(), "00:00:00") == 0) // 如果自定义时间设置为0\r
+ {\r
+ p_MainCountDownView->ChangeView(TIMECONFIG_COUNTDOWN, COUNTDOWN_TIMENOTNULL);\r
+ return true;\r
+ }\r
+ else\r
+ {\r
+ p_MainCountDownView->ChangeView(TIMECONFIG_COUNTDOWN, START_COUNTDOWN);\r
+ if (p_StartCountDownView != nullptr)\r
+ {\r
+ std::string CountDownTime = CountDownModel::GetInstance()->GetCountDownTime();\r
+ std::string RingTime = CountDownModel::GetInstance()->GetRingTime();\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTime = %s RingTime = %s", CountDownTime.c_str(), RingTime.c_str());\r
+ p_StartCountDownView->GetShowCountDownTimelabel()->SetText(CountDownTime.c_str());\r
+ p_StartCountDownView->GetShowTheRingTimelabel()->SetText(RingTime.c_str());\r
+ p_StartCountDownView->GetPlayOrPauseToggleButton()->SetVisible(true);\r
+ p_StartCountDownView->GetRepeatButton()->SetVisible(false);\r
+ }\r
+\r
+ return true;\r
+ }\r
+ }\r
+\r
+ if (strcmp(view.GetViewId(), COUNTDOWNTIMENOTNULLVIEWRETURNBUTTON) == 0) // 从倒计时不为空视图退到自定义倒计时界面\r
+ {\r
+ p_MainCountDownView->ChangeView(COUNTDOWN_TIMENOTNULL, TIMECONFIG_COUNTDOWN);\r
+ /*结束视图恢复*/\r
+ if (p_StartCountDownView == nullptr)\r
+ return false;\r
+ p_StartCountDownView->ShowEndView(false);\r
+ return true;\r
+ }\r
+\r
+ if (strcmp(view.GetViewId(), STARTCOUNTDOWNVIEWRETURNBUTTON) == 0) // 从开始倒计时视图退到倒计时主视图\r
+ {\r
+ CountDownModel::GetInstance()->SetCountDownTime("00:00:00");\r
+ CountDownModel::GetInstance()->SetRingTime("00:00:00");\r
+ CountDownModel::GetInstance()->CountDown_StopTimer();\r
+ CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources();\r
+ p_StartCountDownView->GetPlayOrPauseToggleButton()->SetTouchable(true);\r
+ p_StartCountDownView->GetPlayOrPauseToggleButton()->SetState(false);\r
+ p_MainCountDownView->ChangeView(START_COUNTDOWN, MAIN_COUNTDOWN);\r
+ p_StartCountDownView->ShowEndView(false);\r
+\r
+ return true;\r
+ }\r
+\r
+ // repeat button cb\r
+ if (0 == strcmp(view.GetViewId(), RepeatButtonViewID))\r
+ {\r
+ // close prompt\r
+ CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources();\r
+\r
+ /*结束视图恢复*/\r
+ if (p_StartCountDownView == nullptr)\r
+ return false;\r
+ p_StartCountDownView->ShowEndView(false);\r
+\r
+ // set param & change view\r
+ CountDownModel *model = CountDownModel::GetInstance();\r
+ const std::string timeValue = model->GetBackupCountDownTime();\r
+ model->SetCountDownTime(timeValue);\r
+ model->SetRingTime(timeValue);\r
+\r
+ if (nullptr != p_MainCountDownView->GetStartCountDownView())\r
+ {\r
+\r
+ p_MainCountDownView->GetStartCountDownView()->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str());\r
+ p_MainCountDownView->GetStartCountDownView()->GetShowTheRingTimelabel()->SetText(CountDownModel::GetInstance()->GetRingTime().c_str());\r
+\r
+ p_MainCountDownView->GetStartCountDownView()->GetPlayOrPauseToggleButton()->SetVisible(true);\r
+ p_MainCountDownView->GetStartCountDownView()->GetRepeatButton()->SetVisible(false);\r
+ }\r
+\r
+ // start timer\r
+ CountDownModel::GetInstance()->CountDown_StartTimer(COUNTDOWN_TIMER_DURATION);\r
+\r
+ return true;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ // 增加按键事件\r
+ bool MainCountDownPresenter::OnKeyAct(UIView &view, const KeyEvent &event)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::OnKeyAct");\r
+ uint16_t keyID = event.GetKeyId();\r
+ uint16_t keyState = event.GetState();\r
+ // 如果是power键就返回上一级\r
+ if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0)\r
+ {\r
+ NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ bool MainCountDownPresenter::OnChange(UICheckBox::UICheckBoxState state)\r
+ {\r
+ CountDownModel *p_CountDownModel = CountDownModel::GetInstance();\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+ if (p_CountDownModel == nullptr || p_StartCountDownView == nullptr)\r
+ return false;\r
+\r
+ switch (state)\r
+ {\r
+ case UICheckBox::SELECTED:\r
+ p_CountDownModel->SetCountDownTimerIsPause(false);\r
+ p_CountDownModel->CountDown_StartTimer(COUNTDOWN_TIMER_DURATION);\r
+ p_CountDownModel->CountDown_ResumeTimer(COUNTDOWN_TIMER_DURATION);\r
+ /*视图恢复*/\r
+ p_StartCountDownView->SetImageAndLabel(true);\r
+ p_StartCountDownView->ShowEndView(false);\r
+ break;\r
+ case UICheckBox::UNSELECTED:\r
+ p_CountDownModel->SetCountDownTimerIsPause(true);\r
+ p_CountDownModel->CountDown_PauseTimer();\r
+ /*进行视图隐藏*/\r
+ p_StartCountDownView->SetImageAndLabel(false);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ void MainCountDownPresenter::OnTimePickerStoped(UITimePicker &picker)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "picker.GetSelectValue = %s", picker.GetSelectValue());\r
+ CountDownModel::GetInstance()->SetCountDownTime(picker.GetSelectValue()); // 设置倒计时时间\r
+ CountDownModel::GetInstance()->SetRingTime(picker.GetSelectValue()); // 设置响铃时间\r
+ }\r
+ void MainCountDownPresenter::Notify()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownPresenter::Notify");\r
+ if (CountDownModel::GetInstance()->CountDownTimerIsEnd()) // 倒计时timer已经停止直接退出不刷新\r
+ {\r
+ return;\r
+ }\r
+ StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
+ if (p_StartCountDownView && p_StartCountDownView->GetShowCountDownTimelabel())\r
+ {\r
+ // 更新显示\r
+ p_StartCountDownView->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->DisplayCountDownDuration());\r
+ }\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+#include "countdown/include/MainCountDownView.h"\r
+#include "countdown/include/MainCountDownPresenter.h"\r
+#include "wearable_log.h"\r
+#include "common/image_cache_manager.h"\r
+#include "countdown/include/CountDownModel.h"\r
+/*倒计时的主界面*/\r
+namespace OHOS\r
+{\r
+#define VISIBLE_XBAR(visible)\r
+\r
+ static MainCountDownView *g_pMainCountDownView{nullptr};\r
+\r
+ MainCountDownView::MainCountDownView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::MainCountDownView");\r
+ g_pMainCountDownView = this;\r
+ }\r
+\r
+ MainCountDownView::~MainCountDownView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::~MainCountDownView");\r
+ ClearAll();\r
+ g_pMainCountDownView = nullptr;\r
+ }\r
+\r
+ MainCountDownView *MainCountDownView::GetInstance()\r
+ {\r
+ return g_pMainCountDownView;\r
+ }\r
+\r
+ void MainCountDownView::ClearAll()\r
+ {\r
+ if (scrollView[MAIN_COUNTDOWN] != nullptr)\r
+ {\r
+ scrollView[MAIN_COUNTDOWN]->RemoveAll();\r
+ if (Title != nullptr)\r
+ {\r
+ delete Title;\r
+ Title = nullptr;\r
+ }\r
+ if (QuickStart != nullptr)\r
+ {\r
+ delete QuickStart;\r
+ QuickStart = nullptr;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(COUNTDOWM_TIMER_ICON);\r
+ if (CUSTOM_COUNTDOWN != nullptr)\r
+ {\r
+ delete CUSTOM_COUNTDOWN;\r
+ CUSTOM_COUNTDOWN = nullptr;\r
+ }\r
+ if (COUNTDOWN_ONE_MINUTE_BUTTON != nullptr)\r
+ {\r
+ delete COUNTDOWN_ONE_MINUTE_BUTTON;\r
+ COUNTDOWN_ONE_MINUTE_BUTTON = nullptr;\r
+ }\r
+ if (COUNTDOWN_FIVE_MINUTE_BUTTON != nullptr)\r
+ {\r
+ delete COUNTDOWN_FIVE_MINUTE_BUTTON;\r
+ COUNTDOWN_FIVE_MINUTE_BUTTON = nullptr;\r
+ }\r
+ if (COUNTDOWN_TEN_MINUTE_BUTTON != nullptr)\r
+ {\r
+ delete COUNTDOWN_TEN_MINUTE_BUTTON;\r
+ COUNTDOWN_TEN_MINUTE_BUTTON = nullptr;\r
+ }\r
+ if (COUNTDOWN_THIRTY_MINUTE_BUTTON != nullptr)\r
+ {\r
+ delete COUNTDOWN_THIRTY_MINUTE_BUTTON;\r
+ COUNTDOWN_THIRTY_MINUTE_BUTTON = nullptr;\r
+ }\r
+ delete scrollView[MAIN_COUNTDOWN];\r
+ scrollView[MAIN_COUNTDOWN] = nullptr;\r
+ }\r
+ if (p_CountDownTimeConfigView != nullptr)\r
+ {\r
+ delete p_CountDownTimeConfigView;\r
+ p_CountDownTimeConfigView = nullptr;\r
+ }\r
+ if (p_CountDownTimeNotNullView != nullptr)\r
+ {\r
+ delete p_CountDownTimeNotNullView;\r
+ p_CountDownTimeNotNullView = nullptr;\r
+ }\r
+ if (p_StartCountDownView != nullptr)\r
+ {\r
+ delete p_StartCountDownView;\r
+ p_StartCountDownView = nullptr;\r
+ }\r
+ }\r
+\r
+ UIScrollView *MainCountDownView::MainCountDownViewInit()\r
+ {\r
+ if (scrollView[MAIN_COUNTDOWN] == nullptr)\r
+ {\r
+ /* ----------------------- scrollView[MAIN_COUNTDOWN] ----------------------- */\r
+ scrollView[MAIN_COUNTDOWN] = new UIScrollView();\r
+ if (scrollView[MAIN_COUNTDOWN] == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scrollView[MAIN_COUNTDOWN] is new fail!!");\r
+ return nullptr;\r
+ }\r
+ scrollView[MAIN_COUNTDOWN]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ scrollView[MAIN_COUNTDOWN]->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
+ scrollView[MAIN_COUNTDOWN]->SetViewId(MAINCOUNTDOWNVIEW);\r
+ UIView::OnDragListener *draglistener = static_cast<UIView::OnDragListener *>(MainCountDownPresenter::GetInstance());\r
+ if (draglistener == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "draglistener is nullptr!!");\r
+ return nullptr;\r
+ }\r
+ scrollView[MAIN_COUNTDOWN]->SetOnDragListener(draglistener);\r
+ scrollView[MAIN_COUNTDOWN]->SetReboundSize(50); // 设置回弹大小\r
+ scrollView[MAIN_COUNTDOWN]->SetHorizontalScrollState(false); // 设置横向不可以滚动\r
+ scrollView[MAIN_COUNTDOWN]->SetScrollBlankSize(75);\r
+ scrollView[MAIN_COUNTDOWN]->SetThrowDrag(true);\r
+ scrollView[MAIN_COUNTDOWN]->SetMaxScrollDistance(1000);\r
+ scrollView[MAIN_COUNTDOWN]->SetSwipeACCLevel(200); // 800: compensation distance\r
+ scrollView[MAIN_COUNTDOWN]->SetDragACCLevel(5); // 5: drag acceleration\r
+ scrollView[MAIN_COUNTDOWN]->SetRotateFactor(2);\r
+ scrollView[MAIN_COUNTDOWN]->RequestFocus();\r
+ /* ---------------------------------- Title --------------------------------- */\r
+ Title = new UILabelExt();\r
+ if (Title == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title is new fail!!");\r
+ return nullptr;\r
+ }\r
+ Title->SetPosition(83, 50, 300, 35);\r
+ Title->SetStyle(STYLE_TEXT_FONT, 30);\r
+ Title->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ Title->SetTextId(STR_COUNT_DOWN); // 倒计时\r
+ Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ Title->SetRollSpeed(23);\r
+ Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* -------------------------- CUSTOM_COUNTDOWN ------------------------- */\r
+ CUSTOM_COUNTDOWN = new UILabelButtonExt();\r
+ if (CUSTOM_COUNTDOWN == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CUSTOM_COUNTDOWN is new fail!!");\r
+ return nullptr;\r
+ }\r
+ CUSTOM_COUNTDOWN->SetPosition(43, 130, 380, 100);\r
+ CUSTOM_COUNTDOWN->SetViewId(COUNTDOWN_LABELBUTTON_VIEWID);\r
+ CUSTOM_COUNTDOWN->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffa800);\r
+ CUSTOM_COUNTDOWN->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ CUSTOM_COUNTDOWN->SetTextId(STR_CUSTOM_TIME); // 自定义时间\r
+ CUSTOM_COUNTDOWN->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ CUSTOM_COUNTDOWN->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ CUSTOM_COUNTDOWN->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED);\r
+ /* ------------------------------- QuickStart ------------------------------- */\r
+ QuickStart = new UILabelExt();\r
+ if (QuickStart == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QuickStart is new fail!!");\r
+ return nullptr;\r
+ }\r
+ QuickStart->SetPosition(83, 270, 300, 35);\r
+ QuickStart->SetStyle(STYLE_TEXT_FONT, 30);\r
+ QuickStart->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ QuickStart->SetTextId(STR_QUICK_START);\r
+ QuickStart->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ QuickStart->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ QuickStart->SetRollSpeed(23);\r
+ QuickStart->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* ----------------------- COUNTDOWN_ONE_MINUTE_BUTTON ---------------------- */\r
+ COUNTDOWN_ONE_MINUTE_BUTTON = SetUILabelButton(43, 345, 180, 150, COUNTDOWN_ONE_MINUTE_BUTTON_VIEWID, "1分钟", STR_1_MIN);\r
+ if (COUNTDOWN_ONE_MINUTE_BUTTON == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_ONE_MINUTE_BUTTON is new fail!!");\r
+ return nullptr;\r
+ }\r
+ /* ---------------------- COUNTDOWN_FIVE_MINUTE_BUTTON ---------------------- */\r
+ COUNTDOWN_FIVE_MINUTE_BUTTON = SetUILabelButton(243, 345, 180, 150, COUNTDOWN_FIVE_MINUTE_BUTTON_VIEWID, "5分钟", STR_5_MIN);\r
+ if (COUNTDOWN_FIVE_MINUTE_BUTTON == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_FIVE_MINUTE_BUTTON is new fail!!");\r
+ return nullptr;\r
+ }\r
+ /* ----------------------- COUNTDOWN_TEN_MINUTE_BUTTON ---------------------- */\r
+ COUNTDOWN_TEN_MINUTE_BUTTON = SetUILabelButton(43, 515, 180, 150, COUNTDOWN_TEN_MINUTE_BUTTON_VIEWID, "10分钟", STR_10_MIN);\r
+ if (COUNTDOWN_TEN_MINUTE_BUTTON == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_TEN_MINUTE_BUTTON is new fail!!");\r
+ return nullptr;\r
+ }\r
+ /* --------------------- COUNTDOWN_THIRTY_MINUTE_BUTTON --------------------- */\r
+ COUNTDOWN_THIRTY_MINUTE_BUTTON = SetUILabelButton(243, 515, 180, 150, COUNTDOWN_THIRTY_MINUTE_BUTTON_VIEWID, "30分钟", STR_30_MIN);\r
+ if (COUNTDOWN_THIRTY_MINUTE_BUTTON == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_THIRTY_MINUTE_BUTTON is new fail!!");\r
+ return nullptr;\r
+ }\r
+ /* -------------------------------------------------------------------------- */\r
+ UIView::OnClickListener *ButtonOnClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
+ CUSTOM_COUNTDOWN->SetOnClickListener(ButtonOnClick);\r
+ COUNTDOWN_ONE_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick);\r
+ COUNTDOWN_FIVE_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick);\r
+ COUNTDOWN_TEN_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick);\r
+ COUNTDOWN_THIRTY_MINUTE_BUTTON->SetOnClickListener(ButtonOnClick);\r
+ /* -------------------------------------------------------------------------- */\r
+ scrollView[MAIN_COUNTDOWN]->Add(Title);\r
+ scrollView[MAIN_COUNTDOWN]->Add(CUSTOM_COUNTDOWN);\r
+ scrollView[MAIN_COUNTDOWN]->Add(QuickStart);\r
+ scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_ONE_MINUTE_BUTTON);\r
+ scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_FIVE_MINUTE_BUTTON);\r
+ scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_TEN_MINUTE_BUTTON);\r
+ scrollView[MAIN_COUNTDOWN]->Add(COUNTDOWN_THIRTY_MINUTE_BUTTON);\r
+ }\r
+ return scrollView[MAIN_COUNTDOWN];\r
+ }\r
+\r
+ UILabelButtonExt *MainCountDownView::SetUILabelButton(int x, int y, int w, int h, const char *id, const char *text, int textId)\r
+ {\r
+ UILabelButtonExt *button = new UILabelButtonExt();\r
+ if (button == nullptr)\r
+ {\r
+ return nullptr;\r
+ }\r
+ button->SetPosition(x, y, w, h);\r
+ button->SetViewId(id);\r
+ button->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);\r
+ button->SetStyle(STYLE_BORDER_RADIUS, 50);\r
+ button->SetImagePosition(72, 30);\r
+ ImageInfo *img = ImageCacheManager::GetInstance().LoadSingleRes(COUNTDOWM_TIMER_ICON);\r
+ button->SetImageSrc(img, img);\r
+ // button->SetText(text);\r
+ button->SetTextId(textId);\r
+ button->SetAlign(TEXT_ALIGNMENT_CENTER);\r
+ button->SetLabelPosition(0, 61);\r
+ button->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ button->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ button->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED);\r
+ button->SetStyleForState(STYLE_BORDER_RADIUS, 50, UIButton::PRESSED);\r
+ return button;\r
+ }\r
+\r
+ // 获取开始倒计时视图\r
+ StartCountDownView *MainCountDownView::GetStartCountDownView(void)\r
+ {\r
+ return p_StartCountDownView;\r
+ }\r
+\r
+ /*1.切换到主倒计时视图*/\r
+ bool MainCountDownView::ChangeMainCountDown(int16_t thisView)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeMainCountDown");\r
+ if (scrollView[thisView] == nullptr)\r
+ {\r
+ UIScrollView *view = MainCountDownViewInit();\r
+ if (view == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+ return false;\r
+ }\r
+ scrollView[thisView] = view;\r
+ AddViewToRootContainer(scrollView[thisView]);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /*2.切换到自定义倒计时界面*/\r
+ bool MainCountDownView::ChangeTimeConfigCountdown(int16_t thisView)\r
+ {\r
+ if (scrollView[thisView] == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeTimeConfigCountdown");\r
+ p_CountDownTimeConfigView = new CountDownTimeConfigView();\r
+ if (p_CountDownTimeConfigView == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
+ return false;\r
+ }\r
+ UIScrollView *view = p_CountDownTimeConfigView->CountDownTimeConfigViewInit();\r
+ if (view == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+ return false;\r
+ }\r
+ scrollView[thisView] = view;\r
+ AddViewToRootContainer(scrollView[thisView]);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /*3.开始倒计时*/\r
+ bool MainCountDownView::ChangeStartCountDown(int16_t thisView)\r
+ {\r
+ if (scrollView[thisView] == nullptr)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeCountdownTimeNotNull");\r
+ p_StartCountDownView = new StartCountDownView();\r
+ if (p_StartCountDownView == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
+ return false;\r
+ }\r
+ UIScrollView *view = p_StartCountDownView->StartCountDownViewInit();\r
+ if (view == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+ return false;\r
+ }\r
+ scrollView[thisView] = view;\r
+ AddViewToRootContainer(scrollView[thisView]);\r
+ }\r
+ if (p_StartCountDownView)\r
+ {\r
+ p_StartCountDownView->UpdateimageAndLabelPosition();\r
+ if(CountDownModel::GetInstance()->GetChanageToStartCountDownView() == true)\r
+ {\r
+ CountDownModel::GetInstance()->SetChanageToStartCountDownView(false);\r
+ CountDownModel::GetInstance()->HandCountDownEndOperator();\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /*4.切换到倒计时不能为空界面*/\r
+ bool MainCountDownView::ChangeCountdownTimeNotNull(int16_t thisView)\r
+ {\r
+ if (scrollView[thisView] == nullptr)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeCountdownTimeNotNull");\r
+ p_CountDownTimeNotNullView = new CountDownTimeNotNullView();\r
+ if (p_CountDownTimeNotNullView == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
+ return false;\r
+ }\r
+ UIScrollView *view = p_CountDownTimeNotNullView->CountDownTimeNotNullViewInit();\r
+ if (view == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+ return false;\r
+ }\r
+ scrollView[thisView] = view;\r
+ AddViewToRootContainer(scrollView[thisView]);\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /* -------------------------------------------------------------------------- */\r
+ // 1.MainCountDownViewMapper:结构体定义了一个将视图ID映射到特定成员函数指针的映射表。\r
+ struct MainCountDownViewMapper\r
+ {\r
+ const int16_t viewId;\r
+ bool (MainCountDownView::*func)(int16_t thisView);\r
+ };\r
+\r
+ // 2.ViewMapper[] 是一个静态的视图映射数组,将视图ID与MainCountDownView类中的特定成员函数指针进行了绑定。\r
+ static const MainCountDownViewMapper ViewMapper[] = {\r
+ {MAIN_COUNTDOWN, &MainCountDownView::ChangeMainCountDown},\r
+ {TIMECONFIG_COUNTDOWN, &MainCountDownView::ChangeTimeConfigCountdown},\r
+ {START_COUNTDOWN, &MainCountDownView::ChangeStartCountDown},\r
+ {COUNTDOWN_TIMENOTNULL, &MainCountDownView::ChangeCountdownTimeNotNull},\r
+ };\r
+\r
+ // 3.根据传入的interface参数执行相应视图ID关联的成员函数。\r
+ bool MainCountDownView::ClickFunc(int16_t interface)\r
+ {\r
+ int funcSize = sizeof(ViewMapper) / sizeof(ViewMapper[0]);\r
+ for (int i = 0; i < funcSize; i++)\r
+ {\r
+ if (interface == ViewMapper[i].viewId)\r
+ {\r
+ bool jug = (this->*(ViewMapper[i].func))(interface);\r
+ if (jug == false)\r
+ {\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+ bool MainCountDownView::CheckViewParam(int16_t hideView, int16_t showView)\r
+ {\r
+ if (showView < 0 || showView >= COUNTDOWN_MAX)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootView::CheckViewParam showView err.");\r
+ return false;\r
+ }\r
+\r
+ if (hideView < 0 || hideView > COUNTDOWN_MAX)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RebootView::CheckViewParam hideView err.");\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ // 4.切换视图\r
+ void MainCountDownView::ChangeView(int16_t hideView, int16_t showView)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeView %d, %d", hideView, showView);\r
+ if (!CheckViewParam(hideView, showView))\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::CheckViewParam failed.");\r
+ return;\r
+ }\r
+ if (hideView != COUNTDOWN_MAX)\r
+ {\r
+ if (scrollView[hideView] == nullptr)\r
+ {\r
+ return;\r
+ }\r
+ scrollView[hideView]->SetVisible(false);\r
+ }\r
+ ClickFunc(showView);\r
+ scrollView[showView]->SetVisible(true);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: ChangeView end!!!%d", showView);\r
+ Draw();\r
+ }\r
+ /* -------------------------------------------------------------------------- */\r
+\r
+ void MainCountDownView::OnStart()\r
+ {\r
+ /* -------------------------------------------------------------------------- */\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d,%d",CountDownModel::GetInstance()->CountDownTimerIsEnd(),CountDownModel::GetInstance()->GetChanageToStartCountDownView());\r
+ if (CountDownModel::GetInstance()->CountDownTimerIsEnd() == false ||\r
+ CountDownModel::GetInstance()->GetChanageToStartCountDownView() == true)\r
+ {\r
+ ChangeView(COUNTDOWN_MAX, START_COUNTDOWN); // 如果倒计时的timer没有结束或需要跳转到开始倒计时界面,则跳转到开始倒计时界面\r
+ }\r
+ else\r
+ {\r
+ ChangeView(COUNTDOWN_MAX, MAIN_COUNTDOWN); // 如果倒计时的timer已经结束,则跳转到主界面\r
+ }\r
+ /* -------------------------------------------------------------------------- */\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+#include "countdown/include/StartCountDownView.h"\r
+#include "countdown/include/MainCountDownPresenter.h"\r
+#include "countdown/include/CountDownModel.h"\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+#include "uicomponents/UIComponents.h"\r
+\r
+/*开始倒计时*/\r
+namespace OHOS\r
+{\r
+\r
+ static StartCountDownView *g_pStartCountDownView{nullptr};\r
+\r
+ StartCountDownView::StartCountDownView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartCountDownView::StartCountDownView");\r
+ g_pStartCountDownView = this;\r
+ }\r
+\r
+ StartCountDownView::~StartCountDownView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartCountDownView::~StartCountDownView");\r
+ ClearAll();\r
+ g_pStartCountDownView = nullptr;\r
+ }\r
+\r
+ StartCountDownView *StartCountDownView::GetInstance()\r
+ {\r
+ return g_pStartCountDownView;\r
+ }\r
+\r
+ void StartCountDownView::ClearAll()\r
+ {\r
+ scrollView->RemoveAll();\r
+\r
+ if (Title != nullptr)\r
+ {\r
+ delete Title;\r
+ Title = nullptr;\r
+ }\r
+\r
+ if (showCountDownTimelabel != nullptr)\r
+ {\r
+ delete showCountDownTimelabel;\r
+ showCountDownTimelabel = nullptr;\r
+ }\r
+\r
+ if (vectorImage != nullptr)\r
+ {\r
+ delete vectorImage;\r
+ vectorImage = nullptr;\r
+ }\r
+ if (showTheRingTime != nullptr)\r
+ {\r
+ delete showTheRingTime;\r
+ showTheRingTime = nullptr;\r
+ }\r
+\r
+ if (play_or_pause_toggleButton != nullptr)\r
+ {\r
+ delete play_or_pause_toggleButton;\r
+ play_or_pause_toggleButton = nullptr;\r
+ }\r
+\r
+ if (endbutton != nullptr)\r
+ {\r
+ delete endbutton;\r
+ endbutton = nullptr;\r
+ }\r
+\r
+ if (nullptr != RepeatButton)\r
+ {\r
+ delete RepeatButton;\r
+ RepeatButton = nullptr;\r
+ }\r
+\r
+ if (nullptr != showTheEndRingTime)\r
+ {\r
+ delete showTheEndRingTime;\r
+ showTheEndRingTime = nullptr;\r
+ }\r
+ if (nullptr != vectorbigImage)\r
+ {\r
+ delete vectorbigImage;\r
+ vectorbigImage = nullptr;\r
+ }\r
+ if (scrollView != nullptr)\r
+ {\r
+ delete scrollView;\r
+ scrollView = nullptr;\r
+ }\r
+ }\r
+ void StartCountDownView::SetEndView()\r
+ {\r
+ /*最后显示图片*/\r
+ InitImageView(vectorbigImage, 183, 120, 100, 100, "image", VectorBigImagesPath);\r
+\r
+ /*显示时间字符串*/\r
+ std::string EndTimeStr = CountDownModel::GetInstance()->GetCountDownTime();\r
+ InitLabel(showTheEndRingTime, 83, 240, 300, 47, "title", EndTimeStr.c_str(), GILROY_BOLD_FONT, 40);\r
+\r
+ /*结束前先隐藏*/\r
+ vectorbigImage->SetVisible(false);\r
+ showTheEndRingTime->SetVisible(false);\r
+ }\r
+ UIScrollView *StartCountDownView::StartCountDownViewInit()\r
+ {\r
+ if (scrollView == nullptr)\r
+ {\r
+ scrollView = new UIScrollView();\r
+ scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ scrollView->SetViewId(STARTCOUNTDOWNVIEW);\r
+ scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);\r
+ /* -------------------------------------------------------------------------- */\r
+ Title = new UILabelExt();\r
+ if (Title == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeNotNullView::Title is is new fail!!");\r
+ return nullptr;\r
+ }\r
+ Title->SetPosition(83, 50, 300, 35);\r
+ Title->SetStyle(STYLE_TEXT_FONT, 30);\r
+ Title->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ Title->SetTextId(STR_COUNT_DOWN); // 倒计时\r
+ Title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ Title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ Title->SetRollSpeed(23);\r
+ Title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ /* -------------------------------------------------------------------------- */\r
+ showCountDownTimelabel = new UILabelExt();\r
+ if (showCountDownTimelabel == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showCountDownTimelabel is new fail!!");\r
+ return nullptr;\r
+ }\r
+ showCountDownTimelabel->SetPosition(33, 138, 400, 94);\r
+ showCountDownTimelabel->SetStyle(STYLE_TEXT_FONT, 80);\r
+ showCountDownTimelabel->SetStyle(STYLE_LINE_HEIGHT, 94);\r
+ if (CountDownModel::GetInstance()->CountDownTimerIsEnd()) // 如果定时器是停的,显示设置的倒计时时间\r
+ showCountDownTimelabel->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str());\r
+ else\r
+ showCountDownTimelabel->SetText(CountDownModel::GetInstance()->DisplayCountDownDuration());\r
+ showCountDownTimelabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ showCountDownTimelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ showCountDownTimelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 80);\r
+ showCountDownTimelabel->SetRollSpeed(23);\r
+ /* -------------------------------------------------------------------------- */\r
+ vectorImage = new UIImageView();\r
+ if (vectorImage == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "vectorImage is new fail!!");\r
+ return nullptr;\r
+ }\r
+ vectorImage->SetPosition(174, 247, 28, 28);\r
+ vectorImage->SetSrc(VectorImagesPath);\r
+ /* -------------------------------------------------------------------------- */\r
+ showTheRingTime = new UILabelExt();\r
+ if (showTheRingTime == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "showTheRingTime is new fail!!");\r
+ return nullptr;\r
+ }\r
+ showTheRingTime->SetPosition(209, 241, 81, 41);\r
+ showTheRingTime->SetStyle(STYLE_TEXT_FONT, 35);\r
+ showTheRingTime->SetStyle(STYLE_LINE_HEIGHT, 41);\r
+ showTheRingTime->SetText(CountDownModel::GetInstance()->GetRingTime().c_str());\r
+ showTheRingTime->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);\r
+ showTheRingTime->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff));\r
+ showTheRingTime->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ showTheRingTime->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 35);\r
+ /* -------------------------------------------------------------------------- */\r
+ play_or_pause_toggleButton = new UIToggleButton();\r
+ if (play_or_pause_toggleButton == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "play_or_pause_toggleButton is new fail!!");\r
+ return nullptr;\r
+ }\r
+ play_or_pause_toggleButton->SetPosition(248, 321, 100, 100);\r
+ play_or_pause_toggleButton->SetViewId(PlayOrPauseToggleButton_ViewID);\r
+ play_or_pause_toggleButton->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
+ play_or_pause_toggleButton->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ if (CountDownModel::GetInstance()->CountDownTimerIsEnd() || CountDownModel::GetInstance()->GetCountDownTimerIsPause()) // 如果定时器是停的\r
+ play_or_pause_toggleButton->SetState(false);\r
+ else\r
+ play_or_pause_toggleButton->SetState(true);\r
+ play_or_pause_toggleButton->SetImages(CountDown_Play_ImagePath, CountDown_PAUSE_ImagePath);\r
+ UICheckBox::OnChangeListener *ToggleButtonChange = static_cast<UICheckBox::OnChangeListener *>(MainCountDownPresenter::GetInstance());\r
+ play_or_pause_toggleButton->SetOnChangeListener(ToggleButtonChange);\r
+ play_or_pause_toggleButton->SetVisible(true);\r
+\r
+ /* -------------------------------------------------------------------------- */\r
+ endbutton = new UIButton();\r
+ if (endbutton == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "endbutton is new fail!!");\r
+ return nullptr;\r
+ }\r
+ endbutton->SetPosition(118, 321, 100, 100);\r
+ endbutton->SetViewId(STARTCOUNTDOWNVIEWRETURNBUTTON);\r
+ endbutton->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);\r
+ endbutton->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
+ endbutton->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ endbutton->SetImageSrc(EndButton_ImagePath, EndButton_ImagePath);\r
+ endbutton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED);\r
+ endbutton->SetStyleForState(STYLE_BORDER_RADIUS, 100, UIButton::PRESSED);\r
+ UIView::OnClickListener *buttonClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
+ if (buttonClick == nullptr)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "buttonClick is new fail!!");\r
+ return nullptr;\r
+ }\r
+ endbutton->SetOnClickListener(buttonClick);\r
+ RepeatButton = new UIButton();\r
+ if (nullptr == RepeatButton)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "endbutton is new fail!!");\r
+ return nullptr;\r
+ }\r
+ RepeatButton->SetPosition(248, 321, 100, 100);\r
+ RepeatButton->SetViewId(RepeatButtonViewID);\r
+ RepeatButton->SetStyle(STYLE_BACKGROUND_COLOR, 0x00);\r
+ RepeatButton->SetStyle(STYLE_BACKGROUND_OPA, 0x00);\r
+ RepeatButton->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ RepeatButton->SetImageSrc(RepeatButtonImagePath, RepeatButtonImagePath);\r
+ RepeatButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffa800, UIButton::PRESSED);\r
+ RepeatButton->SetStyleForState(STYLE_BORDER_RADIUS, 100, UIButton::PRESSED);\r
+ UIView::OnClickListener *RepeatButtonClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
+ RepeatButton->SetOnClickListener(RepeatButtonClick);\r
+ RepeatButton->SetVisible(false);\r
+\r
+ SetEndView();\r
+\r
+ /* ----------------------------------- Add ---------------------------------- */\r
+ scrollView->Add(Title);\r
+ scrollView->Add(showCountDownTimelabel);\r
+ scrollView->Add(vectorImage);\r
+ scrollView->Add(showTheRingTime);\r
+ scrollView->Add(endbutton);\r
+ scrollView->Add(play_or_pause_toggleButton);\r
+ scrollView->Add(RepeatButton);\r
+ scrollView->Add(vectorbigImage);\r
+ scrollView->Add(showTheEndRingTime);\r
+ }\r
+\r
+ return scrollView;\r
+ }\r
+\r
+ // 获取显示倒计时时间标签\r
+ UILabelExt *StartCountDownView::GetShowCountDownTimelabel(void)\r
+ {\r
+ return showCountDownTimelabel;\r
+ }\r
+\r
+ // 获取显示响铃时间标签\r
+ UILabelExt *StartCountDownView::GetShowTheRingTimelabel(void)\r
+ {\r
+ return showTheRingTime;\r
+ }\r
+\r
+ UIToggleButton *StartCountDownView::GetPlayOrPauseToggleButton(void)\r
+ {\r
+ return play_or_pause_toggleButton;\r
+ }\r
+\r
+ UIButton *StartCountDownView::GetRepeatButton(void)\r
+ {\r
+ return RepeatButton;\r
+ }\r
+\r
+ void StartCountDownView::SetImageAndLabel(bool state)\r
+ {\r
+ if (vectorImage == nullptr || showTheRingTime == nullptr)\r
+ return;\r
+\r
+ vectorImage->SetVisible(state);\r
+ showTheRingTime->SetVisible(state);\r
+ }\r
+ /*结束状态更新*/\r
+ void StartCountDownView::ShowEndView(bool state)\r
+ {\r
+ if (vectorImage == nullptr || showTheRingTime == nullptr || showCountDownTimelabel == nullptr)\r
+ return;\r
+\r
+ vectorImage->SetVisible(!state);\r
+ showTheRingTime->SetVisible(!state);\r
+ showCountDownTimelabel->SetVisible(!state);\r
+\r
+ vectorbigImage->SetVisible(state);\r
+ showTheEndRingTime->SetVisible(state);\r
+ showTheEndRingTime->SetText(showTheRingTime->GetText());\r
+ }\r
+ void StartCountDownView::UpdateimageAndLabelPosition(void)\r
+ {\r
+ if (vectorImage == nullptr || showTheRingTime == nullptr)\r
+ return;\r
+ int w = vectorImage->GetWidth() + showTheRingTime->GetTextWidth() + 7;\r
+ vectorImage->SetX((Screen::GetInstance().GetWidth() - w) / 2);\r
+ showTheRingTime->SetX(vectorImage->GetX() + vectorImage->GetWidth() + 7);\r
+ vectorImage->Invalidate();\r
+ showTheRingTime->Invalidate();\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+/*
+ * @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
--- /dev/null
+/*
+ * @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<FindPhoneView>,
+ 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
--- /dev/null
+/*
+ * @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<FindPhonePresenter>
+ {
+ 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
--- /dev/null
+/*
+ * @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 <custom_runtime.h>
+#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
--- /dev/null
+/*
+ * @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<FindPhoneView>::OnPause();
+ }
+
+ void FindPhonePresenter::OnResume(void)
+ {
+ Presenter<FindPhoneView>::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<uint16_t>(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
--- /dev/null
+/***
+ * @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
--- /dev/null
+
+#ifndef __SCHEDULEDATA_H__
+#define __SCHEDULEDATA_H__
+
+// #include "ohos_types.h"
+#include <string>
+
+#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
--- /dev/null
+
+#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<ScheduleListItemInfo> nodeList_;
+ UIView::OnClickListener * itemClickListener_;
+ };
+}
+#endif
--- /dev/null
+
+#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
--- /dev/null
+\r
+#ifndef __SCHEDULEMODEL_H__\r
+#define __SCHEDULEMODEL_H__\r
+\r
+#include "ohos_types.h"\r
+#include "schedule/include/ScheduleListItem.h"\r
+#include "schedule/include/ScheduleData.h"\r
+\r
+\r
+namespace OHOS\r
+{\r
+ class ScheduleModel\r
+ {\r
+ public:\r
+ static ScheduleModel &GetInstance(void);\r
+\r
+ ScheduleListItemInfo * ScheduleAllItemDataGet(void);\r
+ uint8_t ScheduleItemDataCountGet(void);\r
+ uint8_t ScheduleOriginalDataCountGet(void);\r
+\r
+ std::string ScheduleItemDataDateStrGet(uint8_t index);\r
+ std::string ScheduleItemDataTopicStrGet(uint8_t index);\r
+ std::string ScheduleItemDataTimeStrGet(uint8_t index);\r
+ std::string ScheduleItemDataContentStrGet(uint8_t index);\r
+ uint8_t ScheduleItemDataOriginalDataIndexGet(uint8_t index);\r
+ \r
+ void ScheduleOriginalDataSetByApp(ScheduleRevData * data, uint8_t index, bool is_finish);\r
+ void ScheduleOriginalDataSetByUI(uint8_t index);\r
+\r
+ int ScheduleDataReadFromFile(void);\r
+ int ScheduleDataWriteToFile(void);\r
+\r
+ void DataStringToCharArray(void);\r
+ void DataCharArrayToString(uint8_t DataCount);\r
+\r
+ private:\r
+ ScheduleModel();\r
+ ~ScheduleModel();\r
+ ScheduleModel(const ScheduleModel &) = delete;\r
+ ScheduleModel &operator=(const ScheduleModel &) = delete;\r
+\r
+ void ScheduleItemDataCountSet(uint8_t count);\r
+ void ScheduleOriginalDataCountSet(uint8_t count);\r
+ void ScheduleOriginalDataToItemData(uint8_t DataCount);\r
+\r
+ // original data\r
+ ScheduleRevData ScheduleOriginalData_[SCHEDULE_DATA_COUNT_MAX] = {nullptr, nullptr, nullptr, nullptr};\r
+ C_ScheduleRevData C_ScheduleOriginalData_[SCHEDULE_DATA_COUNT_MAX] = {0};\r
+ // item data\r
+ ScheduleListItemInfo ScheduleItemData_[SCHEDULE_DATA_COUNT_MAX*2] = {nullptr, nullptr, nullptr, nullptr, 0, false, 0};\r
+ uint8_t ItemCount_{0};\r
+ uint8_t DataCount_{0};\r
+ };\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+\r
+#ifndef __SCHEDULEPRESENTER_H__\r
+#define __SCHEDULEPRESENTER_H__\r
+\r
+#include "Presenter.h"\r
+#include "View.h"\r
+\r
+#include "schedule/include/ScheduleView.h"\r
+#include "schedule/include/ScheduleModel.h"\r
+\r
+\r
+namespace OHOS\r
+{\r
+ class ScheduleView;\r
+ class ScheduleModel;\r
+ class SchedulePresenter : public Presenter<ScheduleView>,\r
+ public UIView::OnClickListener,\r
+ public UIView::OnDragListener,\r
+ public RootView::OnKeyActListener\r
+ {\r
+ public:\r
+ SchedulePresenter();\r
+ virtual ~SchedulePresenter();\r
+ static SchedulePresenter * GetInstance();\r
+\r
+ void OnStart() override;\r
+ void OnResume() override;\r
+ void OnPause() override;\r
+ void OnStop() override;\r
+\r
+ private:\r
+ bool OnClick(UIView &view, const ClickEvent &event) override;\r
+ bool OnDrag(UIView &view, const DragEvent &event) override;\r
+ bool OnDragEnd(UIView &view, const DragEvent &event) override;\r
+ bool OnKeyAct(UIView &view, const KeyEvent &event) override;\r
+\r
+ ScheduleModel * ScheduleModel_;\r
+ bool X_DRAG_FLAG{false};\r
+ };\r
+}\r
+\r
+#endif
\ No newline at end of file
--- /dev/null
+\r
+#ifndef __SCHEDULEVIEW_H__\r
+#define __SCHEDULEVIEW_H__\r
+\r
+#include "View.h"\r
+#include "ohos_types.h"\r
+#include "components/ui_view_group.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_scroll_view.h"\r
+// #include "components/ui_button.h"\r
+#include "components/ui_label_button_ext.h"\r
+#include "common/screen.h"\r
+#include "ui_resource_string.h"\r
+\r
+#include "schedule/include/SchedulePresenter.h"\r
+#include "schedule/include/ScheduleListAdapter.h"\r
+#include "schedule/include/ScheduleListItem.h"\r
+\r
+\r
+namespace OHOS\r
+{\r
+ #define SCHEDULE_ViewId_NoDataGroup_ "SCHEDULE_ViewId_ContentDeleteButton_"\r
+ #define SCHEDULE_ViewId_DataGroup_ "SCHEDULE_ViewId_DataGroup_"\r
+ #define SCHEDULE_ViewId_ContentGroup_ "SCHEDULE_ViewId_ContentGroup_"\r
+ #define SCHEDULE_ViewId_DeleteGroup_ "SCHEDULE_ViewId_DeleteGroup_"\r
+\r
+ #define SCHEDULE_ViewId_ContentDeleteButton_ "SCHEDULE_ViewId_ContentDeleteButton_"\r
+ #define SCHEDULE_ViewId_ContentCloseButton_ "SCHEDULE_ViewId_ContentCloseButton_"\r
+ #define SCHEDULE_ViewId_DeleteCancelButton_ "SCHEDULE_ViewId_DeleteCancelButton_"\r
+ #define SCHEDULE_ViewId_DeleteOKButton_ "SCHEDULE_ViewId_DeleteOKButton_"\r
+\r
+ class SchedulePresenter;\r
+ class ScheduleView : public View<SchedulePresenter>\r
+ {\r
+ public:\r
+ ScheduleView();\r
+ ~ScheduleView();\r
+ static ScheduleView * GetInstance(void);\r
+\r
+ void OnStart() override;\r
+ void OnStop() override;\r
+\r
+ void ItemListAdd(const ScheduleListItemInfo &item);\r
+ void ItemListClear(void);\r
+ void ItemListContentUpdate(void);\r
+ void ItemListScrollByUpdate(bool isUpScroll = false);\r
+ \r
+ void ContentScreenItemIndexSet(uint8_t index);\r
+ uint8_t ContentScreenItemIndexGet(void);\r
+\r
+ void DisplayDataOrNoScreen(void);\r
+ void DisplayContentScreen(void);\r
+ void DisplayDeleteScreen(void);\r
+\r
+ void SetViewFocus(bool val);\r
+\r
+ private:\r
+\r
+ void ResetScheduleList(void);\r
+\r
+ UIViewGroup * InitNoDataScreen();\r
+ void DeinitNoDataScreen();\r
+ UILabelExt * InitLabel(int16_t x, int16_t y, int16_t width, int16_t height,\r
+ uint16_t line_height, uint8_t font_size, uint16_t text_id, uint32_t text_color);\r
+\r
+ UIViewGroup * NoDataGroup_{nullptr};\r
+ UILabelExt * LabelExt0_{nullptr};\r
+ UIImageView * ImageView_{nullptr};\r
+ UILabelExt * LabelExt1_{nullptr};\r
+ UILabelExt * LabelExt2_{nullptr};\r
+\r
+\r
+ UIViewGroup * InitDataScreen();\r
+ void DeinitDataScreen();\r
+ UIViewGroup * DataGroup_{nullptr};\r
+ UIList * ScheduleList_{nullptr};\r
+ ScheduleListAdapter * ScheduleListAdapter_{nullptr};\r
+\r
+\r
+ UIScrollView * InitContentScreen();\r
+ void DeinitContentScreen();\r
+ UIScrollView * ContentGroup_{nullptr};\r
+ UILabelExt * ContentDateLabelExt_{nullptr};\r
+ UILabelExt * ContentTopicLabelExt_{nullptr};\r
+ UILabelExt * ContentTopicLabelExt1_{nullptr};\r
+ UILabelExt * ContentTimeLabelExt_{nullptr};\r
+ UILabelExt * ContentTimeLabelExt1_{nullptr};\r
+ UILabelExt * ContentContentLabelExt_{nullptr};\r
+ UILabelExt * ContentContentLabelExt1_{nullptr};\r
+ UILabelButtonExt * ContentDeleteButton_{nullptr};\r
+ UILabelButtonExt * ContentCloseButton_{nullptr};\r
+ uint8_t ContentItemIndex_{0};\r
+\r
+\r
+ UIViewGroup * InitDeleteScreen();\r
+ void DeinitDeleteScreen();\r
+ UIViewGroup * DeleteGroup_{nullptr};\r
+ UILabelExt * DeleteTitleLabelExt_{nullptr};\r
+ UILabelExt * DeletePromptLabelExt_{nullptr};\r
+ UILabelButtonExt * DeleteCancelButton_{nullptr};\r
+ UILabelButtonExt * DeleteOKButton_{nullptr};\r
+\r
+\r
+ void DisplaySelectScreen(uint8_t ScreenIndex);\r
+ typedef enum\r
+ {\r
+ ENUM_SCHEDULE_SCREEN_NO_DATA,\r
+ ENUM_SCHEDULE_SCREEN_LIST,\r
+ ENUM_SCHEDULE_SCREEN_CONTENT,\r
+ ENUM_SCHEDULE_SCREEN_DELETE,\r
+\r
+ ENUM_SCHEDULE_SCREEN_MAX\r
+ }ENUM_SCHEDULE_SCREEN;\r
+ UIViewGroup * ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_MAX]{nullptr};\r
+\r
+\r
+ #define SCREEN_WIDTH (Screen::GetInstance().GetWidth())\r
+ #define SCREEN_HEIGHT (Screen::GetInstance().GetHeight())\r
+ #define LIST_LEFT (43)\r
+ #define LIST_TOP (50)\r
+ #define LIST_WIDTH (SCREEN_WIDTH - LIST_LEFT * 2)\r
+ #define LIST_HEIGHT (SCREEN_HEIGHT - LIST_TOP * 2)\r
+\r
+ #define NO_DATA_IMAGE "/user/res/Schedule/schedule_no_data.bin"\r
+ };\r
+}\r
+#endif\r
--- /dev/null
+#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<ScheduleListItemInfo> * 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<ScheduleListItem *>(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;
+ }
+
+}
--- /dev/null
+
+#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);
+ }
+ }
+
+}
--- /dev/null
+\r
+// #include <sys/stat.h>\r
+// #include <iostream>\r
+// #include <fstream>\r
+#include "schedule/include/ScheduleModel.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS\r
+{\r
+ ScheduleModel::ScheduleModel(){}\r
+\r
+ ScheduleModel::~ScheduleModel(){}\r
+\r
+ ScheduleModel &ScheduleModel::GetInstance()\r
+ {\r
+ static ScheduleModel instance;\r
+ return instance;\r
+ }\r
+\r
+ uint8_t ScheduleModel::ScheduleItemDataCountGet(void)\r
+ {\r
+ return ItemCount_;\r
+ }\r
+\r
+ void ScheduleModel::ScheduleItemDataCountSet(uint8_t count)\r
+ {\r
+ ItemCount_ = count;\r
+ }\r
+\r
+ uint8_t ScheduleModel::ScheduleOriginalDataCountGet(void)\r
+ {\r
+ return DataCount_;\r
+ }\r
+\r
+ void ScheduleModel::ScheduleOriginalDataCountSet(uint8_t count)\r
+ {\r
+ DataCount_ = count;\r
+ }\r
+\r
+ ScheduleListItemInfo *ScheduleModel::ScheduleAllItemDataGet(void)\r
+ {\r
+ return ScheduleItemData_;\r
+ }\r
+\r
+ std::string ScheduleModel::ScheduleItemDataDateStrGet(uint8_t index)\r
+ {\r
+ return ScheduleItemData_[index].DateStr.c_str();\r
+ }\r
+\r
+ std::string ScheduleModel::ScheduleItemDataTopicStrGet(uint8_t index)\r
+ {\r
+ return ScheduleItemData_[index].TopicStr.c_str();\r
+ }\r
+\r
+ std::string ScheduleModel::ScheduleItemDataTimeStrGet(uint8_t index)\r
+ {\r
+ return ScheduleItemData_[index].TimeStr.c_str();\r
+ }\r
+\r
+ std::string ScheduleModel::ScheduleItemDataContentStrGet(uint8_t index)\r
+ {\r
+ return ScheduleItemData_[index].ContentStr.c_str();\r
+ }\r
+\r
+ uint8_t ScheduleModel::ScheduleItemDataOriginalDataIndexGet(uint8_t index)\r
+ {\r
+ return ScheduleItemData_[index].OriginalDataIndex;\r
+ }\r
+\r
+ void ScheduleModel::ScheduleOriginalDataSetByApp(ScheduleRevData *data, uint8_t index, bool is_finish)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleOriginalDataSetByApp,%d,%d", index, is_finish);\r
+ uint8_t len = 0;\r
+ if (index >= SCHEDULE_DATA_COUNT_MAX)\r
+ {\r
+ return;\r
+ }\r
+\r
+ ScheduleOriginalData_[index].date.assign(data->date);\r
+\r
+ len = ((SCHEDULE_TOPIC_STR_MAX - 1 > data->topic.length()) ? data->topic.length() : SCHEDULE_TOPIC_STR_MAX - 1);\r
+ ScheduleOriginalData_[index].topic.assign(data->topic, 0, len);\r
+\r
+ ScheduleOriginalData_[index].time.assign(data->time);\r
+\r
+ len = ((SCHEDULE_CONTENT_STR_MAX - 1 > data->content.length()) ? data->content.length() : SCHEDULE_CONTENT_STR_MAX - 1);\r
+ ScheduleOriginalData_[index].content.assign(data->content, 0, len);\r
+\r
+ if (true == is_finish)\r
+ {\r
+ uint8_t DataCount = index + 1;\r
+ ScheduleOriginalDataCountSet(DataCount);\r
+ ScheduleOriginalDataToItemData(DataCount);\r
+ }\r
+ }\r
+\r
+ void ScheduleModel::ScheduleOriginalDataSetByUI(uint8_t index)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleModel::ScheduleOriginalDataSetByUI,%d", index);\r
+\r
+ uint8_t DataCount = ScheduleOriginalDataCountGet();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleModel::DataCount:%d", DataCount);\r
+ uint8_t i = 0;\r
+ for (i = index; i < (DataCount - 1); i++)\r
+ {\r
+ ScheduleOriginalData_[i].date.assign(ScheduleOriginalData_[i + 1].date);\r
+ ScheduleOriginalData_[i].topic.assign(ScheduleOriginalData_[i + 1].topic);\r
+ ScheduleOriginalData_[i].time.assign(ScheduleOriginalData_[i + 1].time);\r
+ ScheduleOriginalData_[i].content.assign(ScheduleOriginalData_[i + 1].content);\r
+ }\r
+\r
+ ScheduleOriginalData_[i].date.clear();\r
+ ScheduleOriginalData_[i].topic.clear();\r
+ ScheduleOriginalData_[i].time.clear();\r
+ ScheduleOriginalData_[i].content.clear();\r
+\r
+ DataCount -= 1;\r
+ ScheduleOriginalDataCountSet(DataCount);\r
+ ScheduleOriginalDataToItemData(DataCount);\r
+ }\r
+\r
+ void ScheduleModel::ScheduleOriginalDataToItemData(uint8_t DataCount)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleModel::ScheduleOriginalDataToItemData,%d", DataCount);\r
+ uint8_t i = 0;\r
+ uint8_t j = 0;\r
+\r
+ memset(ScheduleItemData_, 0x0, sizeof(ScheduleListItemInfo) * SCHEDULE_DATA_COUNT_MAX * 2);\r
+ ScheduleItemDataCountSet(0);\r
+\r
+ for (i = 0, j = 0; i < DataCount; i++)\r
+ {\r
+ if (0 == i)\r
+ {\r
+ ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date);\r
+ ScheduleItemData_[j].OriginalDataIndex = i;\r
+ ScheduleItemData_[j].IsDateItem = true;\r
+\r
+ j++;\r
+ ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date);\r
+ ScheduleItemData_[j].TopicStr.assign(ScheduleOriginalData_[i].topic);\r
+ ScheduleItemData_[j].TimeStr.assign(ScheduleOriginalData_[i].time);\r
+ ScheduleItemData_[j].ContentStr.assign(ScheduleOriginalData_[i].content);\r
+ ScheduleItemData_[j].OriginalDataIndex = i;\r
+ ScheduleItemData_[j].IsDateItem = false;\r
+ ScheduleItemData_[j].ChildIndex = 0;\r
+ }\r
+ else\r
+ {\r
+ if (0 == ScheduleOriginalData_[i].date.compare(ScheduleOriginalData_[i - 1].date))\r
+ {\r
+ j++;\r
+ ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date);\r
+ ScheduleItemData_[j].TopicStr.assign(ScheduleOriginalData_[i].topic);\r
+ ScheduleItemData_[j].TimeStr.assign(ScheduleOriginalData_[i].time);\r
+ ScheduleItemData_[j].ContentStr.assign(ScheduleOriginalData_[i].content);\r
+ ScheduleItemData_[j].OriginalDataIndex = i;\r
+ ScheduleItemData_[j].IsDateItem = false;\r
+ ScheduleItemData_[j].ChildIndex = ScheduleItemData_[j - 1].ChildIndex + 1;\r
+ }\r
+ else\r
+ {\r
+ j++;\r
+ ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date);\r
+ ScheduleItemData_[j].OriginalDataIndex = i;\r
+ ScheduleItemData_[j].IsDateItem = true;\r
+\r
+ j++;\r
+ ScheduleItemData_[j].DateStr.assign(ScheduleOriginalData_[i].date);\r
+ ScheduleItemData_[j].TopicStr.assign(ScheduleOriginalData_[i].topic);\r
+ ScheduleItemData_[j].TimeStr.assign(ScheduleOriginalData_[i].time);\r
+ ScheduleItemData_[j].ContentStr.assign(ScheduleOriginalData_[i].content);\r
+ ScheduleItemData_[j].OriginalDataIndex = i;\r
+ ScheduleItemData_[j].IsDateItem = false;\r
+ ScheduleItemData_[j].ChildIndex = 0;\r
+ }\r
+ }\r
+\r
+ if ((SCHEDULE_DATA_COUNT_MAX * 2) <= j)\r
+ {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (0 != DataCount)\r
+ {\r
+ uint8_t ItemCount = j + 1;\r
+ ScheduleItemDataCountSet(ItemCount);\r
+ }\r
+\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleModel::ScheduleOriginalDataToItemData,%d,%s", j, ScheduleItemData_[0].DateStr.c_str());\r
+ }\r
+\r
+ void ScheduleModel::DataStringToCharArray(void)\r
+ {\r
+ uint8_t DataCount = ScheduleOriginalDataCountGet();\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:DataStringToCharArray,%d", __LINE__, DataCount);\r
+\r
+ memset(C_ScheduleOriginalData_, 0x0, sizeof(C_ScheduleRevData) * SCHEDULE_DATA_COUNT_MAX);\r
+\r
+ uint8_t i = 0;\r
+ for (i = 0; i < DataCount; i++)\r
+ {\r
+ memcpy(C_ScheduleOriginalData_[i].date, ScheduleOriginalData_[i].date.c_str(), SCHEDULE_DATE_STR_MAX - 1);\r
+ memcpy(C_ScheduleOriginalData_[i].topic, ScheduleOriginalData_[i].topic.c_str(), SCHEDULE_TOPIC_STR_MAX - 1);\r
+ memcpy(C_ScheduleOriginalData_[i].time, ScheduleOriginalData_[i].time.c_str(), SCHEDULE_TIME_STR_MAX - 1);\r
+ memcpy(C_ScheduleOriginalData_[i].content, ScheduleOriginalData_[i].content.c_str(), SCHEDULE_CONTENT_STR_MAX - 1);\r
+ }\r
+ }\r
+\r
+ void ScheduleModel::DataCharArrayToString(uint8_t DataCount)\r
+ {\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:DataCharArrayToString,%d", __LINE__, DataCount);\r
+\r
+ uint8_t i = 0;\r
+ for (i = 0; i < DataCount; i++)\r
+ {\r
+ ScheduleOriginalData_[i].date.assign(C_ScheduleOriginalData_[i].date);\r
+ ScheduleOriginalData_[i].topic.assign(C_ScheduleOriginalData_[i].topic);\r
+ ScheduleOriginalData_[i].time.assign(C_ScheduleOriginalData_[i].time);\r
+ ScheduleOriginalData_[i].content.assign(C_ScheduleOriginalData_[i].content);\r
+ }\r
+ ScheduleOriginalDataCountSet(DataCount);\r
+ }\r
+\r
+ // int C_ScheduleDataReadFromFile(void)\r
+ int ScheduleModel::ScheduleDataReadFromFile(void)\r
+ {\r
+ FILE *fp = fopen(SCHEDULE_DATA_FILE, "rb");\r
+ if (fp == nullptr)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:C_ScheduleDataReadFromFile", __LINE__);\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ fseek(fp, 0, SEEK_END);\r
+ int len = ftell(fp);\r
+ fseek(fp, 0, SEEK_SET);\r
+ uint8_t DataCount = len / sizeof(C_ScheduleRevData);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:%d,%d", __LINE__, DataCount, len);\r
+ fread((char *)C_ScheduleOriginalData_, sizeof(C_ScheduleRevData), DataCount, fp);\r
+ fclose(fp);\r
+\r
+ DataCharArrayToString(DataCount);\r
+\r
+ ScheduleOriginalDataCountSet(DataCount);\r
+ ScheduleOriginalDataToItemData(DataCount);\r
+\r
+ return OHOS_SUCCESS;\r
+ }\r
+\r
+ // int C_ScheduleDataWriteToFile(void)\r
+ int ScheduleModel::ScheduleDataWriteToFile(void)\r
+ {\r
+ uint8_t DataCount = ScheduleOriginalDataCountGet();\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ScheduleDataWriteToFile,%d", __LINE__, DataCount);\r
+ if (0 == DataCount)\r
+ {\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ FILE *fp = fopen(SCHEDULE_DATA_FILE, "wb+");\r
+ if (nullptr == fp)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ScheduleDataWriteToFile fail", __LINE__);\r
+ return OHOS_FAILURE;\r
+ }\r
+\r
+ DataStringToCharArray();\r
+\r
+ size_t ret = fwrite(C_ScheduleOriginalData_, sizeof(C_ScheduleRevData), DataCount, fp);\r
+ if (DataCount != ret)\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ScheduleDataWriteToFile fail", __LINE__);\r
+ }\r
+ fclose(fp);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ScheduleDataWriteToFile success", __LINE__);\r
+\r
+ return OHOS_SUCCESS;\r
+ }\r
+}\r
+\r
+// c func\r
+void C_ScheduleSetByApp(ScheduleRevData *data, uint8_t index, bool is_finish)\r
+{\r
+ OHOS::ScheduleModel::GetInstance().ScheduleOriginalDataSetByApp(data, index, is_finish);\r
+}\r
+\r
+int C_ScheduleDataReadFromFile(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:C_ScheduleDataReadFromFile", __LINE__);\r
+ return OHOS::ScheduleModel::GetInstance().ScheduleDataReadFromFile();\r
+}\r
+\r
+int C_ScheduleDataWriteToFile(void)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:C_ScheduleDataWriteToFile", __LINE__);\r
+ return OHOS::ScheduleModel::GetInstance().ScheduleDataWriteToFile();\r
+}\r
--- /dev/null
+/*\r
+ * @Author: luozheng 1732036298@qq.com\r
+ * @Date: 2024-06-20 15:11:17\r
+ * @LastEditors: luozheng 1732036298@qq.com\r
+ * @LastEditTime: 2024-12-13 16:28:48\r
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/SchedulePresenter.cpp\r
+ */\r
+#include "AppViewIDs.h"\r
+#include "NativeAbility.h"\r
+#include "common/key_code.h"\r
+#include <custom_utils.h>\r
+#include "UiConfig.h"\r
+#include "schedule/include/SchedulePresenter.h"\r
+#include "schedule/include/ScheduleView.h"\r
+#include "NativeRegisterManager.h"\r
+namespace OHOS\r
+{\r
+ REGIST_MENU_PRO(VIEW_SCHEDULE, ScheduleView, SchedulePresenter,\r
+ PNG_APPLIST_SCHEDULE_IMAGE_BIG, PNG_APPLIST_SCHEDULE_IMAGE,PNG_APPLIST_SCHEDULE_IMAGE, "日程", STR_SCHEDULE);\r
+\r
+ // 当前Presenter属性实例化的内存指针\r
+ static SchedulePresenter * p_SchedulePresenterInstance = nullptr;\r
+\r
+ SchedulePresenter::SchedulePresenter()\r
+ {\r
+ ScheduleModel_ = &ScheduleModel::GetInstance();\r
+ p_SchedulePresenterInstance = this;\r
+ }\r
+\r
+ SchedulePresenter::~SchedulePresenter()\r
+ {\r
+ p_SchedulePresenterInstance = nullptr;\r
+ }\r
+\r
+ SchedulePresenter *SchedulePresenter::GetInstance()\r
+ {\r
+ return p_SchedulePresenterInstance;\r
+ }\r
+\r
+ // 启动时执行的逻辑\r
+ void SchedulePresenter::OnStart()\r
+ {\r
+ }\r
+\r
+ // 页面已经展示后的调用逻辑\r
+ void SchedulePresenter::OnResume(void)\r
+ {\r
+ Presenter<ScheduleView>::OnResume();\r
+ if (nullptr == view_)\r
+ {\r
+ return;\r
+ }\r
+\r
+ view_->ItemListContentUpdate();\r
+ }\r
+\r
+ // 页面准备切换到后台前执行的逻辑\r
+ void SchedulePresenter::OnPause(void)\r
+ {\r
+ Presenter<ScheduleView>::OnPause();\r
+ }\r
+\r
+ // 页面完全置于后台时的逻辑。\r
+ void SchedulePresenter::OnStop(void)\r
+ {\r
+ }\r
+\r
+ bool SchedulePresenter::OnClick(UIView &view, const ClickEvent &event)\r
+ {\r
+ UNUSED(event);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:OnClick", __LINE__);\r
+\r
+ // if (nullptr == &view) \r
+ // {\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:OnClick", __LINE__);\r
+ // return false;\r
+ // }\r
+\r
+ if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_ContentDeleteButton_))\r
+ {\r
+ view_->DisplayDeleteScreen();\r
+ return true;\r
+ }\r
+ if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_ContentCloseButton_))\r
+ {\r
+ view_->DisplayDataOrNoScreen();\r
+ return true;\r
+ }\r
+\r
+ if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_DeleteCancelButton_))\r
+ {\r
+ view_->DisplayContentScreen();\r
+ return true;\r
+ }\r
+ if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_DeleteOKButton_))\r
+ {\r
+ ScheduleModel_->ScheduleOriginalDataSetByUI(view_->ContentScreenItemIndexGet() / 2);\r
+ view_->ItemListContentUpdate();\r
+ view_->DisplayDataOrNoScreen();\r
+ view_->ItemListScrollByUpdate();\r
+ return true;\r
+ }\r
+\r
+ ScheduleListItem * item = static_cast<ScheduleListItem *>(&view);\r
+ view_->ContentScreenItemIndexSet(item->GetViewIndex());\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:OnClick,index:%d", __LINE__,item->GetViewIndex());\r
+ view_->DisplayContentScreen();\r
+\r
+ return true;\r
+ }\r
+\r
+ bool SchedulePresenter::OnDrag(UIView &view, const DragEvent &event)\r
+ {\r
+ UNUSED(view);\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SchedulePresenter::OnDrag");\r
+ if ((event.GetDeltaX() > X_DRAG_OFFSET) && (event.GetDeltaX() > (DOUBLES * MATH_ABS(event.GetDeltaY())))) // 拖动过程中判断是否是水平滑动\r
+ {\r
+ SchedulePresenter::X_DRAG_FLAG = true;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ bool SchedulePresenter::OnDragEnd(UIView &view, const DragEvent &event)\r
+ {\r
+ UNUSED(view);\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SchedulePresenter::OnDragEnd");\r
+ if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && SchedulePresenter::X_DRAG_FLAG)\r
+ {\r
+ if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_ContentGroup_))\r
+ {\r
+ view_->DisplayDataOrNoScreen();\r
+ return true;\r
+ }\r
+ if(0 == strcmp(view.GetViewId(), SCHEDULE_ViewId_DeleteGroup_))\r
+ {\r
+ view_->DisplayContentScreen();\r
+ return true;\r
+ }\r
+\r
+ NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);\r
+ SchedulePresenter::X_DRAG_FLAG = false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ bool SchedulePresenter::OnKeyAct(UIView &view, const KeyEvent &event) // 增加按键事件\r
+ {\r
+ UNUSED(view);\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SchedulePresenter::OnKeyAct");\r
+ uint16_t keyID = event.GetKeyId();\r
+ uint16_t keyState = event.GetState();\r
+ // 如果是power键,且是亮屏状态,按键释放就返回上一级\r
+ if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0)\r
+ {\r
+ NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);\r
+ }\r
+ return true;\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+\r
+#include "schedule/include/ScheduleView.h"\r
+#include "UiConfig.h"\r
+#include "wearable_log.h"\r
+\r
+namespace OHOS\r
+{\r
+ static ScheduleView * p_ScheduleViewInstance = nullptr;\r
+\r
+ ScheduleView::ScheduleView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleView::ScheduleView");\r
+ p_ScheduleViewInstance = this;\r
+ }\r
+\r
+ ScheduleView::~ScheduleView()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ScheduleView::~ScheduleView");\r
+ DeinitNoDataScreen();\r
+ DeinitDataScreen();\r
+ DeinitContentScreen();\r
+ DeinitDeleteScreen();\r
+ p_ScheduleViewInstance = nullptr;\r
+ }\r
+\r
+ ScheduleView * ScheduleView::GetInstance()\r
+ {\r
+ return p_ScheduleViewInstance;\r
+ }\r
+\r
+ void ScheduleView::OnStart()\r
+ {\r
+ ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_NO_DATA] = InitNoDataScreen();\r
+ ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_LIST] = InitDataScreen();\r
+ ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_CONTENT] = InitContentScreen();\r
+ ScreenGroupArray_[ENUM_SCHEDULE_SCREEN_DELETE] = InitDeleteScreen();\r
+\r
+ uint8_t i = 0;\r
+ for(i = 0; i < ENUM_SCHEDULE_SCREEN_MAX; i++)\r
+ {\r
+ if(nullptr != ScreenGroupArray_[i])\r
+ {\r
+ AddViewToRootContainer(ScreenGroupArray_[i]);\r
+ }\r
+ }\r
+\r
+ DisplayDataOrNoScreen();\r
+ }\r
+\r
+ void ScheduleView::OnStop()\r
+ {\r
+ \r
+ }\r
+\r
+ void ScheduleView::DisplaySelectScreen(uint8_t ScreenIndex)\r
+ {\r
+ if(ENUM_SCHEDULE_SCREEN_MAX <= ScreenIndex)\r
+ {\r
+ return;\r
+ }\r
+\r
+ uint8_t i = 0;\r
+ for(i = 0; i < ENUM_SCHEDULE_SCREEN_MAX; i++)\r
+ {\r
+ if(nullptr != ScreenGroupArray_[i])\r
+ {\r
+ if(i == ScreenIndex)\r
+ {\r
+ ScreenGroupArray_[i]->SetVisible(true);\r
+ }\r
+ else\r
+ {\r
+ ScreenGroupArray_[i]->SetVisible(false);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ void ScheduleView::DisplayDataOrNoScreen(void)\r
+ {\r
+ if(0 == ScheduleModel::GetInstance().ScheduleItemDataCountGet())\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:DisplayMainScreen", __LINE__);\r
+ DisplaySelectScreen(ENUM_SCHEDULE_SCREEN_NO_DATA);\r
+ }\r
+ else\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:DisplayMainScreen", __LINE__);\r
+ DisplaySelectScreen(ENUM_SCHEDULE_SCREEN_LIST);\r
+\r
+ ResetScheduleList();\r
+ SetViewFocus(true);//列表获取聚焦\r
+ ScheduleList_->RefreshList();\r
+ }\r
+ }\r
+\r
+ void ScheduleView::DisplayContentScreen(void)\r
+ {\r
+ DisplaySelectScreen(ENUM_SCHEDULE_SCREEN_CONTENT);\r
+ SetViewFocus(false);//数据显示视图获取聚焦\r
+\r
+ uint8_t index = ContentScreenItemIndexGet();\r
+ ContentDateLabelExt_->SetText(ScheduleModel::GetInstance().ScheduleItemDataDateStrGet(index).c_str());\r
+\r
+ int16_t temp_y = 0;\r
+ temp_y = ContentDateLabelExt_->GetY() + ContentDateLabelExt_->GetHeight() + 50;\r
+ ContentTopicLabelExt_->SetY(temp_y);\r
+ ContentTopicLabelExt1_->SetY(temp_y);\r
+ ContentTopicLabelExt1_->SetText(ScheduleModel::GetInstance().ScheduleItemDataTopicStrGet(index).c_str());\r
+\r
+ temp_y = ContentTopicLabelExt_->GetY() + ContentTopicLabelExt_->GetHeight() + 20;\r
+ ContentTimeLabelExt_->SetY(temp_y);\r
+ ContentTimeLabelExt1_->SetY(temp_y);\r
+ ContentTimeLabelExt1_->SetText(ScheduleModel::GetInstance().ScheduleItemDataTimeStrGet(index).c_str());\r
+\r
+ if(true == ScheduleModel::GetInstance().ScheduleItemDataContentStrGet(index).empty())\r
+ {\r
+ ContentContentLabelExt_->SetVisible(false);\r
+ ContentContentLabelExt1_->SetVisible(false);\r
+\r
+ temp_y = ContentTimeLabelExt_->GetY() + ContentTimeLabelExt_->GetHeight() + 50;\r
+ ContentDeleteButton_->SetY(temp_y);\r
+ }\r
+ else\r
+ {\r
+ ContentContentLabelExt_->SetVisible(true);\r
+ ContentContentLabelExt1_->SetVisible(true);\r
+\r
+ temp_y = ContentTimeLabelExt_->GetY() + ContentTimeLabelExt_->GetHeight() + 20;\r
+ ContentContentLabelExt_->SetY(temp_y);\r
+ ContentContentLabelExt1_->SetY(temp_y);\r
+ ContentContentLabelExt1_->SetText(ScheduleModel::GetInstance().ScheduleItemDataContentStrGet(index).c_str());\r
+\r
+ temp_y = ContentContentLabelExt1_->GetY() + ContentContentLabelExt1_->GetHeight() + 50;\r
+ ContentDeleteButton_->SetY(temp_y);\r
+ }\r
+\r
+ temp_y = ContentDeleteButton_->GetY() + ContentDeleteButton_->GetHeight() + 20;\r
+ ContentCloseButton_->SetY(temp_y);\r
+ }\r
+\r
+ void ScheduleView::DisplayDeleteScreen(void)\r
+ {\r
+ DisplaySelectScreen(ENUM_SCHEDULE_SCREEN_DELETE);\r
+ }\r
+\r
+ void ScheduleView::DeinitNoDataScreen()\r
+ {\r
+ if (nullptr != NoDataGroup_)\r
+ {\r
+ NoDataGroup_->RemoveAll();\r
+ if (nullptr != LabelExt0_)\r
+ {\r
+ delete LabelExt0_;\r
+ LabelExt0_ = nullptr;\r
+ }\r
+ if (nullptr != ImageView_)\r
+ {\r
+ delete ImageView_;\r
+ ImageView_ = nullptr;\r
+ }\r
+ if (nullptr != LabelExt1_)\r
+ {\r
+ delete LabelExt1_;\r
+ LabelExt1_ = nullptr;\r
+ }\r
+ if (nullptr != LabelExt2_)\r
+ {\r
+ delete LabelExt2_;\r
+ LabelExt2_ = nullptr;\r
+ }\r
+\r
+ delete NoDataGroup_;\r
+ NoDataGroup_ = nullptr;\r
+ }\r
+ }\r
+\r
+ UIViewGroup * ScheduleView::InitNoDataScreen()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]", __LINE__);\r
+ if(nullptr == NoDataGroup_)\r
+ {\r
+ NoDataGroup_ = new UIViewGroup();\r
+ if(nullptr == NoDataGroup_)\r
+ return nullptr;\r
+\r
+ NoDataGroup_->SetPosition(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);\r
+ NoDataGroup_->SetViewId(SCHEDULE_ViewId_NoDataGroup_);\r
+ NoDataGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ NoDataGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ NoDataGroup_->SetOnDragListener(presenter_);\r
+ NoDataGroup_->SetTouchable(true);\r
+ NoDataGroup_->SetDraggable(true);\r
+\r
+ if(nullptr == LabelExt0_)\r
+ {\r
+ LabelExt0_ = InitLabel(83, 50, 300, 35, 35, 30, STR_SCHEDULE_TITLE, Color::White().full);\r
+ if(nullptr == LabelExt0_)\r
+ {\r
+ return nullptr;\r
+ }\r
+ }\r
+\r
+ if(nullptr == ImageView_)\r
+ {\r
+ ImageView_ = new UIImageView();\r
+ if(nullptr == ImageView_)\r
+ {\r
+ return nullptr;\r
+ }\r
+\r
+ ImageView_->SetPosition(175, 150, 116, 120);\r
+ ImageView_->SetSrc(NO_DATA_IMAGE);\r
+ }\r
+\r
+ if(nullptr == LabelExt1_)\r
+ {\r
+ LabelExt1_ = InitLabel(53, 330, 360, 35, 35, 30, STR_SCHEDULE_NO_DATA, 0xff999999);\r
+ if(nullptr == LabelExt1_)\r
+ {\r
+ return nullptr;\r
+ }\r
+ }\r
+\r
+ if(nullptr == LabelExt2_)\r
+ {\r
+ LabelExt2_ = InitLabel(53, 370, 360, 35, 35, 30, STR_SCHEDULE_NO_DATA_PROMPT, 0xff999999);\r
+ if(nullptr == LabelExt2_)\r
+ {\r
+ return nullptr;\r
+ }\r
+ }\r
+\r
+ NoDataGroup_->Add(LabelExt0_);\r
+ NoDataGroup_->Add(ImageView_);\r
+ NoDataGroup_->Add(LabelExt1_);\r
+ NoDataGroup_->Add(LabelExt2_);\r
+ }\r
+\r
+ return NoDataGroup_;\r
+ }\r
+\r
+ void ScheduleView::DeinitDataScreen()\r
+ {\r
+ if (nullptr != DataGroup_)\r
+ {\r
+ DataGroup_->RemoveAll();\r
+ if (nullptr != ScheduleListAdapter_)\r
+ {\r
+ delete ScheduleListAdapter_;\r
+ ScheduleListAdapter_ = nullptr;\r
+ }\r
+ if (nullptr != ScheduleList_)\r
+ {\r
+ delete ScheduleList_;\r
+ ScheduleList_ = nullptr;\r
+ }\r
+\r
+ delete DataGroup_;\r
+ DataGroup_ = nullptr;\r
+ }\r
+ }\r
+\r
+ UIViewGroup * ScheduleView::InitDataScreen()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]", __LINE__);\r
+ if(nullptr == DataGroup_)\r
+ {\r
+ DataGroup_ = new UIViewGroup();\r
+ if(nullptr == DataGroup_)\r
+ return nullptr;\r
+\r
+ DataGroup_->SetPosition(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);\r
+ DataGroup_->SetViewId(SCHEDULE_ViewId_DataGroup_);\r
+ DataGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ DataGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ DataGroup_->SetOnDragListener(presenter_);\r
+ DataGroup_->SetTouchable(true);\r
+ DataGroup_->SetDraggable(true);\r
+\r
+ if(nullptr == ScheduleListAdapter_)\r
+ {\r
+ ScheduleListAdapter_ = new ScheduleListAdapter();\r
+ if(nullptr == ScheduleListAdapter_)\r
+ return nullptr;\r
+ \r
+ ScheduleListAdapter_->SetItemClickListener(presenter_);\r
+ }\r
+\r
+ if(nullptr == ScheduleList_)\r
+ {\r
+ ScheduleList_ = new UIList();\r
+ if(nullptr == ScheduleList_)\r
+ {\r
+ return nullptr;\r
+ }\r
+ }\r
+ ScheduleList_->SetPosition(LIST_LEFT, LIST_TOP, LIST_WIDTH, LIST_HEIGHT);\r
+ // ScheduleList_->SetSelectPosition(VERTICAL_RESOLUTION / 2);\r
+ ScheduleList_->SetDraggable(true);\r
+ ScheduleList_->SetThrowDrag(true);\r
+ // ScheduleList_->EnableAutoAlign(true);\r
+ ScheduleList_->SetAdapter(ScheduleListAdapter_);\r
+ // ScheduleList_->SetScrollStateListener(presenter_);\r
+ ScheduleList_->SetMaxScrollDistance(1000); // 1000: max scroll distance\r
+ ScheduleList_->SetSwipeACCLevel(200); // 800: compensation distance\r
+ ScheduleList_->SetDragACCLevel(5); // 5: drag acceleration\r
+ ScheduleList_->SetYScrollBarVisible(false);\r
+\r
+ // ScheduleList_->SetScrollBlankSize(40);\r
+ ScheduleList_->SetReboundSize(30);\r
+\r
+ ScheduleList_->SetRotateFactor(2); // 增加表冠控制\r
+ ScheduleList_->RequestFocus();\r
+ ResetScheduleList();\r
+\r
+ DataGroup_->Add(ScheduleList_);\r
+ }\r
+\r
+ return DataGroup_;\r
+ }\r
+\r
+ void ScheduleView::DeinitContentScreen()\r
+ {\r
+ if(nullptr != ContentGroup_)\r
+ {\r
+ ContentGroup_->RemoveAll();\r
+ if(nullptr != ContentDateLabelExt_)\r
+ {\r
+ delete ContentDateLabelExt_;\r
+ ContentDateLabelExt_ = nullptr;\r
+ }\r
+ if(nullptr != ContentTopicLabelExt_)\r
+ {\r
+ delete ContentTopicLabelExt_;\r
+ ContentTopicLabelExt_ = nullptr;\r
+ }\r
+ if(nullptr != ContentTopicLabelExt1_)\r
+ {\r
+ delete ContentTopicLabelExt1_;\r
+ ContentTopicLabelExt1_ = nullptr;\r
+ }\r
+ if(nullptr != ContentTimeLabelExt_)\r
+ {\r
+ delete ContentTimeLabelExt_;\r
+ ContentTimeLabelExt_ = nullptr;\r
+ }\r
+ if(nullptr != ContentTimeLabelExt1_)\r
+ {\r
+ delete ContentTimeLabelExt1_;\r
+ ContentTimeLabelExt1_ = nullptr;\r
+ }\r
+ if(nullptr != ContentContentLabelExt_)\r
+ {\r
+ delete ContentContentLabelExt_;\r
+ ContentContentLabelExt_ = nullptr;\r
+ }\r
+ if(nullptr != ContentContentLabelExt1_)\r
+ {\r
+ delete ContentContentLabelExt1_;\r
+ ContentContentLabelExt1_ = nullptr;\r
+ }\r
+ if(nullptr != ContentDeleteButton_)\r
+ {\r
+ delete ContentDeleteButton_;\r
+ ContentDeleteButton_ = nullptr;\r
+ }\r
+ if(nullptr != ContentCloseButton_)\r
+ {\r
+ delete ContentCloseButton_;\r
+ ContentCloseButton_ = nullptr;\r
+ }\r
+ \r
+ delete ContentGroup_;\r
+ ContentGroup_ = nullptr;\r
+ }\r
+ }\r
+\r
+ UIScrollView * ScheduleView::InitContentScreen()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]", __LINE__);\r
+ if(nullptr == ContentGroup_)\r
+ {\r
+ ContentGroup_ = new UIScrollView();\r
+ if(nullptr == ContentGroup_)\r
+ return nullptr;\r
+\r
+ // ContentGroup_->SetViewIndex(ENUM_SCHEDULE_CONTENT_SCREEN);\r
+ ContentGroup_->SetPosition(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);\r
+ ContentGroup_->SetViewId(SCHEDULE_ViewId_ContentGroup_);\r
+ ContentGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ ContentGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ ContentGroup_->SetOnDragListener(presenter_);\r
+ ContentGroup_->SetTouchable(true);\r
+ ContentGroup_->SetDraggable(true);\r
+\r
+ ContentGroup_->SetScrollBlankSize(40);\r
+ ContentGroup_->SetReboundSize(40);\r
+ ContentGroup_->SetDirection(1);\r
+ ContentGroup_->SetMaxScrollDistance(1000);\r
+ ContentGroup_->SetThrowDrag(true);\r
+ // ContentGroup_->RequestFocus();\r
+ ContentGroup_->SetRotateFactor(2);\r
+\r
+ if(nullptr == ContentDateLabelExt_)\r
+ {\r
+ ContentDateLabelExt_ = new UILabelExt();\r
+ if(nullptr == ContentDateLabelExt_)\r
+ return nullptr;\r
+\r
+ ContentDateLabelExt_->SetPosition(83, 50, 300, 35);\r
+ ContentDateLabelExt_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ ContentDateLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ // ContentDateLabelExt_->SetTextId(text_id);\r
+ ContentDateLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ ContentDateLabelExt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ ContentDateLabelExt_->SetRollSpeed(23);\r
+ ContentDateLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentDateLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xffff5a36);\r
+ }\r
+\r
+ if(nullptr == ContentTopicLabelExt_)\r
+ {\r
+ ContentTopicLabelExt_ = new UILabelExt();\r
+ if(nullptr == ContentTopicLabelExt_)\r
+ return nullptr;\r
+\r
+ ContentTopicLabelExt_->SetPosition(53, 0, 360, 35);\r
+ ContentTopicLabelExt_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ ContentTopicLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ ContentTopicLabelExt_->SetTextId(STR_SCHEDULE_TOPIC);\r
+ // ContentTopicLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ ContentTopicLabelExt_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP);\r
+ ContentTopicLabelExt_->SetRollSpeed(23);\r
+ ContentTopicLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentTopicLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xff999999);\r
+ \r
+ if(nullptr == ContentTopicLabelExt1_)\r
+ {\r
+ ContentTopicLabelExt1_ = new UILabelExt();\r
+ if(nullptr == ContentTopicLabelExt1_)\r
+ return nullptr;\r
+\r
+ uint16 x = ContentTopicLabelExt_->GetX();\r
+ uint16 w = ContentTopicLabelExt_->GetTextWidth();\r
+ ContentTopicLabelExt1_->SetPosition(x + w + 5, 0, 360 - w - 5, 35);\r
+ ContentTopicLabelExt1_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ ContentTopicLabelExt1_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ ContentTopicLabelExt1_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ ContentTopicLabelExt1_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP);\r
+ ContentTopicLabelExt1_->SetRollSpeed(23);\r
+ ContentTopicLabelExt1_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentTopicLabelExt1_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ }\r
+ }\r
+\r
+ if(nullptr == ContentTimeLabelExt_)\r
+ {\r
+ ContentTimeLabelExt_ = new UILabelExt();\r
+ if(nullptr == ContentTimeLabelExt_)\r
+ return nullptr;\r
+\r
+ ContentTimeLabelExt_->SetPosition(53, 0, 360, 35);\r
+ ContentTimeLabelExt_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ ContentTimeLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ ContentTimeLabelExt_->SetTextId(STR_SCHEDULE_TIME);\r
+ // ContentTimeLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ ContentTimeLabelExt_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP);\r
+ ContentTimeLabelExt_->SetRollSpeed(23);\r
+ ContentTimeLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentTimeLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xff999999);\r
+\r
+ if(nullptr == ContentTimeLabelExt1_)\r
+ {\r
+ ContentTimeLabelExt1_ = new UILabelExt();\r
+ if(nullptr == ContentTimeLabelExt1_)\r
+ return nullptr;\r
+\r
+ uint16 x = ContentTimeLabelExt_->GetX();\r
+ uint16 w = ContentTimeLabelExt_->GetTextWidth();\r
+ ContentTimeLabelExt1_->SetPosition(x + w + 5, 0, 360 - w - 5, 35);\r
+ ContentTimeLabelExt1_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ ContentTimeLabelExt1_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ ContentTimeLabelExt1_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ ContentTimeLabelExt1_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP);\r
+ ContentTimeLabelExt1_->SetRollSpeed(23);\r
+ ContentTimeLabelExt1_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentTimeLabelExt1_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ }\r
+ }\r
+\r
+ if(nullptr == ContentContentLabelExt_)\r
+ {\r
+ ContentContentLabelExt_ = new UILabelExt();\r
+ if(nullptr == ContentContentLabelExt_)\r
+ return nullptr;\r
+\r
+ ContentContentLabelExt_->SetPosition(53, 0, 360, 35);\r
+ ContentContentLabelExt_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ ContentContentLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ ContentContentLabelExt_->SetTextId(STR_SCHEDULE_NOTES);\r
+ // ContentContentLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ ContentContentLabelExt_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP);\r
+ ContentContentLabelExt_->SetRollSpeed(23);\r
+ ContentContentLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentContentLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xff999999);\r
+\r
+ if(nullptr == ContentContentLabelExt1_)\r
+ {\r
+ ContentContentLabelExt1_ = new UILabelExt();\r
+ if(nullptr == ContentContentLabelExt1_)\r
+ return nullptr;\r
+\r
+ uint16 x = ContentContentLabelExt_->GetX();\r
+ uint16 w = ContentContentLabelExt_->GetTextWidth();\r
+ ContentContentLabelExt1_->SetPosition(x + w + 5, 0, 360 - w - 5, 35);\r
+ ContentContentLabelExt1_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ ContentContentLabelExt1_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ ContentContentLabelExt1_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ ContentContentLabelExt1_->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP);\r
+ ContentContentLabelExt1_->SetRollSpeed(23);\r
+ ContentContentLabelExt1_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentContentLabelExt1_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ }\r
+ }\r
+\r
+ if(nullptr == ContentDeleteButton_)\r
+ {\r
+ ContentDeleteButton_ = new UILabelButtonExt();\r
+ if(nullptr == ContentDeleteButton_)\r
+ return nullptr;\r
+\r
+ ContentDeleteButton_->SetPosition(93, 0, 280, 90);\r
+ ContentDeleteButton_->SetViewId(SCHEDULE_ViewId_ContentDeleteButton_);\r
+ ContentDeleteButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xfffd5213);\r
+ ContentDeleteButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ ContentDeleteButton_->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ ContentDeleteButton_->SetTextId(STR_DELETE);\r
+ ContentDeleteButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentDeleteButton_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ ContentDeleteButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xfffd5213, UIButton::PRESSED);\r
+ ContentDeleteButton_->SetOnClickListener(presenter_);\r
+ }\r
+\r
+ if(nullptr == ContentCloseButton_)\r
+ {\r
+ ContentCloseButton_ = new UILabelButtonExt();\r
+ if(nullptr == ContentCloseButton_)\r
+ return nullptr;\r
+\r
+ ContentCloseButton_->SetPosition(93, 0, 280, 90);\r
+ ContentCloseButton_->SetViewId(SCHEDULE_ViewId_ContentCloseButton_);\r
+ ContentCloseButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);\r
+ ContentCloseButton_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ ContentCloseButton_->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ ContentCloseButton_->SetTextId(STR_CLOSE);\r
+ ContentCloseButton_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ ContentCloseButton_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ ContentCloseButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff191919, UIButton::PRESSED);\r
+ ContentCloseButton_->SetOnClickListener(presenter_);\r
+ }\r
+\r
+ ContentGroup_->Add(ContentDateLabelExt_);\r
+ ContentGroup_->Add(ContentTopicLabelExt_);\r
+ ContentGroup_->Add(ContentTopicLabelExt1_);\r
+ ContentGroup_->Add(ContentTimeLabelExt_);\r
+ ContentGroup_->Add(ContentTimeLabelExt1_);\r
+ ContentGroup_->Add(ContentContentLabelExt_);\r
+ ContentGroup_->Add(ContentContentLabelExt1_);\r
+ ContentGroup_->Add(ContentDeleteButton_);\r
+ ContentGroup_->Add(ContentCloseButton_);\r
+ }\r
+\r
+ return ContentGroup_;\r
+ }\r
+\r
+ void ScheduleView::DeinitDeleteScreen()\r
+ {\r
+ if(nullptr != DeleteGroup_)\r
+ {\r
+ DeleteGroup_->RemoveAll();\r
+ if(nullptr != DeleteTitleLabelExt_)\r
+ {\r
+ delete DeleteTitleLabelExt_;\r
+ DeleteTitleLabelExt_ = nullptr;\r
+ }\r
+ if(nullptr != DeletePromptLabelExt_)\r
+ {\r
+ delete DeletePromptLabelExt_;\r
+ DeletePromptLabelExt_ = nullptr;\r
+ }\r
+ if(nullptr != DeleteCancelButton_)\r
+ {\r
+ delete DeleteCancelButton_;\r
+ DeleteCancelButton_ = nullptr;\r
+ }\r
+ if(nullptr != DeleteOKButton_)\r
+ {\r
+ delete DeleteOKButton_;\r
+ DeleteOKButton_ = nullptr;\r
+ }\r
+ \r
+ delete DeleteGroup_;\r
+ DeleteGroup_ = nullptr;\r
+ }\r
+ }\r
+\r
+ UIViewGroup * ScheduleView::InitDeleteScreen()\r
+ {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]", __LINE__);\r
+ if(nullptr == DeleteGroup_)\r
+ {\r
+ DeleteGroup_ = new UIViewGroup();\r
+ if(nullptr == DeleteGroup_)\r
+ return nullptr;\r
+\r
+ DeleteGroup_->SetPosition(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);\r
+ DeleteGroup_->SetViewId(SCHEDULE_ViewId_DeleteGroup_);\r
+ DeleteGroup_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);\r
+ DeleteGroup_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);\r
+ DeleteGroup_->SetTouchable(true);\r
+ DeleteGroup_->SetDraggable(true);\r
+ DeleteGroup_->SetOnDragListener(presenter_);\r
+\r
+ if(nullptr == DeleteTitleLabelExt_)\r
+ {\r
+ DeleteTitleLabelExt_ = new UILabelExt();\r
+ if(nullptr == DeleteTitleLabelExt_)\r
+ return nullptr;\r
+\r
+ DeleteTitleLabelExt_->SetPosition(83, 50, 300, 35);\r
+ DeleteTitleLabelExt_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ DeleteTitleLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ DeleteTitleLabelExt_->SetTextId(STR_DELETE);\r
+ DeleteTitleLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ DeleteTitleLabelExt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ DeleteTitleLabelExt_->SetRollSpeed(23);\r
+ DeleteTitleLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ DeleteTitleLabelExt_->SetStyle(STYLE_TEXT_COLOR, Color::White().full);\r
+ }\r
+\r
+ if(nullptr == DeletePromptLabelExt_)\r
+ {\r
+ DeletePromptLabelExt_ = new UILabelExt();\r
+ if(nullptr == DeletePromptLabelExt_)\r
+ return nullptr;\r
+\r
+ DeletePromptLabelExt_->SetPosition(98, 187, 270, 35);\r
+ DeletePromptLabelExt_->SetStyle(STYLE_TEXT_FONT, 30);\r
+ DeletePromptLabelExt_->SetStyle(STYLE_LINE_HEIGHT, 35);\r
+ DeletePromptLabelExt_->SetTextId(STR_SCHEDULE_DELETE_PROMPT);\r
+ DeletePromptLabelExt_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);\r
+ DeletePromptLabelExt_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ DeletePromptLabelExt_->SetRollSpeed(23);\r
+ DeletePromptLabelExt_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);\r
+ DeletePromptLabelExt_->SetStyle(STYLE_TEXT_COLOR, 0xff999999);\r
+ }\r
+\r
+ if(nullptr == DeleteCancelButton_)\r
+ {\r
+ DeleteCancelButton_ = new UILabelButtonExt();\r
+ if(nullptr == DeleteCancelButton_)\r
+ return nullptr;\r
+\r
+ DeleteCancelButton_->SetPosition(111, 299, 100, 100);\r
+ DeleteCancelButton_->SetViewId(SCHEDULE_ViewId_DeleteCancelButton_);\r
+ DeleteCancelButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);\r
+ DeleteCancelButton_->SetStyle(STYLE_BACKGROUND_OPA, 25); // 10%\r
+ DeleteCancelButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffffff, UIButton::PRESSED);\r
+ DeleteCancelButton_->SetStyleForState(STYLE_BACKGROUND_OPA, 25, UIButton::PRESSED);\r
+ DeleteCancelButton_->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ DeleteCancelButton_->SetImagePosition(0, 0);\r
+ DeleteCancelButton_->SetImageSrc(PNG_SYSTEM_CHECK_OFF_IMAGE, PNG_SYSTEM_CHECK_OFF_IMAGE);\r
+ DeleteCancelButton_->SetOnClickListener(presenter_);\r
+ }\r
+\r
+ if(nullptr == DeleteOKButton_)\r
+ {\r
+ DeleteOKButton_ = new UILabelButtonExt();\r
+ if(nullptr == DeleteOKButton_)\r
+ return nullptr;\r
+\r
+ DeleteOKButton_->SetPosition(256, 299, 100, 100);\r
+ DeleteOKButton_->SetViewId(SCHEDULE_ViewId_DeleteOKButton_);\r
+ DeleteOKButton_->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);\r
+ DeleteOKButton_->SetStyle(STYLE_BACKGROUND_OPA, 25); // 10%\r
+ DeleteOKButton_->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xffffffff, UIButton::PRESSED);\r
+ DeleteOKButton_->SetStyleForState(STYLE_BACKGROUND_OPA, 25, UIButton::PRESSED);\r
+ DeleteOKButton_->SetStyle(STYLE_BORDER_RADIUS, 100);\r
+ DeleteOKButton_->SetImagePosition(0, 0);\r
+ DeleteOKButton_->SetImageSrc(PNG_SYSTEM_CHECK_ON_IMAGE, PNG_SYSTEM_CHECK_ON_IMAGE);\r
+ DeleteOKButton_->SetOnClickListener(presenter_);\r
+ }\r
+\r
+ DeleteGroup_->Add(DeleteTitleLabelExt_);\r
+ DeleteGroup_->Add(DeletePromptLabelExt_);\r
+ DeleteGroup_->Add(DeleteCancelButton_);\r
+ DeleteGroup_->Add(DeleteOKButton_);\r
+ }\r
+\r
+ return DeleteGroup_;\r
+ }\r
+\r
+ UILabelExt * ScheduleView::InitLabel(int16_t x, int16_t y, int16_t width, int16_t height,\r
+ uint16_t line_height, uint8_t font_size, uint16_t text_id, uint32_t text_color)\r
+ {\r
+ UILabelExt * LabelExt = new UILabelExt();\r
+ if(nullptr == LabelExt)\r
+ {\r
+ return nullptr;\r
+ }\r
+\r
+ LabelExt->SetPosition(x, y, width, height);\r
+ LabelExt->SetStyle(STYLE_TEXT_FONT, font_size);\r
+ LabelExt->SetStyle(STYLE_LINE_HEIGHT, line_height);\r
+ LabelExt->SetTextId(text_id);\r
+ LabelExt->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);\r
+ LabelExt->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ LabelExt->SetRollSpeed(23);\r
+ LabelExt->SetFont(DEFAULT_VECTOR_FONT_FILENAME, font_size);\r
+ LabelExt->SetStyle(STYLE_TEXT_COLOR, text_color);\r
+\r
+ return LabelExt;\r
+ }\r
+\r
+ void ScheduleView::ContentScreenItemIndexSet(uint8_t index)\r
+ {\r
+ ContentItemIndex_ = index;\r
+ }\r
+\r
+ uint8_t ScheduleView::ContentScreenItemIndexGet(void)\r
+ {\r
+ return ContentItemIndex_;\r
+ }\r
+\r
+ void ScheduleView::ItemListAdd(const ScheduleListItemInfo &item)\r
+ {\r
+ ScheduleListAdapter_->AddListItem(item);\r
+ }\r
+\r
+ void ScheduleView::ItemListClear(void)\r
+ {\r
+ ScheduleListAdapter_->ClearListItem();\r
+ }\r
+\r
+ void ScheduleView::ItemListContentUpdate(void)\r
+ {\r
+ uint8_t ItemCount = ScheduleModel::GetInstance().ScheduleItemDataCountGet();\r
+ if(0 != ItemCount)\r
+ {\r
+ ItemListClear();\r
+ ScheduleListItemInfo * ItemInfo = ScheduleModel::GetInstance().ScheduleAllItemDataGet();\r
+ for (uint8_t i = 0; i < ItemCount; i++)\r
+ {\r
+ ItemListAdd(ItemInfo[i]);\r
+ }\r
+ }\r
+ }\r
+\r
+ /// @brief 列表滚动更新\r
+ /// @param isUpScroll true 向上滚动,反之向下滚动\r
+ void ScheduleView::ItemListScrollByUpdate(bool isUpScroll)\r
+ {\r
+ if(ScheduleList_)\r
+ {\r
+ ScheduleList_->ScrollBy(isUpScroll ? -240 : 240);\r
+ }\r
+ }\r
+\r
+ void ScheduleView::ResetScheduleList(void)\r
+ {\r
+ if(ScheduleListAdapter_ == nullptr || ScheduleList_== nullptr)\r
+ {\r
+ return;\r
+ }\r
+\r
+ if(ScheduleListAdapter_->GetCount() > 2)\r
+ {\r
+ ScheduleList_->SetReboundSize(30);\r
+ }\r
+ else\r
+ {\r
+ ScheduleList_->SetReboundSize(0);\r
+ }\r
+ }\r
+\r
+ void ScheduleView::SetViewFocus(bool val)\r
+ {\r
+ if(!ContentGroup_ || !ScheduleList_)\r
+ {\r
+ return;\r
+ }\r
+ if(val)\r
+ {\r
+ ScheduleList_->RequestFocus();\r
+ }\r
+ else\r
+ {\r
+ ContentGroup_->RequestFocus();\r
+ }\r
+ }\r
+}
\ No newline at end of file
--- /dev/null
+
+/***
+ * @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
--- /dev/null
+#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<TakephotosView>,
+ 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
--- /dev/null
+/***
+ * @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<TakephotosPresenter>
+ {
+ 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
--- /dev/null
+/***
+ * @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 <cmsis_os2.h>
+#include <service/graphic_service.h>
+
+#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
--- /dev/null
+/***
+ * @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 <iostream>
+#include <chrono>
+#include <thread>
+
+#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<TakephotosView>::OnPause();
+ }
+
+ void TakephotosPresenter::OnResume(void)
+ {
+ Presenter<TakephotosView>::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<uint16_t>(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;
+ }
+
+}
--- /dev/null
+/***
+ * @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<UIViewGroup *>(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<UIView::OnClickListener *>(
+ 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<UIView::OnDragListener *>(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<UIView::OnClickListener *>(
+ 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<UIView::OnDragListener *>(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
#endif\r
#endif\r
\r
+#define SUPPORT_CAT1_MODEM\r
+\r
#ifndef BROADCAST_FEATURE_NAME\r
#define BROADCAST_FEATURE_NAME "BROADCAST"\r
#endif\r
TOPIC_DEMO_ACORE_MSG = TOPIC_START_NUM,\r
TOPIC_DEMO_ALL_MSG,\r
TOPIC_EVENT_ALARM_RING,\r
+ TOPIC_EVENT_ON_TIME,\r
TOPIC_EVENT_UTCTIME_UPDATE,\r
TOPIC_EVENT_NEXTDAY_UPDATE,\r
TOPIC_EVENT_WEARSTATE_UPDATE,\r
TOPIC_EVENT_STEPDATA_UPDATE,\r
TOPIC_EVENT_SHUTDOWN,\r
TOPIC_EVENT_HEARTRATE_UPDATA,\r
+ TOPIC_EVENT_STATIC_HEARTRATE_UPDATA,\r
TOPIC_EVENT_HFP_INCOMMING,\r
TOPIC_EVENT_HFP_PHONE_ACTIVE,\r
TOPIC_EVENT_HFP_WATCH_ACTIVE,\r
TOPIC_EVENT_HFP_FINISHED,\r
TOPIC_EVENT_HFP_PHONE_TO_WATCH,\r
TOPIC_EVENT_HFP_WATCH_TO_PHONE,\r
+ TOPIC_EVENT_HFP_HINT,\r
+#ifdef CYWEE_SPORT\r
+ TOPIC_EVENT_ACTIVITY_UPDATE,\r
+ TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE,\r
+ TOPIC_EVENT_AR_ALERT_TYPE_UPDATE,\r
+ TOPIC_EVENT_INACTIVITY_UPDATE,\r
+ TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE,\r
+ TOPIC_EVENT_BLE_TRAINING,\r
+ TOPIC_EVENT_BLE_TRANSMIT,\r
+ TOPIC_EVENT_GOAL_SHOW_VIEW,\r
+#endif\r
+#ifdef SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION\r
+ TOPIC_EVENT_CHARGE_PLUG,\r
+ TOPIC_EVENT_CHARGE_UNPLUG,\r
+ TOPIC_EVENT_LOWPOWER_ALARM,\r
+#endif\r
+#ifdef SUPPORT_SPO2_NOTIFICATION\r
+ TOPIC_EVENT_SPO2_UPDATE,\r
+ TOPIC_EVENT_START_HRS_MONITORING,\r
+ TOPIC_EVENT_STOP_HRS_MONITORING,\r
+ TOPIC_EVENT_START_SPO2_MONITORING,\r
+ TOPIC_EVENT_STOP_SPO2_MONITORING,\r
+ TOPIC_EVENT_GRAYCARD_UPDATA,\r
+ TOPIC_EVENT_LEAKLIGHT_UPDATA,\r
+#endif\r
+#ifdef SUPPORT_CAT1_MODEM\r
+ TOPIC_EVENT_CAT1_INCOMMING,\r
+ TOPIC_EVENT_CAT1_CALLCONNTED,\r
+ TOPIC_EVENT_CAT1_CALLENDED,\r
+ TOPIC_EVENT_CAT1_CALLDIAL,\r
+ TOPIC_EVENT_CAT1_SIGNAL_UPDATE,\r
+ TOPIC_EVENT_CAT1_POWER_ON,\r
+ TOPIC_EVENT_CAT1_POWER_OFF,\r
+ TOPIC_EVENT_CAT1_CALL_FAIL,\r
+#endif\r
+\r
+#ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION\r
+ TOPIC_EVENT_DEVICE_BIND,\r
+ TOPIC_EVENT_DEVICE_UNBIND,\r
+ TOPIC_EVENT_DEVICE_UNBINDING_REQUEST,\r
+#endif\r
+ TOPIC_EVENT_ENTER_CMAERA,\r
+ TOPIC_EVENT_CANCEL_CMAERA,\r
+ TOPIC_EVENT_FIND_WATCH, //查找手表\r
+ TOPIC_EVENT_CANCEL_FIND_WATCH,//取消查找\r
+ TOPIC_EVENT_DRINKREMINDER,//喝水提醒\r
+ TOPIC_EVENT_MESSAGENOTE, //消息通知\r
+ TOPIC_EVENT_MESSAGE_UPDATA, //消息更新通知\r
+ TOPIC_EVENT_SLEEPNOTE, //睡眠通知\r
+ TOPIC_EVENT_DEBUGOUTPUT,//开发调试专用窗口\r
+ TOPIC_EVENT_ASSISTANT_NOTE,//语音助手结束\r
+ TOPIC_EVENT_SHUTDOWN_ANIMATIOR,//关机Animator\r
TOPIC_END_NUM = 20000,\r
} TopicNum;\r
\r
/* topic数量 */\r
#ifndef MAX_BROACCAST_TOPIC_NUMBER\r
-#define MAX_BROACCAST_TOPIC_NUMBER 32\r
+#define MAX_BROACCAST_TOPIC_NUMBER 64\r
#endif\r
\r
/* 每个topic 对应的bitmap长度 */\r
{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,其对应的位图 */