#29,解决,手表,秒表和计时器退出后台后就会停止,需要支持后台运行(需求)
authorluozheng <1732036298@qq.com>
Fri, 11 Oct 2024 08:51:34 +0000 (16:51 +0800)
committerluozheng <1732036298@qq.com>
Fri, 11 Oct 2024 08:51:34 +0000 (16:51 +0800)
code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h
code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h
code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp
code/sdk/application/wearable/fd230app/nativeui/countdown/src/MainCountDownPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/countdown/src/MainCountDownView.cpp
code/sdk/application/wearable/fd230app/nativeui/countdown/src/StartCountDownView.cpp

index 45220fb..0642536 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com\r
  * @Date: 2024-04-07 18:15:53\r
  * @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-07-03 18:44:50\r
+ * @LastEditTime: 2024-10-11 16:08:37\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/CountDownModel.h\r
  */\r
 #ifndef COUNTDOWN_MODEL_H\r
@@ -68,6 +68,14 @@ namespace OHOS
     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
@@ -114,6 +122,8 @@ namespace OHOS
         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
 }\r
 #endif
\ No newline at end of file
index 0b43fbb..3d3234f 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com\r
  * @Date: 2024-04-07 18:15:53\r
  * @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-08-20 10:48:28\r
+ * @LastEditTime: 2024-10-11 10:08:56\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/include/MainCountDownView.h\r
  */\r
 #ifndef MAIN_COUNTDOWN_VIEW_H\r
@@ -46,6 +46,7 @@ namespace OHOS
         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
@@ -65,10 +66,9 @@ namespace OHOS
         StartCountDownView *p_StartCountDownView{nullptr};\r
 \r
     private:\r
-        void MainCountDownViewInit(void);\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
-        UIViewGroup *group = nullptr;\r
         UIScrollView *scrollView[COUNTDOWN_MAX_VIEW]{nullptr};\r
         UILabelExt *Title{nullptr};\r
         UILabelExt *QuickStart{nullptr};\r
index 8876031..7518ec0 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com\r
  * @Date: 2024-04-07 18:15:53\r
  * @LastEditors: luozheng 1732036298@qq.com\r
