Merge #1709 into sdk650 from refs/changes/1709/head 1711/target/1 1712/target/1
author罗正 <1732036298@qq.com>
Wed, 26 Mar 2025 07:33:49 +0000 (07:33 +0000)
committer袁清梦 <3449750381@qq.com>
Wed, 26 Mar 2025 07:33:49 +0000 (07:33 +0000)
查找手机slice合并提交

* refs/changes/1709/head: (6 commits squashed)

  - 查找手机slice合并提交

  - 计时器slice合并提交

  - 日历slice合并提交

  - 日程slice合并提交

  - 订阅消息Topic文件提交

  - 遥控拍照slice合并提交

Signed-off-by: 罗正 <1732036298@qq.com>
Merged-by: Caisking <3449750381@qq.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1709
44 files changed:
code/sdk/application/wearable/fd230/nativeapp/nativelauncher/include/AppViewIDs.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeConfigView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeNotNullView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/StartCountDownView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeConfigView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeNotNullView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/StartCountDownView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhonePresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleData.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListItem.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/SchedulePresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListItem.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/SchedulePresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/service/broadcast/include/broadcast_feature.h
code/sdk/application/wearable/service/broadcast/src/broadcast_implement.c

index cf9d615..96c027d 100644 (file)
@@ -119,7 +119,7 @@ typedef enum : uint16_t
   VIEW_DIALING_METHOD, // 拨号方式
   VIEW_TEST,           // 测试
   VIEW_CALCULATOR,     // 计算器
