计时器slice合并提交 1709/2
authorluozheng <1732036298@qq.com>
Wed, 26 Mar 2025 02:59:22 +0000 (10:59 +0800)
committerluozheng <1732036298@qq.com>
Wed, 26 Mar 2025 02:59:22 +0000 (10:59 +0800)
12 files changed:
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]

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