- * @LastEditTime: 2024-09-28 17:51:27\r
+ * @LastEditTime: 2024-10-11 16:17:52\r
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/countdown/src/CountDownModel.cpp\r
  */\r
 #include "countdown/include/CountDownModel.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
 namespace OHOS\r
 {\r
     /* -------------------------------------------------------------------------- */\r
     // 声明定时器变量\r
-    static osTimerId_t g_timer = NULL;\r
+    static osTimerId_t g_timer = nullptr;\r
     int CountDownModel::g_CountDownTimes = {0};\r
     static constexpr int32 NUM_TEN = 10; // 主要用于格式化输出,当小时、分钟或秒小于10时,在其前面添加一个’0’以保持常规时间格式,例如“09:05:03”。\r
     static constexpr int16 NUM_TIME_MIN = 60;\r
@@ -310,7 +312,7 @@ namespace OHOS
     /*触发铃声的开始*/\r
     void CountDownModel::RequestStartRingtone(void)\r
     {\r
-        if(uapi_sleep_mode_flag_get())\r
+        if (uapi_sleep_mode_flag_get())\r
         {\r
             return;\r
         }\r
@@ -326,6 +328,62 @@ namespace OHOS
         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
+            ScreenTurnOn(5 * 1000);                                // 亮屏5s\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
@@ -359,52 +417,32 @@ namespace OHOS
      */\r
     static void CountDown_TimerCallbackProc(int data)\r
     {\r
-        // CountDownModel::g_CountDownTimes--; // 每次回调减少1秒\r
-        // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_CountDownTimes:%d\n", CountDownModel::g_CountDownTimes);\r
-\r
-        if (MainCountDownView::GetInstance() == nullptr)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDown_TimerCallbackProc] GetInstance is NULL");\r
-            return;\r
-        }\r
-\r
-        if (MainCountDownView::GetInstance()->GetStartCountDownView()->GetShowCountDownTimelabel() == nullptr)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDown_TimerCallbackProc] GetShowCountDownTimelabel is NULL");\r
-            return;\r
-        }\r
-\r
-        if (MainCountDownView::GetInstance()->GetStartCountDownView()->GetPlayOrPauseToggleButton() == nullptr)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDown_TimerCallbackProc] GetPlayOrPauseToggleButton is NULL");\r
-            return;\r
-        }\r
-\r
-        if (CountDownModel::GetInstance()->DisplayCountDownDuration() == nullptr)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CountDown_TimerCallbackProc] DisplayCountDownDuration is NULL");\r
-            return;\r
-        }\r
-\r
+        StartCountDownView *p_StartCountDownView = StartCountDownView::GetInstance();\r
         // 检查倒计时是否结束\r
         if (CountDownModel::g_CountDownTimes <= 0)\r
         {\r
-            ScreenTurnOn(5*1000);//亮屏5s\r
-\r
-            MainCountDownView::GetInstance()->GetStartCountDownView()->GetPlayOrPauseToggleButton()->SetVisible(false);\r
-            MainCountDownView::GetInstance()->GetStartCountDownView()->GetRepeatButton()->SetVisible(true);\r
-            CountDownModel::GetInstance()->CountDown_StopTimer(); // 停止定时器\r
-\r
-            /*倒计时结束 显示大图标 */\r
-            MainCountDownView::GetInstance()->GetStartCountDownView()->ShowEndView(true);\r
-\r
-            // 进行倒计时结束时的额外操作,播放声音等\r
-            CountDownModel::GetInstance()->RequestStartRingtone();\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
+                return;\r
+            }\r
+            else\r
+            {\r
+                if (p_StartCountDownView)\r
+                {\r
+                    CountDownModel::GetInstance()->HandCountDownEndOperator();\r
+                }\r
+            }\r
         }\r
         else\r
         {\r
-            // 更新显示\r
-            MainCountDownView::GetInstance()->GetStartCountDownView()->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->DisplayCountDownDuration());\r
+            if (p_StartCountDownView)\r
+            {\r
+                // 更新显示\r
+                p_StartCountDownView->GetShowCountDownTimelabel()->SetText(CountDownModel::GetInstance()->DisplayCountDownDuration());\r
+            }\r
         }\r
 \r
         return;\r
@@ -426,16 +464,16 @@ namespace OHOS
     void CountDownModel::CountDown_StartTimer(uint32_t interval)\r
     {\r
         /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */\r
-        if (g_timer != NULL)\r
+        if (g_timer != nullptr)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDown_StartTimer Timer already exists!!");\r
             return;\r
         }\r
 \r
         /* --------------------------------- 2.创建定时器 -------------------------------- */\r
-        g_timer = osTimerNew((osTimerFunc_t)CountDown_TimerCallback, osTimerPeriodic, NULL, NULL);\r
+        g_timer = osTimerNew((osTimerFunc_t)CountDown_TimerCallback, osTimerPeriodic, nullptr, nullptr);\r
         // 检查定时器创建是否成功\r
-        if (g_timer == NULL)\r
+        if (g_timer == nullptr)\r
         {\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CountDownModel::CountDown_StartTimer Timer create failed!!");\r
             return;\r
@@ -447,15 +485,15 @@ namespace OHOS
         /* --------------------------------- 4.启动定时器 -------------------------------- */\r
         // g_timerStartTimestamp = GetCurrentTimestamp(); // 假设GetCurrentTimestamp()是获取当前时间戳的函数\r
         osStatus_t ret = osTimerStart(g_timer, tick);\r
-        /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 NULL -------------------- */\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 != NULL)\r
+            if (g_timer != nullptr)\r
             {\r
                 ret = osTimerDelete(g_timer);\r
             }\r
-            g_timer = NULL;\r
+            g_timer = nullptr;\r
             return;\r
         }\r
         return;\r