-  VIEW_SCHEDULE,       // schedule
+  VIEW_SCHEDULE,       // 日程
   VIEW_SLEEPMODE,      // sleep mode
   VIEW_SET_DESKTOP,    // 设置主题
   /*屏蔽Slice*/
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarModel.h
new file mode 100644 (file)
index 0000000..144c820
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CalendarModel.h
+ * Author:
+ * Create: 2021-10-12
+ */
+#ifndef CALENDAR_MODEL_H
+#define CALENDAR_MODEL_H
+
+#include "los_mux.h"
+#include "string"
+#include "PhoneService.h"
+#include "AppViewIDs.h"
+#include "components/ui_label_ext.h"
+#include"ui_resource_string.h"
+#include "message.h"
+#include "msg_center.h"
+#include "stack"
+
+namespace OHOS {
+
+
+class CalendarModel {
+public:
+    static CalendarModel *GetInstance(void);
+
+private:
+    CalendarModel();
+    CalendarModel(const CalendarModel &);
+    virtual ~CalendarModel();
+   
+};
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarPresenter.h
new file mode 100644 (file)
index 0000000..4bb7c03
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CalendarPresenter.h
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#ifndef CALENDAR_PRESENTER_H
+#define CALENDAR_PRESENTER_H
+
+#include "Presenter.h"
+#include "ohos_types.h"
+
+#include "cmsis_os.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "NativeAbility.h"
+
+namespace OHOS {
+class CalendarView;
+class CalendarPresenter : public Presenter<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/include/CalendarView.h
new file mode 100644 (file)
index 0000000..c78bdcf
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CalculatorView.h
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#ifndef CALENDAR_VIEW_H
+#define CALENDAR_VIEW_H
+
+#include "View.h"
+
+#include "components/ui_view_group.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_label_button.h"
+#include "components/ui_list.h"
+#include "components/abstract_adapter.h"
+#include "components/ui_image_view.h"
+#include "CalendarPresenter.h"
+
+namespace OHOS {
+
+class CalendarView : public View<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarModel.cpp
new file mode 100644 (file)
index 0000000..f065963
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CalendarModel.cpp
+ * Author:
+ * Create: 2021-10-12
+ */
+#include "DialingScreenView.h"
+
+#include "service_id_define.h"
+#include "cmsis_os.h"
+#include "samgr_lite.h"
+#include "calendar/include/CalendarModel.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+using namespace OHOS;
+
+CalendarModel::CalendarModel()
+{
+}
+
+CalendarModel::~CalendarModel()
+{
+}
+
+
+CalendarModel *CalendarModel::GetInstance(void)
+{
+    static CalendarModel callLogModel;
+    return &callLogModel;
+}
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarPresenter.cpp
new file mode 100644 (file)
index 0000000..669004b
--- /dev/null
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CalendarPresenter.cpp
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#include "calendar/include/CalendarView.h"
+#include "calendar/include/CalendarModel.h"
+#include "gfx_utils/mem_check.h"
+#include "common/key_code.h"
+#include "calendar/include/CalendarPresenter.h"
+#include "custom_utils.h"
+#include "NativeRegisterManager.h"
+
+namespace OHOS
+{
+    REGIST_MENU_PRO(VIEW_CALENDAR, CalendarView, CalendarPresenter,
+                    PNG_APPLIST_CALENDAR_IMAGE_BIG, PNG_APPLIST_CALENDAR_IMAGE, PNG_APPLIST_CALENDAR_IMAGE, "日历", STR_CALENDAR);
+
+    static CalendarPresenter *g_pMainView = nullptr;
+    CalendarPresenter::CalendarPresenter()
+    {
+        g_pMainView = this;
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(true);
+#endif
+    }
+
+    CalendarPresenter::~CalendarPresenter()
+    {
+        g_pMainView = nullptr;
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(false);
+#endif
+    }
+
+    CalendarPresenter *CalendarPresenter::GetInstance(void)
+    {
+        return g_pMainView;
+    }
+
+    void CalendarPresenter::OnStart()
+    {
+    }
+
+    bool CalendarPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        UNUSED(event);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OnClick");
+
+        return false;
+    }
+
+    bool CalendarPresenter::OnDragEnd(OHOS::UIView &view, const OHOS::DragEvent &event)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCallingPresenter OnDragEnd");
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT)
+        {
+            if (event.GetPreLastPoint().x - event.GetStartPoint().x > 100)
+                NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+        }
+        if (event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP)
+        {
+            // if(event.GetPreLastPoint().y-event.GetStartPoint().y>100)
+            CalendarView::GetInstance()->updata_label(2);
+        }
+        if (event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM)
+        {
+            // if(event.GetPreLastPoint().y-event.GetStartPoint().y>100)
+            CalendarView::GetInstance()->updata_label(1);
+        }
+        return true;
+    }
+
+    bool CalendarPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AlipayPresenter::OnKeyAct");
+        uint16 keyID = event.GetKeyId();
+        uint16_t keyState = event.GetState();
+        // 如果是power键就返回上一级
+        if (keyID == static_cast<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/calendar/src/CalendarView.cpp
new file mode 100644 (file)
index 0000000..8a922b3
--- /dev/null
@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: CalendarView.cpp
+ * Author:
+ * Create: 2021-10-12
+ */
+
+#include "calendar/include/CalendarView.h"
+#include "calendar/include/CalendarModel.h"
+#include "uicomponents/UIComponents.h"
+
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "NativeAbility.h"
+#include "ConfigModel.h"
+#include "languagecode/LanguageInit.h"
+namespace OHOS
+{
+
+    static CalendarView *g_pMainView_CalendarView = nullptr;
+
+    static char *dial_id_str[] = {"7", "8", "9", "C", "%", "4", "5", "6", "÷", "x", "1", "2", "3", "-", "+", "", "0", ".", "=", ""};
+
+    static constexpr int16_t PULLUP_ANIMATOR_VIEW_X = 213;
+    static constexpr int16_t PULLUP_ANIMATOR_VIEW_Y = 380;
+    static constexpr int16_t PULLUP_ANIMATOR_VIEW_W = 40;
+    static constexpr int16_t PULLUP_ANIMATOR_VIEW_H = 40;
+    static constexpr int16_t PULLUP_ANIMATOR_VIEW_NUM_FRAMES = 70;
+    static constexpr int16_t PULLUP_ANIMATOR_VIEW_TIME = 100;
+
+    static constexpr const char *PullUpPaths = "/user/res/weather/PullUp/PullUp_";
+
+    static constexpr const char *stepPaths = "/user/res/step/";
+
+    CalendarView::CalendarView()
+    {
+        // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "::CalendarView::CalendarView ");
+        g_pMainView_CalendarView = this;
+    }
+
+    CalendarView::~CalendarView()
+    {
+        // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "::CalendarView::~CalendarView ");
+
+        g_pMainView_CalendarView = nullptr;
+        if (group)
+        {
+            group->RemoveAll();
+
+            if (mon_label)
+            {
+                delete mon_label;
+                mon_label = nullptr;
+            }
+
+            if (imageview)
+            {
+                delete imageview;
+                imageview = nullptr;
+            }
+
+            for (int i = 0; i < 7; i++)
+            {
+                if (week_label[i])
+                {
+                    delete week_label[i];
+                    week_label[i] = nullptr;
+                }
+            }
+
+            for (int i = 0; i < 31; i++)
+            {
+                if (day_label[i])
+                {
+                    delete day_label[i];
+                    day_label[i] = nullptr;
+                }
+            }
+
+            if (PullUpAnimatorView != nullptr)
+            {
+                PullUpAnimatorView->Stop();
+                delete PullUpAnimatorView;
+                PullUpAnimatorView = nullptr;
+            }
+
+            FreeImageInfoArray(PullUpimageAnimator_imageInfo, PullUpPaths, PULLUP_ANIMATOR_VIEW_NUM_FRAMES);
+
+            delete group;
+            group = nullptr;
+        }
+
+        g_pMainView_CalendarView = nullptr;
+    }
+
+    CalendarView *CalendarView::GetInstance()
+    {
+        return g_pMainView_CalendarView;
+    }
+    static char *week_Z_str[] = {"一", "二", "三", "四", "五", "六", "日"};
+    static char *week_E_str[] = {"MON", "THE", "WED", "THU", "FRI", "SAT", "SUN"};
+    // static char *day_str[]={"1","2","3","4","5","7","8"};
+
+    bool CalendarView::updata_label(int8_t type)
+    {
+        for (int i = 0; i < 31; i++)
+        {
+            day_label[i]->SetVisible(false);
+        }
+        imageview->SetVisible(false);
+
+        if (type == 1)
+        {
+            show_m--;
+            if (show_m == 0)
+            {
+                show_m = 12;
+                show_y--;
+            }
+        }
+        else
+        {
+            show_m++;
+            if (show_m == 13)
+            {
+                show_m = 1;
+                show_y++;
+            }
+        }
+        uint8_t mon_max_day = 0;
+        uint8_t is_run = 0;
+        if (show_y % 4 == 0 && show_y % 100 != 0 || show_y % 400 == 0)
+        {
+            is_run = 1;
+        }
+
+        if (show_m == 2)
+        {
+            mon_max_day = 28 + is_run;
+        }
+        else if (show_m == 1 || show_m == 3 || show_m == 5 || show_m == 7 || show_m == 8 || show_m == 10 || show_m == 12)
+        {
+            mon_max_day = 31;
+        }
+        else
+        {
+            mon_max_day = 30;
+        }
+
+        int y = show_y;
+        int m = show_m;
+        int week = 0;
+        {
+            if (m == 1 || m == 2)
+            {
+                m += 12;
+                y--;
+            }
+            week = (1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
+        }
+
+        char mon[20] = {0};
+        sprintf(mon, "%d.%d", show_y, show_m);
+        mon_label->SetText(mon);
+
+        for (int i = 0; i < mon_max_day; i++)
+        {
+            int x = ((i + week) % 7);
+            int y = ((i + week) / 7);
+            day_label[i]->SetPosition(58 + 50 * x, 140 + 44 * y); // widget's left position and top position
+            char day[5];
+            sprintf(day, "%d", i + 1);
+            ;
+            day_label[i]->SetText(day);
+            time_t currtime;
+            time(&currtime);
+            struct tm *timeinfo;
+            timeinfo = localtime(&currtime);
+            int y_ = timeinfo->tm_year + 1900;
+            int m_ = timeinfo->tm_mon + 1;
+            int d_ = timeinfo->tm_mday;
+            if (i + 1 == d_ && show_y == y_ && show_m == m_)
+            {
+                imageview->SetPosition(58 + 50 * x, 140 + 44 * y);
+                imageview->SetVisible(true);
+            }
+            day_label[i]->SetVisible(true);
+        }
+        RootView::GetInstance()->Invalidate();
+        return true;
+    }
+    bool CalendarView::Label_init()
+    {
+        // Add Label to App
+        uint8_t mon_max_day = 0;
+
+        uint8_t is_run = 0;
+        time_t currtime;
+        time(&currtime);
+        struct tm *timeinfo;
+        timeinfo = localtime(&currtime);
+        int y = timeinfo->tm_year + 1900;
+        int m = timeinfo->tm_mon + 1;
+        int d = timeinfo->tm_mday;
+        int h = timeinfo->tm_hour;
+        int min = timeinfo->tm_min;
+        int week = timeinfo->tm_wday;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d,%d,%d,%d", y, m, d, week);
+        if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0) //
+        {
+            is_run = 1;
+        }
+
+        if (m == 2)
+        {
+            mon_max_day = 28 + is_run;
+        }
+        else if (m == 1 ||
+                 m == 3 ||
+                 m == 5 ||
+                 m == 7 ||
+                 m == 8 ||
+                 m == 10 ||
+                 m == 12)
+        {
+            mon_max_day = 31;
+        }
+        else
+        {
+            mon_max_day = 30;
+        }
+
+        show_y = y;
+        show_m = m;
+        show_d = d;
+
+        if (mon_label == nullptr)
+        {
+            mon_label = new UILabel();
+        }
+        mon_label->SetPosition(83, 50); // widget's left position and top position
+        mon_label->Resize(300, 35);     // widget's width and height
+        mon_label->SetViewId("label1"); // Set style
+        mon_label->SetStyle(STYLE_TEXT_FONT, 30);
+
+        char mon[20] = {0};
+        sprintf(mon, "%d.%d", y, m);
+
+        if (m == 1 || m == 2)
+        {
+            m += 12;
+            y--;
+        }
+        week = (1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
+
+        mon_label->SetText(mon);
+        mon_label->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+        mon_label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        mon_label->SetRollSpeed(0);
+        mon_label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+
+        // Add to rootView
+        group->Add(mon_label);
+
+        for (int i = 0; i < 7; i++)
+        {
+            if (week_label[i] == nullptr)
+            {
+                week_label[i] = new UILabel();
+            }
+            week_label[i]->SetPosition(58 + 50 * (i), 110); // widget's left position and top position
+            week_label[i]->Resize(50, 30);                  // widget's width and height
+            week_label[i]->SetViewId("label3");             // Set style
+            week_label[i]->SetStyle(STYLE_TEXT_FONT, 20);
+
+            if (ConfigModel::GetInstance()->GetLanguage() == ZH_CN)
+                week_label[i]->SetText(week_Z_str[i]);
+            else
+                week_label[i]->SetText(week_E_str[i]);
+
+            week_label[i]->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
+            week_label[i]->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff));
+            week_label[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+            week_label[i]->SetRollSpeed(0);
+            week_label[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 20);
+
+            group->Add(week_label[i]);
+            week_label[i]->SetVisible(true);
+        }
+        // Add Label to App
+        if (imageview == nullptr)
+        {
+            imageview = new UIImageView();
+        }
+
+        imageview->SetPosition(58, 140);
+        imageview->Resize(50, 50);
+        imageview->SetViewId("image1");
+        imageview->SetStyle(STYLE_BACKGROUND_COLOR, 0xffff5a36);
+        imageview->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+        imageview->SetStyle(STYLE_BORDER_RADIUS, 100);
+        group->Add(imageview);
+        imageview->SetVisible(false);
+
+        for (int i = 0; i < 31; i++)
+        {
+            if (day_label[i] == nullptr)
+            {
+                day_label[i] = new UILabel();
+            }
+
+            day_label[i]->SetPosition(58, 140); // widget's left position and top position
+            day_label[i]->Resize(50, 44);       // widget's width and height
+            day_label[i]->SetViewId("label3");  // Set style
+            day_label[i]->SetStyle(STYLE_TEXT_FONT, 20);
+
+            day_label[i]->SetStyle(STYLE_BORDER_RADIUS, 100);
+
+            day_label[i]->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+            day_label[i]->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+            day_label[i]->SetRollSpeed(0);
+            day_label[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+
+            group->Add(day_label[i]);
+            day_label[i]->SetVisible(false);
+        }
+        for (int i = 0; i < mon_max_day; i++)
+        {
+            int x = ((i + week) % 7);
+            int y = ((i + week) / 7);
+            day_label[i]->SetPosition(58 + 50 * x, 140 + 44 * y); // widget's left position and top position
+            char day[5];
+            sprintf(day, "%d", i + 1);
+            ;
+            day_label[i]->SetText(day);
+            if (i + 1 == d)
+            {
+                imageview->SetPosition(58 + 50 * x, 140 + 44 * y);
+                imageview->SetVisible(true);
+            }
+            day_label[i]->SetVisible(true);
+        }
+
+        PullUpimageAnimator_imageInfo = CreateImageInfoArray(PullUpPaths, PULLUP_ANIMATOR_VIEW_NUM_FRAMES);
+        if (PullUpAnimatorView == nullptr)
+        {
+            PullUpAnimatorView = new UIImageAnimatorView();
+            if (PullUpAnimatorView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PullUpAnimatorView new fail");
+                return false;
+            }
+            for (uint8_t i = 0; i < PULLUP_ANIMATOR_VIEW_NUM_FRAMES; i++)
+            {
+                // PullUpimageAnimatorInfo[i].imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(PullUpPathsArray[i]);
+                // PullUpimageAnimatorInfo[i].imageType = IMG_SRC_IMAGE_INFO;
+                PullUpimageAnimatorInfo[i].imageInfo = PullUpimageAnimator_imageInfo[i];
+                // PullUpPathsArray[i];
+                PullUpimageAnimatorInfo[i].imageType = IMG_SRC_IMAGE_INFO;
+                PullUpimageAnimatorInfo[i].pos.x = PULLUP_ANIMATOR_VIEW_X;
+                PullUpimageAnimatorInfo[i].pos.y = PULLUP_ANIMATOR_VIEW_Y;
+                PullUpimageAnimatorInfo[i].width = PULLUP_ANIMATOR_VIEW_W;
+                PullUpimageAnimatorInfo[i].height = PULLUP_ANIMATOR_VIEW_H;
+            }
+            PullUpAnimatorView->SetPosition(PULLUP_ANIMATOR_VIEW_X, PULLUP_ANIMATOR_VIEW_Y, PULLUP_ANIMATOR_VIEW_W, PULLUP_ANIMATOR_VIEW_H);
+            PullUpAnimatorView->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
+            PullUpAnimatorView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+            PullUpAnimatorView->SetImageAnimatorSrc(PullUpimageAnimatorInfo, PULLUP_ANIMATOR_VIEW_NUM_FRAMES, PULLUP_ANIMATOR_VIEW_TIME);
+            PullUpAnimatorView->SetRepeat(true);
+            PullUpAnimatorView->Start();
+        }
+        group->Add(PullUpAnimatorView);
+
+        return true;
+    }
+
+    void CalendarView::OnStart()
+    {
+        group = new UIViewGroup();
+        if (group == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallingView::UIViewGroup::new group error");
+            return;
+        }
+        group->SetPosition(0, 0);
+        group->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION); // 454 : value
+        group->SetTouchable(true);
+        group->SetDraggable(true);
+        group->SetOnDragListener(presenter_);
+        AddViewToRootContainer(group);
+
+        if (!Label_init())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CallingView::UIViewGroup::new group error");
+            return;
+        }
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownModel.h
new file mode 100644 (file)
index 0000000..41c1aa3
--- /dev/null
@@ -0,0 +1,157 @@
+/*\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeConfigView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeConfigView.h
new file mode 100644 (file)
index 0000000..4850b2b
--- /dev/null
@@ -0,0 +1,44 @@
+/*\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeNotNullView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/CountDownTimeNotNullView.h
new file mode 100644 (file)
index 0000000..c216368
--- /dev/null
@@ -0,0 +1,41 @@
+/*\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownPresenter.h
new file mode 100644 (file)
index 0000000..e16f7fe
--- /dev/null
@@ -0,0 +1,65 @@
+/*\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/MainCountDownView.h
new file mode 100644 (file)
index 0000000..27d9fee
--- /dev/null
@@ -0,0 +1,80 @@
+/*\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/StartCountDownView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/include/StartCountDownView.h
new file mode 100644 (file)
index 0000000..1c721cb
--- /dev/null
@@ -0,0 +1,67 @@
+/***\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownModel.cpp
new file mode 100644 (file)
index 0000000..f326026
--- /dev/null
@@ -0,0 +1,738 @@
+/*\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeConfigView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeConfigView.cpp
new file mode 100644 (file)
index 0000000..3aa1661
--- /dev/null
@@ -0,0 +1,171 @@
+#include "countdown/include/CountDownTimeConfigView.h"
+#include "countdown/include/MainCountDownPresenter.h"
+#include "countdown/include/CountDownModel.h"
+#include "UiConfig.h"
+#include "wearable_log.h"
+/*倒计时时间配置*/
+namespace OHOS
+{
+
+    static CountDownTimeConfigView *g_pCountDownTimeConfigView{nullptr};
+
+    CountDownTimeConfigView::CountDownTimeConfigView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::CountDownTimeConfigView");
+        g_pCountDownTimeConfigView = this;
+    }
+
+    CountDownTimeConfigView::~CountDownTimeConfigView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::~CountDownTimeConfigView");
+        ClearAll();
+        g_pCountDownTimeConfigView = nullptr;
+    }
+
+    CountDownTimeConfigView *CountDownTimeConfigView::GetInstance()
+    {
+        return g_pCountDownTimeConfigView;
+    }
+
+    void CountDownTimeConfigView::ClearAll()
+    {
+        scrollView->RemoveAll();
+
+        if (Title != nullptr)
+        {
+            delete Title;
+            Title = nullptr;
+        }
+
+        if (timePicker != nullptr)
+        {
+            delete timePicker;
+            timePicker = nullptr;
+        }
+
+        for (int i = 0; i < 2; i++)
+        {
+            delete Img[i];
+            Img[i] = nullptr;
+        }
+
+        if (startCountdownButton != nullptr)
+        {
+            delete startCountdownButton;
+            startCountdownButton = nullptr;
+        }
+
+        if (scrollView != nullptr)
+        {
+            delete scrollView;
+            scrollView = nullptr;
+        }
+    }
+
+    UIScrollView *CountDownTimeConfigView::CountDownTimeConfigViewInit()
+    {
+        if (scrollView == nullptr)
+        {
+            scrollView = new UIScrollView();
+            if (scrollView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownTimeConfigView::scrollView is new fail!!");
+                return nullptr;
+            }
+            scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+            scrollView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+            UIView::OnDragListener *dragListener = static_cast<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeNotNullView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/CountDownTimeNotNullView.cpp
new file mode 100644 (file)
index 0000000..679d66a
--- /dev/null
@@ -0,0 +1,144 @@
+#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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownPresenter.cpp
new file mode 100644 (file)
index 0000000..39be265
--- /dev/null
@@ -0,0 +1,308 @@
+#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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/MainCountDownView.cpp
new file mode 100644 (file)
index 0000000..42617ac
--- /dev/null
@@ -0,0 +1,435 @@
+#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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/StartCountDownView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/countdown/src/StartCountDownView.cpp
new file mode 100644 (file)
index 0000000..af12408
--- /dev/null
@@ -0,0 +1,302 @@
+#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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneModel.h
new file mode 100644 (file)
index 0000000..92cffcc
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-27 15:21:17
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-10-12 17:22:50
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/include/FindPhoneModel.h
+ */
+#ifndef FINDPHONE_MODEL_H
+#define FINDPHONE_MODEL_H
+#include "cstdint"
+
+namespace OHOS
+{
+    class FindPhoneModel
+    {
+    public:
+        static FindPhoneModel &GetInstance();
+        void SetBlueToothConnectedState(bool state);
+        bool GetBlueToothConnectedState();
+        void start_or_stop_find_phone(uint8_t val);
+    private:
+        FindPhoneModel() {}
+        ~FindPhoneModel() {}
+        FindPhoneModel(const FindPhoneModel &) = delete;
+        const FindPhoneModel &operator=(const FindPhoneModel &) = delete;
+
+        bool isBlueToothConnected{false}; // 蓝牙是否连接
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhonePresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhonePresenter.h
new file mode 100644 (file)
index 0000000..8983da0
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-27 10:47:24
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2025-02-25 17:43:12
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/include/FindPhonePresenter.h
+ */
+
+#ifndef FIND_PHONE_PRESENTER_H
+#define FIND_PHONE_PRESENTER_H
+
+#include "Presenter.h"
+#include "View.h"
+
+namespace OHOS
+{
+    static constexpr const uint8_t FINDPHONE_START = 1; // 开始查找手机
+    static constexpr const uint8_t FINDPHONE_STOP = 0;  // 停止查找手机
+    static constexpr char *FINDPHONE_LABELBUTTON = "FindPhoneLabelButton";
+    class FindPhoneView;
+    class FindPhonePresenter : public Presenter<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/include/FindPhoneView.h
new file mode 100644 (file)
index 0000000..7cc5d13
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-08-31 09:52:34
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2025-02-24 18:39:46
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/include/FindPhoneView.h
+ */
+#ifndef FIND_PHONE_VIEW_H
+#define FIND_PHONE_VIEW_H
+
+#include "View.h"
+#include "components/ui_view_group.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_label_button_ext.h"
+#include "components/ui_image_view.h"
+namespace OHOS
+{
+    static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_X = 173;
+    static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_Y = 140;
+    static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_W = 120;
+    static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_H = 120;
+    static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_TIMEOFUPDATE = 100;
+    static constexpr int FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES = 50; // 图片帧数
+
+    class FindPhonePresenter;
+    class FindPhoneView : public View<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneModel.cpp
new file mode 100644 (file)
index 0000000..793eb46
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-27 15:21:30
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-10-12 17:18:27
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/src/FindPhoneModel.cpp
+ */
+
+#include "findphone/include/FindPhoneModel.h"
+#include <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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhonePresenter.cpp
new file mode 100644 (file)
index 0000000..75a850e
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-27 10:47:40
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2025-02-25 17:43:45
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/src/FindPhonePresenter.cpp
+ */
+#include "AppViewIDs.h"
+#include "UiConfig.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+#include "NativeAbility.h"
+#include "findphone/include/FindPhonePresenter.h"
+#include "findphone/include/FindPhoneModel.h"
+#include "findphone/include/FindPhoneView.h"
+#include "gfx_utils/mem_check.h"
+#include "bluetooth/include/BluetoothModel.h"
+#include "custom_utils.h"
+#include "common/key_code.h"
+#include "NativeRegisterManager.h"
+
+#ifdef SUPPORT_BLE_SERVICE
+#include "bleEvent.h"
+#endif
+
+namespace OHOS
+{
+    REGIST_MENU_PRO(VIEW_FIND_PHONE, FindPhoneView, FindPhonePresenter, PNG_APPLIST_FINDPHONE_IMAGE_BIG,
+                    PNG_APPLIST_FINDPHONE_IMAGE, PNG_APPLIST_FINDPHONE_IMAGE, "查找手机", STR_FIND_PHONE);
+
+    // 当前Presenter属性实例化的内存指针
+    static FindPhonePresenter *g_pFindPhonePresenter = nullptr;
+
+    FindPhonePresenter::FindPhonePresenter()
+    {
+        g_pFindPhonePresenter = this;
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(true);
+#endif
+    }
+
+    FindPhonePresenter::~FindPhonePresenter()
+    {
+        g_pFindPhonePresenter = nullptr;
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(false);
+#endif
+    }
+
+    FindPhonePresenter *FindPhonePresenter::GetInstance()
+    {
+        return g_pFindPhonePresenter;
+    }
+
+    void FindPhonePresenter::OnStart()
+    {
+#ifdef SUPPORT_BLE_SERVICE
+        if (FindPhoneModel::GetInstance().GetBlueToothConnectedState() &&
+            uapi_a2dp_snk_get_device_connect_state()) // 判断与手机蓝牙是否连接和判断a2dp是否是已连接状态
+        {
+            WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "FindPhonePresenter::OnStart a2dp is connected");
+            uapi_a2dp_snk_disconnect(); // 先断开a2dp
+        }
+#endif
+    }
+
+    void FindPhonePresenter::OnPause(void)
+    {
+        Presenter<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/findphone/src/FindPhoneView.cpp
new file mode 100644 (file)
index 0000000..ea029b8
--- /dev/null
@@ -0,0 +1,290 @@
+/***
+ * @Date: 2024-06-19 19:25:22
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-30 19:23:15
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/src/FindPhoneView.cpp
+ */
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-03-27 10:47:46
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2025-02-25 16:19:36
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/findphone/src/FindPhoneView.cpp
+ */
+#include "findphone/include/FindPhoneView.h"
+#include "findphone/include/FindPhonePresenter.h"
+#include "wearable_log.h"
+#include "findphone/include/FindPhoneModel.h"
+#include "UiConfig.h"
+#include "ui_resource_string.h"
+#include "uicomponents/UIComponents.h"
+
+#ifdef SUPPORT_BLE_SERVICE
+#include "bletest.h"
+#include "bleEvent.h"
+#endif
+namespace OHOS
+{
+
+    static FindPhoneView *g_pFindPhoneView{nullptr};
+    static constexpr const char *FIND_PONE_IMAGE_SRC = "/user/res/findphone/";
+
+    FindPhoneView::FindPhoneView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneView::FindPhoneView");
+        g_pFindPhoneView = this;
+    }
+
+    FindPhoneView::~FindPhoneView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "FindPhoneView::~FindPhoneView");
+        ClearAll();
+        g_pFindPhoneView = nullptr;
+    }
+
+    FindPhoneView *FindPhoneView::GetInstance()
+    {
+        return g_pFindPhoneView;
+    }
+
+    void FindPhoneView::ClearAll()
+    {
+        if (FindPhoneGroupView != nullptr)
+        {
+            FindPhoneGroupView->RemoveAll();
+
+            if (FindPhoneTitleLabel != nullptr)
+            {
+                delete FindPhoneTitleLabel;
+                FindPhoneTitleLabel = nullptr;
+            }
+            if (FindPhoneImageView != nullptr)
+            {
+                delete FindPhoneImageView;
+                FindPhoneImageView = nullptr;
+            }
+            if (FindPhoneImageAnimator != nullptr)
+            {
+                FindPhoneImageAnimator->Stop();
+                delete FindPhoneImageAnimator;
+                FindPhoneImageAnimator = nullptr;
+                FreeImageInfoArray(FindPhonePathsArray, FIND_PONE_IMAGE_SRC, FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES);
+            }
+            if (FindPhoneLabel != nullptr)
+            {
+                delete FindPhoneLabel;
+                FindPhoneLabel = nullptr;
+            }
+            if (FindPhoneLabelButton != nullptr)
+            {
+                delete FindPhoneLabelButton;
+                FindPhoneLabelButton = nullptr;
+            }
+            delete FindPhoneGroupView;
+            FindPhoneGroupView = nullptr;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneView::ClearAll over!!");
+        }
+    }
+
+    /*蓝牙如果是未连接状态*/
+    void FindPhoneView::FindPhoneViewInit_BlueToothDisConnected(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneView::FindPhoneViewInit_BlueToothConnected");
+        if (FindPhoneGroupView == nullptr)
+        {
+            /* --------------------------- FindPhoneGroupView --------------------------- */
+            FindPhoneGroupView = new UIViewGroup();
+            if (FindPhoneGroupView == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneGroupView new fail!!");
+                return;
+            }
+            FindPhoneGroupView->SetPosition(0, 0, 466, 466);
+            FindPhoneGroupView->SetStyle(STYLE_BACKGROUND_OPA, 0);
+            FindPhoneGroupView->SetTouchable(true);
+            FindPhoneGroupView->SetDraggable(true);
+            FindPhoneGroupView->SetOnDragListener(presenter_);
+            /* --------------------------- FindPhoneTitleLabel -------------------------- */
+            FindPhoneTitleLabel = new UILabelExt();
+            if (FindPhoneTitleLabel == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneTitleLabel new fail!!");
+                return;
+            }
+            FindPhoneTitleLabel->SetPosition(83, 50, 300, 35);
+            FindPhoneTitleLabel->SetStyle(STYLE_TEXT_FONT, 30);
+            FindPhoneTitleLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+            FindPhoneTitleLabel->SetTextId(STR_FIND_PHONE); // 查找手机
+            FindPhoneTitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+            FindPhoneTitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+            FindPhoneTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+            /* ----------------------- FindPhoneImageView ---------------------- */
+            FindPhoneImageView = new UIImageView();
+            if (FindPhoneImageView == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneTitleLabel new fail!!");
+                return;
+            }
+            FindPhoneImageView->SetPosition(193, 140, 80, 80);
+#ifdef FD230
+            FindPhoneImageView->SetSrc(PNG_ATTENTION_IMAGE);
+#endif
+            /* ----------------------------- FindPhoneLabel ----------------------------- */
+            FindPhoneLabel = new UILabelExt();
+            if (FindPhoneLabel == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneLabel new fail");
+                return;
+            }
+            FindPhoneLabel->SetPosition(83, 270, 300, 35);
+            FindPhoneLabel->SetStyle(STYLE_TEXT_FONT, 30);
+            FindPhoneLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+            FindPhoneLabel->SetTextId(STR_BLUETOOTH_DISCONNECTED); // 蓝牙未连接
+            FindPhoneLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+            FindPhoneLabel->SetTextColor(Color::GetColorFromRGBA(0x4f, 0xc3, 0x4c, 0xff));
+            FindPhoneLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+            FindPhoneLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+            /* -------------------------- FindPhoneLabelButton -------------------------- */
+            FindPhoneLabelButton = new UILabelButtonExt();
+            if (FindPhoneLabelButton == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneLabelButton new fail");
+                return;
+            }
+            FindPhoneLabelButton->SetPosition(0, 366, 466, 100);
+            FindPhoneLabelButton->SetViewId(FINDPHONE_LABELBUTTON);
+#ifdef FD230
+            FindPhoneLabelButton->SetImageSrc(PNG_BUTTON_466x100_IMAGE, PNG_BUTTON_466x100_IMAGE);
+#endif
+            FindPhoneLabelButton->SetTextId(STR_CLOSE); // 关闭
+            FindPhoneLabelButton->SetTextColor(Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff));
+            FindPhoneLabelButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+            FindPhoneLabelButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
+            FindPhoneLabelButton->SetOnClickListener(presenter_);
+            /* ----------------------------------- Add ---------------------------------- */
+            FindPhoneGroupView->Add(FindPhoneTitleLabel);
+            FindPhoneGroupView->Add(FindPhoneImageView);
+            FindPhoneGroupView->Add(FindPhoneLabel);
+            FindPhoneGroupView->Add(FindPhoneLabelButton);
+            AddViewToRootContainer(FindPhoneGroupView);
+        }
+    }
+
+    /*蓝牙如果是已连接状态将初始化这个视图*/
+    void FindPhoneView::FindPhoneViewInit_BlueToothConnected(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "FindPhoneView::FindPhoneViewInit_BlueToothConnected");
+        if (FindPhoneGroupView == nullptr)
+        {
+            /* --------------------------- FindPhoneGroupView --------------------------- */
+            FindPhoneGroupView = new UIViewGroup();
+            if (FindPhoneGroupView == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneGroupView new fail!!");
+                return;
+            }
+            FindPhoneGroupView->SetPosition(0, 0, 466, 466);
+            FindPhoneGroupView->SetStyle(STYLE_BACKGROUND_OPA, 0);
+            FindPhoneGroupView->SetTouchable(true);
+            FindPhoneGroupView->SetDraggable(true);
+            FindPhoneGroupView->SetOnDragListener(presenter_);
+            /* --------------------------- FindPhoneTitleLabel -------------------------- */
+            FindPhoneTitleLabel = new UILabelExt();
+            if (FindPhoneTitleLabel == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[FindPhoneViewInit_BlueToothConnected] FindPhoneTitleLabel new fail!!");
+                return;
+            }
+            FindPhoneTitleLabel->SetPosition(83, 50, 300, 35);
+            FindPhoneTitleLabel->SetStyle(STYLE_TEXT_FONT, 30);
+            FindPhoneTitleLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+            FindPhoneTitleLabel->SetTextId(STR_FIND_PHONE); // 查找手机
+            FindPhoneTitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+            FindPhoneTitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+            FindPhoneTitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+            /* ----------------------- FindPhoneImageAnimator ---------------------- */
+            FindPhonePathsArray = CreateImageInfoArray(FIND_PONE_IMAGE_SRC, FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES);
+            if (FindPhoneImageAnimator == nullptr)
+            {
+                FindPhoneImageAnimator = new UIImageAnimatorView();
+                if (FindPhoneImageAnimator == nullptr)
+                {
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneImageAnimator new fail");
+                    return;
+                }
+                for (uint8_t i = 0; i < FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES; i++)
+                {
+                    // FindPhoneImageInfo[i].imagePath = (FindPhonePathsArray[i]);
+                    // FindPhoneImageInfo[i].imageType = IMG_SRC_FILE_PATH;
+                    FindPhoneImageInfo[i].imageInfo = (FindPhonePathsArray[i]);
+                    FindPhoneImageInfo[i].imageType = IMG_SRC_IMAGE_INFO;
+                    FindPhoneImageInfo[i].pos.x = FINDPHONE_IMAGE_ANIMATOR_VIEW_X;
+                    FindPhoneImageInfo[i].pos.y = FINDPHONE_IMAGE_ANIMATOR_VIEW_Y;
+                    FindPhoneImageInfo[i].width = FINDPHONE_IMAGE_ANIMATOR_VIEW_W;
+                    FindPhoneImageInfo[i].height = FINDPHONE_IMAGE_ANIMATOR_VIEW_H;
+                }
+                FindPhoneImageAnimator->SetPosition(FINDPHONE_IMAGE_ANIMATOR_VIEW_X, FINDPHONE_IMAGE_ANIMATOR_VIEW_Y, FINDPHONE_IMAGE_ANIMATOR_VIEW_W, FINDPHONE_IMAGE_ANIMATOR_VIEW_H);
+                FindPhoneImageAnimator->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
+                FindPhoneImageAnimator->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
+                FindPhoneImageAnimator->SetImageAnimatorSrc(FindPhoneImageInfo, FINDPHONE_IMAGE_ANIMATOR_VIEW_NUM_FRAMES, FINDPHONE_IMAGE_ANIMATOR_VIEW_TIMEOFUPDATE);
+                FindPhoneImageAnimator->SetRepeat(true);
+                FindPhoneImageAnimator->Start();
+            }
+            /* ----------------------------- FindPhoneLabel ----------------------------- */
+            FindPhoneLabel = new UILabelExt();
+            if (FindPhoneLabel == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneLabel new fail");
+                return;
+            }
+            FindPhoneLabel->SetPosition(83, 270, 300, 35);
+            FindPhoneLabel->SetStyle(STYLE_TEXT_FONT, 30);
+            FindPhoneLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+            FindPhoneLabel->SetTextId(STR_PHONE_RINGING_VIBRATING); // 手机正在响铃/震动
+            FindPhoneLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+            FindPhoneLabel->SetTextColor(Color::GetColorFromRGBA(0x4f, 0xc3, 0x4c, 0xff));
+            FindPhoneLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+            FindPhoneLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+            /* -------------------------- FindPhoneLabelButton -------------------------- */
+            FindPhoneLabelButton = new UILabelButtonExt();
+            if (FindPhoneLabelButton == nullptr)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[CreateDeviceUnBindingView] FindPhoneLabelButton new fail");
+                return;
+            }
+            FindPhoneLabelButton->SetPosition(0, 366, 466, 100);
+            FindPhoneLabelButton->SetViewId(FINDPHONE_LABELBUTTON);
+#ifdef FD230
+            FindPhoneLabelButton->SetImageSrc(PNG_466x100BUTTON_IMAGE, PNG_466x100BUTTON_IMAGE);
+#endif
+            // FindPhoneLabelButton->SetText("停止");
+            FindPhoneLabelButton->SetTextId(STR_STOP);
+            FindPhoneLabelButton->SetTextColor(Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff));
+            FindPhoneLabelButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+            FindPhoneLabelButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
+            FindPhoneLabelButton->SetOnClickListener(presenter_);
+            /* ----------------------------------- Add ---------------------------------- */
+            FindPhoneGroupView->Add(FindPhoneTitleLabel);
+            FindPhoneGroupView->Add(FindPhoneImageAnimator);
+            FindPhoneGroupView->Add(FindPhoneLabel);
+            FindPhoneGroupView->Add(FindPhoneLabelButton);
+            AddViewToRootContainer(FindPhoneGroupView);
+        }
+    }
+
+    void FindPhoneView::OnStart()
+    {
+        if (FindPhoneModel::GetInstance().GetBlueToothConnectedState() == true) // 判断蓝牙是否是连接状态
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phone is connected");
+            FindPhoneViewInit_BlueToothConnected();
+            FindPhoneModel::GetInstance().start_or_stop_find_phone(FINDPHONE_START);
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "phone is not connected");
+            FindPhoneViewInit_BlueToothDisConnected();
+        }
+        return;
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleData.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleData.h
new file mode 100644 (file)
index 0000000..72e7a26
--- /dev/null
@@ -0,0 +1,54 @@
+
+#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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListAdapter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListAdapter.h
new file mode 100644 (file)
index 0000000..e60be86
--- /dev/null
@@ -0,0 +1,32 @@
+
+#ifndef __SCHEDULELISTADAPTER_H__
+#define __SCHEDULELISTADAPTER_H__
+
+#include "View.h"
+#include "components/abstract_adapter.h"
+#include "schedule/include/ScheduleModel.h"
+#include "schedule/include/ScheduleListItem.h"
+
+
+namespace OHOS
+{
+    class ScheduleListAdapter : public AbstractAdapter
+    {
+    public:
+        ScheduleListAdapter();
+        ~ScheduleListAdapter() override;
+        ScheduleListAdapter * GetInstance();
+
+        UIView * GetView(UIView * inView, int16_t index) override;
+        uint16_t GetCount() override;
+        void AddListItem(const ScheduleListItemInfo &item);
+        void ClearListItem(void);
+
+        void SetItemClickListener(UIView::OnClickListener *itemClickListener);
+
+    private:
+        List<ScheduleListItemInfo> nodeList_;
+        UIView::OnClickListener * itemClickListener_;
+    };
+}
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListItem.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleListItem.h
new file mode 100644 (file)
index 0000000..3a3c125
--- /dev/null
@@ -0,0 +1,62 @@
+
+#ifndef __SCHEDULELISTITEM_H__
+#define __SCHEDULELISTITEM_H__
+
+#include "View.h"
+#include "ohos_types.h"
+#include "components/ui_view_group.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_image_view.h"
+
+
+namespace OHOS
+{
+    typedef struct
+    {
+        std::string DateStr;
+        std::string TopicStr;
+        std::string TimeStr;
+        std::string ContentStr;
+        uint8_t OriginalDataIndex;
+        bool IsDateItem;
+        uint8_t ChildIndex;  // if(false == IsDateItem)
+    } ScheduleListItemInfo;
+
+
+    class ScheduleListItem : public UIViewGroup
+    {
+    public:
+        ScheduleListItem();
+        ~ScheduleListItem() override;
+        void SetItemInfo(const ScheduleListItemInfo &itemInfo);
+        void ResetItemStyle(const ScheduleListItemInfo &itemInfo);
+        void ResetHeight(bool val);
+
+
+    private:
+        ScheduleListItem(const ScheduleListItem &);
+        ScheduleListItem &operator = (const ScheduleListItem &);
+
+        UIViewGroup InfoGroup_;
+        UILabelExt LabelExtDate_;
+        UILabelExt LabelExtTopic_;
+        UILabelExt LabelExtTime_;
+        UIImageView Image_;
+        // ScheduleListItemInfo itemInfo_ = { nullptr, nullptr, nullptr, nullptr, 0 };
+
+        #define ITEM_WIDTH (380)
+        #define ITEM_HEIGHT (100)
+        #define ITEM_GAP (20)
+
+        #define ODD_ITEM_BACKGROUND_COLOR (0Xff001833)
+        #define ODD_ITEM_TOPIC_COLOR (0Xff0176ff)
+        #define ODD_ITEM_TIME_COLOR (0Xff8bc0ff)
+
+        #define EVEN_ITEM_BACKGROUND_COLOR (0Xff331f00)
+        #define EVEN_ITEM_TOPIC_COLOR (0Xffff7b01)
+        #define EVEN_ITEM_TIME_COLOR (0Xffffc28b)
+
+        #define IMAGE_ITEM_ARROW "/user/res/Schedule/IMAGE_ITEM_ARROW.bin"
+    };
+}
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleModel.h
new file mode 100644 (file)
index 0000000..3e028f7
--- /dev/null
@@ -0,0 +1,56 @@
+\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/SchedulePresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/SchedulePresenter.h
new file mode 100644 (file)
index 0000000..a4e9ed1
--- /dev/null
@@ -0,0 +1,42 @@
+\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/include/ScheduleView.h
new file mode 100644 (file)
index 0000000..fe44f2b
--- /dev/null
@@ -0,0 +1,129 @@
+\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListAdapter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListAdapter.cpp
new file mode 100644 (file)
index 0000000..83e52d7
--- /dev/null
@@ -0,0 +1,88 @@
+#include "schedule/include/ScheduleListAdapter.h"
+#include "wearable_log.h"
+
+namespace OHOS
+{
+    static ScheduleListAdapter * p_ScheduleListAdapterInstance = nullptr;
+
+    ScheduleListAdapter::ScheduleListAdapter()
+    {
+        p_ScheduleListAdapterInstance = this;
+    }
+
+    ScheduleListAdapter::~ScheduleListAdapter()
+    {
+        p_ScheduleListAdapterInstance = nullptr;
+        nodeList_.Clear();
+    }
+
+    ScheduleListAdapter * ScheduleListAdapter::GetInstance()
+    {
+        return p_ScheduleListAdapterInstance;
+    }
+
+    UIView * ScheduleListAdapter::GetView(UIView * inView, int16_t index)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:GetView,%d", __LINE__, index);
+        if(nodeList_.IsEmpty() || nodeList_.Size() <= index || 0 > index)
+        {
+            return nullptr;
+        }
+
+        ScheduleListItem * item = nullptr;
+        ListNode<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;
+    }
+
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListItem.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleListItem.cpp
new file mode 100644 (file)
index 0000000..4163402
--- /dev/null
@@ -0,0 +1,157 @@
+
+#include "schedule/include/ScheduleListItem.h"
+#include "wearable_log.h"
+
+namespace OHOS
+{
+    ScheduleListItem::ScheduleListItem()
+    {
+        SetPosition(0, 0, ITEM_WIDTH, ITEM_HEIGHT + ITEM_GAP);
+        SetStyle(STYLE_BACKGROUND_COLOR, OHOS::Color::Black().full);
+        SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+        // SetStyle(STYLE_BORDER_RADIUS, 20);
+        // SetTouchable(true);
+
+        InfoGroup_.SetPosition(0, ITEM_GAP>>1, ITEM_WIDTH, ITEM_HEIGHT);
+        InfoGroup_.SetStyle(STYLE_BACKGROUND_COLOR, OHOS::Color::Black().full);
+        InfoGroup_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+        InfoGroup_.SetStyle(STYLE_BORDER_RADIUS, 20);
+        InfoGroup_.SetTouchable(true);
+
+        LabelExtDate_.SetPosition((ITEM_WIDTH - 300)>>1, (ITEM_HEIGHT - 55)>>1, 300, 55);
+        LabelExtDate_.SetStyle(STYLE_TEXT_FONT, 30);
+        LabelExtDate_.SetStyle(STYLE_LINE_HEIGHT, 35);
+        // LabelExtDate_.SetTextId(text_id);
+        LabelExtDate_.SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        LabelExtDate_.SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        LabelExtDate_.SetRollSpeed(23);
+        LabelExtDate_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        LabelExtDate_.SetStyle(STYLE_TEXT_COLOR, 0xffff5a36);
+
+        LabelExtTopic_.SetPosition(47, 22, 250, 35);
+        LabelExtTopic_.SetStyle(STYLE_TEXT_FONT, 30);
+        LabelExtTopic_.SetStyle(STYLE_LINE_HEIGHT, 35);
+        // LabelExtTopic_.SetTextId(text_id);
+        LabelExtTopic_.SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        LabelExtTopic_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP);
+        LabelExtTopic_.SetRollSpeed(23);
+        LabelExtTopic_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        // LabelExtTopic_.SetStyle(STYLE_TEXT_COLOR, 0xffff5a36);
+
+        LabelExtTime_.SetPosition(47, 57, 115, 24);
+        LabelExtTime_.SetStyle(STYLE_TEXT_FONT, 20);
+        LabelExtTime_.SetStyle(STYLE_LINE_HEIGHT, 24);
+        // LabelExtTime_.SetTextId(text_id);
+        LabelExtTime_.SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        LabelExtTime_.SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_TOP);
+        LabelExtTime_.SetRollSpeed(23);
+        LabelExtTime_.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 20);
+        // LabelExtTime_.SetStyle(STYLE_TEXT_COLOR, 0xffff5a36);
+
+        Image_.SetPosition(326, 37, 14, 26);
+        Image_.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);
+        Image_.SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+        Image_.SetResizeMode(UIImageView::CENTER);
+        Image_.SetAutoEnable(false);
+        Image_.SetSrc(IMAGE_ITEM_ARROW);
+
+        InfoGroup_.Add(&LabelExtDate_);
+        InfoGroup_.Add(&LabelExtTopic_);
+        InfoGroup_.Add(&LabelExtTime_);
+        InfoGroup_.Add(&Image_);
+        Add(&InfoGroup_);
+    }
+
+    ScheduleListItem::~ScheduleListItem()
+    {
+        RemoveAll();
+        InfoGroup_.RemoveAll();
+    }
+
+    void ScheduleListItem::SetItemInfo(const ScheduleListItemInfo &itemInfo)
+    {
+        if(true == itemInfo.IsDateItem)
+        {
+            LabelExtDate_.SetText(itemInfo.DateStr.c_str());
+        }
+        else
+        {
+            if(0 == (itemInfo.ChildIndex % 2))
+            {
+                LabelExtTopic_.SetText(itemInfo.TopicStr.c_str());
+                LabelExtTime_.SetText(itemInfo.TimeStr.c_str());
+            }
+            else
+            {
+                LabelExtTopic_.SetText(itemInfo.TopicStr.c_str());
+                LabelExtTime_.SetText(itemInfo.TimeStr.c_str());
+            }
+        }
+    }
+
+    void ScheduleListItem::ResetItemStyle(const ScheduleListItemInfo &itemInfo)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[%d]:ResetItemStyle,%d,%d",
+                                    __LINE__, itemInfo.IsDateItem, itemInfo.ChildIndex);
+
+        if(true == itemInfo.IsDateItem)
+        {
+            // SetHeight(ITEM_HEIGHT- ITEM_GAP);
+
+            // InfoGroup_.SetHeight(ITEM_HEIGHT- ITEM_GAP);
+            InfoGroup_.SetStyle(STYLE_BACKGROUND_COLOR, OHOS::Color::Black().full);
+            InfoGroup_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+            InfoGroup_.SetTouchable(false);
+
+            LabelExtDate_.SetVisible(true);
+            LabelExtTopic_.SetVisible(false);
+            LabelExtTime_.SetVisible(false);
+            Image_.SetVisible(false);
+        }
+        else
+        {
+            if(0 == (itemInfo.ChildIndex % 2))
+            {
+                InfoGroup_.SetStyle(STYLE_BACKGROUND_COLOR, ODD_ITEM_BACKGROUND_COLOR);
+                InfoGroup_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+                InfoGroup_.SetTouchable(true);
+
+                LabelExtDate_.SetVisible(false);
+                LabelExtTopic_.SetVisible(true);
+                LabelExtTime_.SetVisible(true);
+                Image_.SetVisible(true);
+                
+                LabelExtTopic_.SetStyle(STYLE_TEXT_COLOR, ODD_ITEM_TOPIC_COLOR);
+                LabelExtTime_.SetStyle(STYLE_TEXT_COLOR, ODD_ITEM_TIME_COLOR);
+            }
+            else
+            {
+                InfoGroup_.SetStyle(STYLE_BACKGROUND_COLOR, EVEN_ITEM_BACKGROUND_COLOR);
+                InfoGroup_.SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
+                InfoGroup_.SetTouchable(true);
+
+                LabelExtDate_.SetVisible(false);
+                LabelExtTopic_.SetVisible(true);
+                LabelExtTime_.SetVisible(true);
+                Image_.SetVisible(true);
+
+                LabelExtTopic_.SetStyle(STYLE_TEXT_COLOR, EVEN_ITEM_TOPIC_COLOR);
+                LabelExtTime_.SetStyle(STYLE_TEXT_COLOR, EVEN_ITEM_TIME_COLOR);
+            }
+        }
+    }
+
+    void ScheduleListItem::ResetHeight(bool val)
+    {
+        //防止list中元素超过3个后最后一个被遮住,且仅在最后一个元素设置其高度为160
+        if (val)
+        {
+            SetHeight(ITEM_HEIGHT + ITEM_GAP*3);
+        }
+        else
+        {
+            SetHeight(ITEM_HEIGHT + ITEM_GAP);
+        }
+    }
+
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleModel.cpp
new file mode 100644 (file)
index 0000000..fcfd984
--- /dev/null
@@ -0,0 +1,299 @@
+\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/SchedulePresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/SchedulePresenter.cpp
new file mode 100644 (file)
index 0000000..15504ed
--- /dev/null
@@ -0,0 +1,159 @@
+/*\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/schedule/src/ScheduleView.cpp
new file mode 100644 (file)
index 0000000..e1d50d8
--- /dev/null
@@ -0,0 +1,802 @@
+\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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosModel.h
new file mode 100644 (file)
index 0000000..6fc9522
--- /dev/null
@@ -0,0 +1,28 @@
+
+/***
+ * @Date: 2024-05-09 17:46:43
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-05-09 18:04:51
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/include/TakephotosModel.h
+ */
+
+#ifndef Takephotos_MODEL_H
+#define Takephotos_MODEL_H
+#include "TakephotosView.h"
+namespace OHOS
+{
+    class TakephotosModel
+    {
+    public:
+        TakephotosModel();
+        ~TakephotosModel();
+        static TakephotosModel *GetInstance(void);
+        void Init();
+        void SetPopStaust(PopupPhoto status);
+        PopupPhoto GetPopStaust();
+
+    private:
+        PopupPhoto popupStatus = PopupPhoto::CreamPopup;
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosPresenter.h
new file mode 100644 (file)
index 0000000..5353abf
--- /dev/null
@@ -0,0 +1,35 @@
+#ifndef _Takephotos_PRESENTER_H
+#define _Takephotos_PRESENTER_H
+
+#include "Presenter.h"
+#include "TakephotosView.h"
+#include "common/key_code.h"
+
+namespace OHOS
+{
+    class TakephotosView;
+
+    class TakephotosPresenter : public Presenter<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/include/TakephotosView.h
new file mode 100644 (file)
index 0000000..5107e1d
--- /dev/null
@@ -0,0 +1,96 @@
+/***
+ * @Date: 2024-05-08 16:11:48
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-05-08 18:11:27
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/include/TakephotosView.h
+ */
+#ifndef _Takephotos_VIEW_H
+#define _Takephotos_VIEW_H
+
+
+#include "View.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_view_group.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_image_view.h"
+#include "components/ui_button.h"
+#include "components/ui_image_animator.h"
+#include "components/ui_label_button_ext.h"
+#include "components/ui_chart.h"
+#include "components/ui_list.h"
+#include "components/icon_adapter.h"
+#include "wearable_log.h"
+#include "ohos_types.h"
+#include "components/ui_card_page.h"
+#include "uicomponents/UIComponents.h"
+#include "TakephotosPresenter.h"
+
+#ifdef FD230_650
+#include "traing/include/TraingModel.h"
+#include "traing/Training_UiConfig.h"
+#endif
+
+namespace OHOS
+{
+#define BUTTONGO "button_go"
+#define BUTTONTAKE "button_take"
+
+    enum class PopupPhoto
+    {
+        CreamPopup,
+        TakePopup
+    };
+
+    class TakephotosPresenter;
+    class TakephotosView : public View<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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosModel.cpp
new file mode 100644 (file)
index 0000000..d9e41dc
--- /dev/null
@@ -0,0 +1,180 @@
+/***
+ * @Date: 2024-07-06 16:27:31
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-15 20:30:24
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp
+ */
+/***
+ * @Date: 2024-05-09 17:46:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-05-09 18:05:27
+ * @FilePath:
+ * /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosModel.cpp
+ */
+
+#include "takephotos/include/TakephotosModel.h"
+#include "AppViewIDs.h"
+#include "NativeAbility.h"
+#include "broadcast_feature.h"
+#include "broadcast_service.h"
+#include "custom_utils.h"
+#include "samgr_lite.h"
+#include "takephotos/include/TakephotosView.h"
+#include "thread_adapter.h"
+
+#include "wearable_log.h"
+#include <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
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosPresenter.cpp
new file mode 100644 (file)
index 0000000..b99e34f
--- /dev/null
@@ -0,0 +1,136 @@
+/***
+ * @Date: 2024-05-08 16:14:06
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-05-08 18:06:25
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosPresenter.cpp
+ */
+#include "AppViewIDs.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+#include "NativeAbility.h"
+
+#include <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;
+    }
+
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/takephotos/src/TakephotosView.cpp
new file mode 100644 (file)
index 0000000..e27ee4f
--- /dev/null
@@ -0,0 +1,368 @@
+/***
+ * @Date: 2024-08-29 19:34:29
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-30 19:46:48
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/takephotos/src/TakephotosView.cpp
+ */
+
+#include "takephotos/include/TakephotosView.h"
+#include "takephotos/include/TakephotosModel.h"
+
+#include "UiConfig.h"
+#include "common/image_cache_manager.h"
+#include "components/ui_button.h"
+#include "ui_resource_image.h"
+#include "uicomponents/UIComponents.h"
+#include "components/ui_scroll_view.h"
+namespace OHOS
+{
+  static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6;
+  // 遥控拍照
+  static constexpr int IMAGE_SIZE = 140;
+  static constexpr int CREAM_IMAGE_X = 163;
+  static constexpr int CREAM_IMAGE_Y = 103;
+  static constexpr int CREAM_IMAGE_NUM = 50;
+  static constexpr int CREAM_DELAY = 50;
+  // 遥控拍照
+  static ImageAnimatorInfo g_imageAnimatorInfo_takephoto[50] = {
+      {PNG_TAKE_PHOTO_IMAGE_0, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_1, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_2, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_3, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_4, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_5, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_6, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_7, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_8, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_9, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_10, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_11, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_12, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_13, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_14, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_15, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_16, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_17, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_18, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_19, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_20, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_21, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_22, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_23, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_24, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_25, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_26, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_27, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_28, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_30, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_31, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_32, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_33, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_34, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_35, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_36, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_37, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_38, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_39, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_40, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_41, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_42, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_43, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_44, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_45, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_46, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_47, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_48, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+      {PNG_TAKE_PHOTO_IMAGE_49, {CREAM_IMAGE_X, CREAM_IMAGE_Y}, IMAGE_SIZE, IMAGE_SIZE, IMG_SRC_FILE_PATH},
+  };
+
+  static TakephotosView *g_pTakephotosView{nullptr};
+
+  TakephotosView::TakephotosView() { g_pTakephotosView = this; }
+
+  TakephotosView::~TakephotosView()
+  {
+
+    // UIViewGroup *tmpGroup = dynamic_cast<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
index 2ce1f73..3c9fcf0 100644 (file)
@@ -19,6 +19,8 @@ extern "C" {
 #endif\r
 #endif\r
 \r
+#define SUPPORT_CAT1_MODEM\r
+\r
 #ifndef BROADCAST_FEATURE_NAME\r
 #define BROADCAST_FEATURE_NAME "BROADCAST"\r
 #endif\r
@@ -31,24 +33,78 @@ typedef enum {
     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
index 2560ff4..7404f17 100644 (file)
@@ -20,18 +20,73 @@ static const TopicToCore topicToCoreArray[] = {
     {TOPIC_DEMO_ACORE_MSG, A_CORE_MASK, 1},
     {TOPIC_DEMO_ALL_MSG, A_CORE_MASK, 1},
     {TOPIC_EVENT_ALARM_RING, A_CORE_MASK, 1},
+    {TOPIC_EVENT_ON_TIME, A_CORE_MASK, 1},
     {TOPIC_EVENT_UTCTIME_UPDATE, A_CORE_MASK, 1},
     {TOPIC_EVENT_NEXTDAY_UPDATE, A_CORE_MASK, 1},
     {TOPIC_EVENT_WEARSTATE_UPDATE, A_CORE_MASK, 1},
     {TOPIC_EVENT_STEPDATA_UPDATE, A_CORE_MASK, 1},
     {TOPIC_EVENT_SHUTDOWN, A_CORE_MASK, 1},
     {TOPIC_EVENT_HEARTRATE_UPDATA, A_CORE_MASK, 1},
+    {TOPIC_EVENT_STATIC_HEARTRATE_UPDATA, A_CORE_MASK, 1},
+#ifdef CYWEE_SPORT    
+    {TOPIC_EVENT_ACTIVITY_UPDATE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_ACTIVITY_EXTRA_INFO_UPDATE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_AR_ALERT_TYPE_UPDATE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_INACTIVITY_UPDATE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_INACTIVITY_ACCUMULATE_TIME_UPDATE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_BLE_TRAINING,A_CORE_MASK,1},
+    {TOPIC_EVENT_BLE_TRANSMIT,A_CORE_MASK,1},
+    {TOPIC_EVENT_GOAL_SHOW_VIEW,A_CORE_MASK,1},
+    
+#endif
+#ifdef SUPPORT_SPO2_NOTIFICATION
+    {TOPIC_EVENT_SPO2_UPDATE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_START_HRS_MONITORING, A_CORE_MASK, 1},
+    {TOPIC_EVENT_STOP_HRS_MONITORING, A_CORE_MASK, 1},
+    {TOPIC_EVENT_START_SPO2_MONITORING, A_CORE_MASK, 1},
+    {TOPIC_EVENT_STOP_SPO2_MONITORING, A_CORE_MASK, 1},
+    {TOPIC_EVENT_GRAYCARD_UPDATA, A_CORE_MASK, 1},
+    {TOPIC_EVENT_LEAKLIGHT_UPDATA, A_CORE_MASK, 1},
+#endif
     {TOPIC_EVENT_HFP_INCOMMING, A_CORE_MASK, 1},
     {TOPIC_EVENT_HFP_PHONE_ACTIVE, A_CORE_MASK, 1},
     {TOPIC_EVENT_HFP_WATCH_ACTIVE, A_CORE_MASK, 1},
     {TOPIC_EVENT_HFP_FINISHED, A_CORE_MASK, 1},
     {TOPIC_EVENT_HFP_PHONE_TO_WATCH, A_CORE_MASK, 1},
     {TOPIC_EVENT_HFP_WATCH_TO_PHONE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_HFP_HINT, A_CORE_MASK, 1},
+    
+#ifdef SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION
+    {TOPIC_EVENT_CHARGE_PLUG, A_CORE_MASK, 1},
+    {TOPIC_EVENT_CHARGE_UNPLUG, A_CORE_MASK, 1},
+    {TOPIC_EVENT_LOWPOWER_ALARM, A_CORE_MASK, 1},
+#endif
+#ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION
+    {TOPIC_EVENT_DEVICE_BIND,A_CORE_MASK, 1},
+    // {TOPIC_EVENT_DEVICE_UNBIND,A_CORE_MASK, 1},
+    // {TOPIC_EVENT_DEVICE_UNBINDING_REQUEST,A_CORE_MASK, 1},
+#endif
+    {TOPIC_EVENT_ENTER_CMAERA,A_CORE_MASK, 1},//遥控拍照
+    {TOPIC_EVENT_ASSISTANT_NOTE,A_CORE_MASK, 1},//语音助手
+    {TOPIC_EVENT_CANCEL_CMAERA,A_CORE_MASK, 1},
+    {TOPIC_EVENT_FIND_WATCH,A_CORE_MASK, 1},//查找手表
+    {TOPIC_EVENT_CANCEL_FIND_WATCH,A_CORE_MASK, 1},
+    {TOPIC_EVENT_DRINKREMINDER,A_CORE_MASK, 1},
+    {TOPIC_EVENT_MESSAGENOTE,A_CORE_MASK, 1},
+    {TOPIC_EVENT_MESSAGE_UPDATA,A_CORE_MASK, 1},
+    {TOPIC_EVENT_SLEEPNOTE,A_CORE_MASK, 1},
+    {TOPIC_EVENT_DEBUGOUTPUT,A_CORE_MASK, 1},
+    {TOPIC_EVENT_SHUTDOWN_ANIMATIOR,A_CORE_MASK, 1},
+#ifdef SUPPORT_CAT1_MODEM
+    {TOPIC_EVENT_CAT1_INCOMMING, A_CORE_MASK, 1},
+    {TOPIC_EVENT_CAT1_CALLCONNTED, A_CORE_MASK, 1},
+    {TOPIC_EVENT_CAT1_CALLENDED, A_CORE_MASK, 1},
+    {TOPIC_EVENT_CAT1_CALLDIAL, A_CORE_MASK, 1},
+    {TOPIC_EVENT_CAT1_SIGNAL_UPDATE, A_CORE_MASK, 1},
+    {TOPIC_EVENT_CAT1_POWER_ON, A_CORE_MASK, 1},
+    {TOPIC_EVENT_CAT1_POWER_OFF, A_CORE_MASK, 1},
+    {TOPIC_EVENT_CAT1_CALL_FAIL,A_CORE_MASK, 1},
+#endif
 };
 
 /* 所有的topic,其对应的位图 */