@@ -467,17 +505,18 @@ namespace OHOS
     void CountDownModel::CountDown_StopTimer(void)\r
     {\r
         // 检查定时器是否存在\r
-        if (g_timer != NULL)\r
+        if (g_timer != nullptr)\r
         {\r
             osTimerStop(g_timer);\r
-            // 删除定时器并置为 NULL\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 = NULL;\r
+            g_timer = nullptr;\r
             g_CountDownTimes = 0;\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "stop timer success!!");\r
         }\r
     }\r
     /*\r
@@ -486,7 +525,7 @@ namespace OHOS
     void CountDownModel::CountDown_PauseTimer(void)\r
     {\r
         // 检查定时器是否存在\r
-        if (g_timer != NULL)\r
+        if (g_timer != nullptr)\r
         {\r
             // 暂停定时器,但不删除它\r
             osStatus_t ret = osTimerStop(g_timer);\r
@@ -503,7 +542,7 @@ namespace OHOS
     void CountDownModel::CountDown_ResumeTimer(uint32_t interval)\r
     {\r
         // 检查定时器是否存在\r
-        if (g_timer != NULL)\r
+        if (g_timer != nullptr)\r
         {\r
             int tick = osMs2Tick(interval);\r
             // 恢复定时器\r
index 037a75f..1348873 100644 (file)
@@ -28,8 +28,6 @@ namespace OHOS
 \r
     MainCountDownPresenter::~MainCountDownPresenter()\r
     {\r
-        CountDownModel::GetInstance()->CountDown_StopTimer();                     // 清理定时器资源\r
-        CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources(); // 清理播放器资源\r
         g_pMainCountDownPresenter = nullptr;\r
 #ifdef MEM_CHECK\r
         MemCheck::GetInstance()->EnableLeakCheck(false);\r
@@ -64,6 +62,7 @@ namespace OHOS
     {\r
         Presenter<MainCountDownView>::OnStop();\r
         // ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); // 取消长亮屏\r
+        CountDownModel::GetInstance()->StopRingtonePlaybackAndReleaseResources(); // 清理播放器资源\r
     }\r
 \r
     bool MainCountDownPresenter::OnDrag(UIView &view, const DragEvent &event)\r
@@ -271,6 +270,7 @@ namespace OHOS
         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
@@ -278,6 +278,7 @@ namespace OHOS
             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
index 749f3fc..c3f485c 100644 (file)
@@ -2,6 +2,7 @@
 #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
@@ -18,7 +19,6 @@ namespace OHOS
     MainCountDownView::~MainCountDownView()\r
     {\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::~MainCountDownView");\r
-        ClearAll();\r
         g_pMainCountDownView = nullptr;\r
     }\r
 \r
@@ -29,98 +29,75 @@ namespace OHOS
 \r
     void MainCountDownView::ClearAll()\r
     {\r
-        group->RemoveAll();\r
-        scrollView[MAIN_COUNTDOWN]->RemoveAll();\r
-        ImageCacheManager::GetInstance().UnloadSingleRes(COUNTDOWM_TIMER_ICON);\r
-\r
-        if (Title != nullptr)\r
-        {\r
-            delete Title;\r
-            Title = nullptr;\r
-        }\r
-\r
-        if (QuickStart != nullptr)\r
-        {\r
-            delete QuickStart;\r
-            QuickStart = nullptr;\r
-        }\r
-\r
-        if (CUSTOM_COUNTDOWN != nullptr)\r
-        {\r
-            delete CUSTOM_COUNTDOWN;\r
-            CUSTOM_COUNTDOWN = nullptr;\r
-        }\r
-\r
-        if (COUNTDOWN_ONE_MINUTE_BUTTON != nullptr)\r
-        {\r
-            delete COUNTDOWN_ONE_MINUTE_BUTTON;\r
-            COUNTDOWN_ONE_MINUTE_BUTTON = nullptr;\r
-        }\r
-\r
-        if (COUNTDOWN_FIVE_MINUTE_BUTTON != nullptr)\r
-        {\r
-            delete COUNTDOWN_FIVE_MINUTE_BUTTON;\r
-            COUNTDOWN_FIVE_MINUTE_BUTTON = nullptr;\r
-        }\r
-\r
-        if (COUNTDOWN_TEN_MINUTE_BUTTON != nullptr)\r
-        {\r
-            delete COUNTDOWN_TEN_MINUTE_BUTTON;\r
-            COUNTDOWN_TEN_MINUTE_BUTTON = nullptr;\r
-        }\r
-\r
-        if (COUNTDOWN_THIRTY_MINUTE_BUTTON != nullptr)\r
+        if (scrollView[MAIN_COUNTDOWN] != nullptr)\r
         {\r
-            delete COUNTDOWN_THIRTY_MINUTE_BUTTON;\r
-            COUNTDOWN_THIRTY_MINUTE_BUTTON = nullptr;\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
-\r
         if (p_CountDownTimeConfigView != nullptr)\r
         {\r
             delete p_CountDownTimeConfigView;\r
             p_CountDownTimeConfigView = nullptr;\r
         }\r
-\r
         if (p_CountDownTimeNotNullView != nullptr)\r
         {\r
             delete p_CountDownTimeNotNullView;\r
             p_CountDownTimeNotNullView = nullptr;\r
         }\r
-\r
         if (p_StartCountDownView != nullptr)\r
         {\r
             delete p_StartCountDownView;\r
             p_StartCountDownView = nullptr;\r
         }\r
-\r
-        if (scrollView[MAIN_COUNTDOWN] != nullptr)\r
-        {\r
-            delete scrollView[MAIN_COUNTDOWN];\r
-            scrollView[MAIN_COUNTDOWN] = nullptr;\r
-        }\r
-\r
-        if (group != nullptr)\r
-        {\r
-            delete group;\r
-            group = nullptr;\r
-        }\r
     }\r
 \r
-    void MainCountDownView::MainCountDownViewInit()\r
+    UIScrollView *MainCountDownView::MainCountDownViewInit()\r
     {\r
-        if (group == nullptr)\r
+        if (scrollView[MAIN_COUNTDOWN] == nullptr)\r
         {\r
-            /* ---------------------------------- group --------------------------------- */\r
-            group = new UIViewGroup();\r
-            group->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
-            group->SetTouchable(true);\r
-            group->SetDraggable(true);\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;\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
@@ -129,7 +106,7 @@ namespace OHOS
             if (draglistener == nullptr)\r
             {\r
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "draglistener is nullptr!!");\r
-                return;\r
+                return nullptr;\r
             }\r
             scrollView[MAIN_COUNTDOWN]->SetOnDragListener(draglistener);\r
             scrollView[MAIN_COUNTDOWN]->SetReboundSize(50);              // 设置回弹大小\r
@@ -146,7 +123,7 @@ namespace OHOS
             if (Title == nullptr)\r
             {\r
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title is new fail!!");\r
-                return;\r
+                return nullptr;\r
             }\r
             Title->SetPosition(83, 50, 300, 35);\r
             Title->SetStyle(STYLE_TEXT_FONT, 30);\r
@@ -161,7 +138,7 @@ namespace OHOS
             if (CUSTOM_COUNTDOWN == nullptr)\r
             {\r
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CUSTOM_COUNTDOWN is new fail!!");\r
-                return;\r
+                return nullptr;\r
             }\r
             CUSTOM_COUNTDOWN->SetPosition(43, 130, 380, 100);\r
             CUSTOM_COUNTDOWN->SetViewId(COUNTDOWN_LABELBUTTON_VIEWID);\r
@@ -176,7 +153,7 @@ namespace OHOS
             if (QuickStart == nullptr)\r
             {\r
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "QuickStart is new fail!!");\r
-                return;\r
+                return nullptr;\r
             }\r
             QuickStart->SetPosition(83, 270, 300, 35);\r
             QuickStart->SetStyle(STYLE_TEXT_FONT, 30);\r
@@ -191,28 +168,28 @@ namespace OHOS
             if (COUNTDOWN_ONE_MINUTE_BUTTON == nullptr)\r
             {\r
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "COUNTDOWN_ONE_MINUTE_BUTTON is new fail!!");\r
-                return;\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;\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;\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;\r
+                return nullptr;\r
             }\r
             /* -------------------------------------------------------------------------- */\r
             UIView::OnClickListener *ButtonOnClick = static_cast<UIView::OnClickListener *>(MainCountDownPresenter::GetInstance());\r
@@ -221,7 +198,16 @@ namespace OHOS
             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
@@ -249,7 +235,7 @@ namespace OHOS
         return button;\r
     }\r
 \r
-    //获取开始倒计时视图\r
+    // 获取开始倒计时视图\r
     StartCountDownView *MainCountDownView::GetStartCountDownView(void)\r
     {\r
         return p_StartCountDownView;\r
@@ -258,11 +244,15 @@ namespace OHOS
     /*1.切换到主倒计时视图*/\r
     bool MainCountDownView::ChangeMainCountDown(int16_t thisView)\r
     {\r
-        if (scrollView[thisView] == nullptr)\r
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeMainCountDown");\r
+        UIScrollView *view = MainCountDownViewInit();\r
+        if (view == nullptr)\r
         {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainCountDownView::ChangeMainCountDown");\r
-            group->Add(scrollView[thisView]);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "view nullptr fail");\r
+            return false;\r
         }\r
+        scrollView[thisView] = view;\r
+        container_->Add(scrollView[thisView]);\r
         return true;\r
     }\r
 \r
@@ -278,8 +268,14 @@ namespace OHOS
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
                 return false;\r
             }\r
-            scrollView[thisView] = p_CountDownTimeConfigView->CountDownTimeConfigViewInit();\r
-            group->Add(scrollView[thisView]);\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
+            container_->Add(scrollView[thisView]);\r
         }\r
         return true;\r
     }\r
@@ -296,12 +292,23 @@ namespace OHOS
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
                 return false;\r
             }\r
-            scrollView[thisView] = p_StartCountDownView->StartCountDownViewInit();\r
-            group->Add(scrollView[thisView]);\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
+            container_->Add(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
@@ -318,8 +325,14 @@ namespace OHOS
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView:: new scrollView[%d] fail", thisView);\r
                 return false;\r
             }\r
-            scrollView[thisView] = p_CountDownTimeNotNullView->CountDownTimeNotNullViewInit();\r
-            group->Add(scrollView[thisView]);\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
+            container_->Add(scrollView[thisView]);\r
         }\r
         return true;\r
     }\r
@@ -359,17 +372,43 @@ namespace OHOS
         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
-        if (hideView > COUNTDOWN_MAX)\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:: CountDownViewId Overstep ones bounds");\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MainCountDownView::CheckViewParam failed.");\r
             return;\r
         }\r
-        scrollView[hideView]->SetVisible(false);\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
@@ -377,7 +416,26 @@ namespace OHOS
     void MainCountDownView::OnStart()\r
     {\r
         View<MainCountDownPresenter>::OnStart();\r
-        MainCountDownViewInit();\r
+        SetContainerView(new UIViewGroup());\r
+        if (GetContainer() == nullptr)\r
+        {\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "container_ new fail!!");\r
+            return;\r
+        }\r
+        container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+        container_->SetTouchable(true);\r
+        container_->SetDraggable(true);\r
+        /* -------------------------------------------------------------------------- */\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
         RootView::OnKeyActListener *keyactListener = (RootView::OnKeyActListener *)OHOS::MainCountDownPresenter::GetInstance();\r
         RootView::GetInstance()->SetOnKeyActListener(keyactListener);\r
@@ -386,16 +444,6 @@ namespace OHOS
     void MainCountDownView::OnSetUpView()\r
     {\r
         View<MainCountDownPresenter>::OnSetUpView();\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
-        group->Add(scrollView[MAIN_COUNTDOWN]);\r
-        RootView::GetInstance()->Add(group);\r
-        container_ = group;\r
         Draw();\r
     }\r
 \r
@@ -409,7 +457,13 @@ namespace OHOS
     {\r
         View<MainCountDownPresenter>::OnStop();\r
         RootView::GetInstance()->ClearOnKeyActListener();\r
-        RootView::GetInstance()->RemoveAll();\r
+        if (container_ != nullptr)\r
+        {\r
+            container_->RemoveAll();\r
+            delete container_;\r
+            container_ = nullptr;\r
+        }\r
+        ClearAll();\r
         return;\r
     }\r
 }
\ No newline at end of file
index cd34de0..7a04500 100644 (file)
@@ -136,7 +136,10 @@ namespace OHOS
             showCountDownTimelabel->SetPosition(33, 138, 400, 94);\r
             showCountDownTimelabel->SetStyle(STYLE_TEXT_FONT, 80);\r
             showCountDownTimelabel->SetStyle(STYLE_LINE_HEIGHT, 94);\r
-            showCountDownTimelabel->SetText(CountDownModel::GetInstance()->GetCountDownTime().c_str());\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
@@ -176,6 +179,10 @@ namespace OHOS
             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