Merge #1102 into sdk602patch0626 from refs/changes/1102/head 1104/target/1
author罗正 <1732036298@qq.com>
Fri, 4 Oct 2024 12:51:21 +0000 (12:51 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Fri, 4 Oct 2024 12:51:21 +0000 (12:51 +0000)
Code review from 罗正

* refs/changes/1102/head: (4 commits squashed)

  - 完成#128,手表,呼吸训练,现在呼吸训练没有训练时长选择(需求)

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - Merge branch &#39;sdk602patch0626&#39; of https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230 into sdk602patch0626

  - 解决呼吸训练的时长选择界面最后一个组件被遮住bug

Signed-off-by: 罗正 <1732036298@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/1102
13 files changed:
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingPresenter.h
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin [new file with mode: 0644]
code/sdk/drivers/peripheral/config/include/ConfigModel.h

index 7ab7208..c35a0a1 100644 (file)
@@ -412,6 +412,7 @@ set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingCompletedView.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp
 
     #显示方式
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/themestyle/src/ThemeStyleModel.cpp
diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h
new file mode 100644 (file)
index 0000000..50629e3
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-09-29 17:51:20
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-10-04 17:47:43
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h
+ */
+#ifndef RESPIRATORY_TRAINING_DURATION_SELECTION_VIEW_H
+#define RESPIRATORY_TRAINING_DURATION_SELECTION_VIEW_H
+#include "components/ui_scroll_view.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_label_button_ext.h"
+#include "BaseView.h"
+#include "components/ui_image_view.h"
+namespace OHOS
+{
+#define MAX_NUM_TRAINING_DURATION 5
+
+    static constexpr const char *RESPIRATORYTRAINING_DURATIONSELECTION_VIEW = "RespiratoryTrainingDurationSelectionView";
+    static constexpr const char *TRAINING_DURATION_ONE_MIN = "training_duration_one_min";
+    static constexpr const char *TRAINING_DURATION_TWO_MIN = "training_duration_two_min";
+    static constexpr const char *TRAINING_DURATION_THREE_MIN = "training_duration_three_min";
+    static constexpr const char *TRAINING_DURATION_FOUR_MIN = "training_duration_four_min";
+    static constexpr const char *TRAINING_DURATION_FIVE_MIN = "training_duration_five_min";
+    class RespiratoryTrainingDurationSelectionView
+    {
+    public:
+        struct LabelButtonConfig
+        {
+            int16_t left;
+            int16_t top;
+            int16_t width;
+            int16_t height;
+            const char *viewId;
+        };
+        struct LabelConfig
+        {
+            int16_t left;
+            int16_t top;
+            int16_t width;
+            int16_t height;
+            int16_t fontSize;
+            int16_t lineHeigh;
+            const char *text;
+            int16_t textId;
+            uint8_t lineBreakMode;
+        };
+        RespiratoryTrainingDurationSelectionView(/* args */);
+        ~RespiratoryTrainingDurationSelectionView();
+        static RespiratoryTrainingDurationSelectionView *GetInstance(void);
+        UIScrollView *RespiratoryTrainingDurationSelectionViewInit(void);
+        void UpdateRespiratoryTrainingDurationSelectionView(void);
+
+    private:
+        UILabelExt *LabelViewinit(LabelConfig &labelconfig);
+        UILabelButtonExt *LabelButtonViewInit(LabelButtonConfig &labelbuttonconfig);
+        void ClearAll(void);
+        UIScrollView *scrollView = nullptr;
+        UILabelExt *TitleLabel = nullptr;                                     // 标题
+        UILabelExt *DurationLabel[MAX_NUM_TRAINING_DURATION]{nullptr};        // 亮屏时长标签
+        UILabelButtonExt *DurationButton[MAX_NUM_TRAINING_DURATION]{nullptr}; // 放置组件的按钮
+        UIImageView *temp{nullptr};
+    };
+
+}
+#endif
\ No newline at end of file
index fe7ac2f..41e9787 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-11 16:26:13
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-28 20:13:17
+ * @LastEditTime: 2024-10-04 19:59:41
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingModel.h
  */
 #ifndef RESPIRATORY_TRAINING_MODEL_H
@@ -18,14 +18,19 @@ namespace OHOS
     public:
         static RespiratoryTrainingModel &GetInstance(void);
         void AddRespiratoryTrainingTimes(void);
-        std::string GetRespiratoryTrainingTotalTime(void) ;
+        std::string GetRespiratoryTrainingTotalTime(void);
         int GetAverageHeartRate(void);
         void calculateHeartrateTotal(void);
         void ResumeStatus();
-        
+
         void RT_StartTimer(uint32_t interval);
         void RT_StopTimer(void);
 
+        int GetRespiratoryTrainingSelectTime();
+        void SetRespiratoryTrainingSelectTime(int time);
+        uint64_t GetRespiratoryTrainingTime();
+        void ClearTotalRespiratoryTrainingTime(void);
+
     private:
         RespiratoryTrainingModel();
         ~RespiratoryTrainingModel();
@@ -33,10 +38,11 @@ namespace OHOS
         RespiratoryTrainingModel &operator=(const RespiratoryTrainingModel &) = delete;
 
         int RespiratoryTrainingTimes{0}; // 呼吸训练次数
-        std::string RespiratoryTrainingTime{nullptr};
+        int RespiratoryTrainingTime{0};  
         std::string HeartRateValue{nullptr};
         int count{0};
         float heartTotal{0};
+        int selectTime{1};
     };
 }
 
index c1fd994..7ae41b7 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-08 09:36:33
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-08 11:00:44
+ * @LastEditTime: 2024-10-04 18:26:41
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingPresenter.h
  */
 
@@ -32,6 +32,9 @@ namespace OHOS
 
         static RespiratoryTrainingPresenter *GetInstance();
 
+        std::string GetRespiratoryTrainingSelectTime();
+        std::string GetRespiratoryTrainingSelectTime1();
+
     private:
         bool OnClick(UIView &view, const ClickEvent &event) override;
         bool OnDrag(UIView &view, const DragEvent &event) override;
index 0ff3584..39a8796 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-08 09:36:01
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-06-13 09:22:22
+ * @LastEditTime: 2024-10-04 17:47:26
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/include/RespiratoryTrainingView.h
  */
 
@@ -19,6 +19,7 @@
 #include "hal_tick.h"
 #include "components/ui_scroll_view.h"
 #include "respiratorytraining/include/RespiratoryTrainingCompletedView.h"
+#include "respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h"
 
 namespace OHOS
 {
@@ -26,6 +27,7 @@ namespace OHOS
     {
         RESPIRATORYTRAINING = 0,
         RESPIRATORYTRAININGCOMPLETED,
+        RESPIRATORY_TRAINING_DURATION_SELECTION, // 训练时长选择
         MAX_RESPIRATORYTRAININGID,
     } RESPIRATORYTRAININGVIEWID;
 
@@ -78,6 +80,7 @@ namespace OHOS
         void ChangeView(int16_t hideView, int16_t showView);
         bool ChangeRespiratoryTrainingView(int16_t thisView);
         bool ChangeRespiratoryTrainingCompletedView(int16_t thisView);
+        bool ChangeRespiratoryTrainingDurationSelectionView(int16_t thisView);
         Animator *GetRespiratoryTrainingAnimator_();
         bool StartRespiratoryTraining();
         void OnStart() override;
@@ -90,28 +93,27 @@ namespace OHOS
     private:
         void RespiratoryTrainingViewInit(void);
         void ClearAll(void);
-#if 0
-        void InitializeRespiratoryTrainingImageInfo();
-        void SetAnimatorViewProperties();
-        void CreateRespiratoryTrainingAnimatorView();
-        void CreateRespiratoryTrainingLabelView();
-        void SetLabelViewProperties();
-        UILabelExt *RespiratoryTrainingLabelView{nullptr};
-        UIImageAnimatorView *RespiratoryTrainingAnimatorView{nullptr}; // 呼吸训练动画
-        const char **RespiratoryTrainingArray{nullptr};
-#endif
         bool InitRespiratoryTrainingElements();
+        bool InitRespiratoryTrainingElements2();
         bool InitRespiratoryTrainingCallBackAndAnimator();
         bool InitRespiratoryTrainingScrollView();
+        void HandStartRespiratoryTraining();
         UIScrollView *RespiratoryTrainingScrollView[MAX_RESPIRATORYTRAININGID]{nullptr};
         RespiratoryTrainingCompletedView *p_RespiratoryTrainingCompletedView{nullptr};
+        RespiratoryTrainingDurationSelectionView *p_RespiratoryTrainingDurationSelectionView{nullptr};
         RespiratoryTrainingCallback *RespiratoryTrainingCallBack_ = nullptr;
         Animator *RespiratoryTrainingAnimator_ = nullptr;
         UIImageView *RespiratoryTrainingImg_ = nullptr;
-        // UILabelButton *RespiratoryTrainingStart_ = nullptr;
         UILabelExt *RespiratoryTrainingStartNote_ = nullptr;
         UILabelExt *RespiratoryTrainingLabel_ = nullptr;
         bool animateStart_ = false;
+        /* -------------------------------------------------------------------------- */
+        UILabelExt *titlelabel{nullptr};                          // 标题
+        UILabelExt *TrainingDurationSelectiontitlelabel{nullptr}; // 选择的训练时长
+        UIImageView *Image{nullptr};
+        UILabelButton *RespiratoryTrainingStartButton = nullptr; // 训练开始按钮
+        UILabelExt *RespiratoryTrainingStartLabel = nullptr;  // 训练开始标签
+        /* -------------------------------------------------------------------------- */
     };
 
 }
index ef42461..d216594 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-05-07 11:25:58
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-28 20:06:40
+ * @LastEditTime: 2024-10-04 19:53:55
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTrainingCompleted/src/RespiratoryTrainingCompletedView.cpp
  */
 
@@ -197,9 +197,14 @@ namespace OHOS
         int y1 = 248, y2 = 286;
         const int textId[MAX_NUM] = {STR_THIS_BREATH, STR_MEAN_HEART_RATE_MIN, STR_TODAYS_BREATHING_TRAINING};
         int value = RespiratoryTrainingModel::GetInstance().GetAverageHeartRate();
-        std::string heartRateValue = std::to_string(value);
+        std::string select_time;
+        if (RespiratoryTrainingPresenter::GetInstance())
+        {
+            select_time = RespiratoryTrainingPresenter::GetInstance()->GetRespiratoryTrainingSelectTime1();
+        }
+        std::string heartRateValue = (value == 0 ? "--" : std::to_string(value));
         std::string trainingTotalTime = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingTotalTime();
-        const char *text[MAX_NUM] = {"01:00", heartRateValue.c_str(), trainingTotalTime.c_str()};
+        const char *text[MAX_NUM] = {select_time.c_str(), heartRateValue.c_str(), trainingTotalTime.c_str()};
         OHOS::ColorType RTCDynamicLabelTextColor[MAX_NUM] = {
             Color::GetColorFromRGBA(0x1d, 0xda, 0xc4, 0xff),
             Color::GetColorFromRGBA(0xff, 0x5a, 0x36, 0xff),
@@ -237,6 +242,7 @@ namespace OHOS
                 return false;
             }
             RTCDynamicLabelView[i]->SetTextColor(RTCDynamicLabelTextColor[i]);
+            RTCDynamicLabelView[i]->SetFont(DEFAULT_VECTOR_FONT_FILENAME_EN, 30);
             ScrollView->Add(RTCDynamicLabelView[i]);
         }
         return true;
diff --git a/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp b/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp
new file mode 100644 (file)
index 0000000..ea0517e
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * @Author: luozheng 1732036298@qq.com
+ * @Date: 2024-09-29 15:57:59
+ * @LastEditors: luozheng 1732036298@qq.com
+ * @LastEditTime: 2024-10-04 20:24:42
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingDurationSelectionView.cpp
+ */
+#include "respiratorytraining/include/RespiratoryTrainingDurationSelectionView.h"
+#include "respiratorytraining/include/RespiratoryTrainingPresenter.h"
+#include "respiratorytraining/include/RespiratoryTrainingModel.h"
+#include "wearable_log.h"
+#include "UiConfig.h"
+#include "dock/focus_manager.h"
+namespace OHOS
+{
+
+    static RespiratoryTrainingDurationSelectionView *g_pRespiratoryTrainingDurationSelectionView{nullptr};
+    RespiratoryTrainingDurationSelectionView::RespiratoryTrainingDurationSelectionView(/* args */)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingDurationSelectionView::RespiratoryTrainingDurationSelectionView");
+        g_pRespiratoryTrainingDurationSelectionView = this;
+    }
+
+    RespiratoryTrainingDurationSelectionView::~RespiratoryTrainingDurationSelectionView()
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingDurationSelectionView::~RespiratoryTrainingDurationSelectionView");
+        ClearAll();
+        g_pRespiratoryTrainingDurationSelectionView = nullptr;
+    }
+
+    RespiratoryTrainingDurationSelectionView *RespiratoryTrainingDurationSelectionView::GetInstance(void)
+    {
+        return g_pRespiratoryTrainingDurationSelectionView;
+    }
+
+    void RespiratoryTrainingDurationSelectionView::ClearAll(void)
+    {
+        if (scrollView)
+        {
+            scrollView->RemoveAll();
+            delete TitleLabel;
+            TitleLabel = nullptr;
+            for (int i = 0; i < MAX_NUM_TRAINING_DURATION; i++)
+            {
+                delete DurationLabel[i];
+                DurationLabel[i] = nullptr;
+                delete DurationButton[i];
+                DurationButton[i] = nullptr;
+            }
+            delete temp;
+            temp = nullptr;
+            delete scrollView;
+            scrollView = nullptr;
+        }
+    }
+
+    UILabelExt *RespiratoryTrainingDurationSelectionView::LabelViewinit(LabelConfig &labelconfig)
+    {
+        UILabelExt *label = new UILabelExt();
+        if (label == nullptr)
+        {
+            return nullptr;
+        }
+        label->SetPosition(labelconfig.left, labelconfig.top, labelconfig.width, labelconfig.height);
+        label->SetStyle(STYLE_TEXT_FONT, labelconfig.fontSize);
+        label->SetStyle(STYLE_LINE_HEIGHT, labelconfig.lineHeigh);
+        // label->SetTextId(labelconfig.textId);
+        label->SetText(labelconfig.text);
+        label->SetLineBreakMode(labelconfig.lineBreakMode);
+        label->SetAlign(TEXT_ALIGNMENT_LEFT, TEXT_ALIGNMENT_CENTER);
+        label->SetRollSpeed(70);
+        label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelconfig.fontSize);
+        return label;
+    }
+
+    UILabelButtonExt *RespiratoryTrainingDurationSelectionView::LabelButtonViewInit(LabelButtonConfig &labelbuttonconfig)
+    {
+        UILabelButtonExt *labelButton = new UILabelButtonExt();
+        if (labelButton == nullptr)
+        {
+            return nullptr;
+        }
+        labelButton->SetPosition(labelbuttonconfig.left, labelbuttonconfig.top);
+        labelButton->Resize(labelbuttonconfig.width, labelbuttonconfig.height);
+        labelButton->SetViewId(labelbuttonconfig.viewId);
+        labelButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+        labelButton->SetImagePosition(300, 30);
+        labelButton->SetImageSrc(PNG_CHECKBOX_OFF_IMAGE, PNG_CHECKBOX_OFF_IMAGE);
+        // labelButton->SetTextId(labelbuttonconfig.textId);
+        // labelButton->SetAlign(TEXT_ALIGNMENT_LEFT);
+        // labelButton->SetLabelPosition(100, 0);
+        // labelButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, labelbuttonconfig.fontSize);
+        // labelButton->SetStyle(STYLE_LINE_HEIGHT, labelbuttonconfig.lineHeigh);
+        labelButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED);
+        return labelButton;
+    }
+
+    UIScrollView *RespiratoryTrainingDurationSelectionView::RespiratoryTrainingDurationSelectionViewInit(void)
+    {
+        if (scrollView == nullptr)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThemeStyleView::InitThemeStyleScrollView");
+            scrollView = new UIScrollView();
+            if (scrollView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "scrollView new fail!");
+                return nullptr;
+            }
+            scrollView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+            scrollView->SetViewId(RESPIRATORYTRAINING_DURATIONSELECTION_VIEW);
+            scrollView->SetScrollBlankSize(30);
+            scrollView->SetReboundSize(30);
+            scrollView->SetDirection(1);
+            scrollView->SetTouchable(true);
+            scrollView->SetDraggable(true);
+            scrollView->SetThrowDrag(true);         // 设置手指抬起屏幕后是否继续滚动。
+            scrollView->SetMaxScrollDistance(1000); // 设置手指抬起屏幕后的最大滚动距离。
+            scrollView->SetSwipeACCLevel(800);      /*设置手指抬起屏幕后的补偿距离。*/
+            scrollView->SetRotateFactor(1.0);
+            FocusManager::GetInstance()->RequestFocus(scrollView);
+            FocusManager::GetInstance()->RequestFocusByDirection(FOCUS_DIRECTION_UP);
+            UIView::OnDragListener *dragListener = static_cast<UIView::OnDragListener *>(RespiratoryTrainingPresenter::GetInstance());
+            if (dragListener == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dragListener is nullptr!");
+                return nullptr;
+            }
+            scrollView->SetOnDragListener(dragListener);
+            /* -------------------------------------------------------------------------- */
+            TitleLabel = new UILabelExt();
+            if (TitleLabel == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TitleLabel new fail!");
+                return nullptr;
+            }
+            TitleLabel->SetPosition(83, 50, 300, 35);
+            TitleLabel->SetText("时长设置"); // 时长设置
+            TitleLabel->SetStyle(STYLE_TEXT_FONT, 30);
+            TitleLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+            TitleLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+            TitleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+            TitleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+            scrollView->Add(TitleLabel);
+            /* -------------------------------------------------------------------------- */
+            UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>(RespiratoryTrainingPresenter::GetInstance());
+            if (clickListener == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "clickListener is nullptr!");
+                return nullptr;
+            }
+            LabelButtonConfig labelbuttonconfig;
+            const char *viewId[MAX_NUM_TRAINING_DURATION] = {TRAINING_DURATION_ONE_MIN, TRAINING_DURATION_TWO_MIN, TRAINING_DURATION_THREE_MIN, TRAINING_DURATION_FOUR_MIN, TRAINING_DURATION_FIVE_MIN};
+            for (int i = 0; i < MAX_NUM_TRAINING_DURATION; i++)
+            {
+                labelbuttonconfig.left = 43;
+                labelbuttonconfig.top = 120 + 120 * i;
+                labelbuttonconfig.width = 380;
+                labelbuttonconfig.height = 100;
+                labelbuttonconfig.viewId = viewId[i];
+                DurationButton[i] = LabelButtonViewInit(labelbuttonconfig);
+                if (DurationButton[i] == nullptr)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DurationButton[%d] is nullptr", i);
+                    return nullptr;
+                }
+                DurationButton[i]->SetOnClickListener(clickListener);
+                scrollView->Add(DurationButton[i]);
+            }
+            /* -------------------------------------------------------------------------- */
+            // int16_t textId[MAX_NUM_TRAINING_DURATION] = {STR_1_MIN, STR_CELLULAR_DISPLAY, STR_5_MIN};
+            const char *text[MAX_NUM_TRAINING_DURATION] = {"1分钟", "2分钟", "3分钟", "4分钟", "5分钟"};
+            LabelConfig labelConfig = {
+                .left = 103,
+                .top = 153,
+                .width = 210,
+                .height = 35,
+                .fontSize = 30,
+                .lineHeigh = 35,
+                .textId = 0,
+                .lineBreakMode = UILabel::LINE_BREAK_OSCILLATION,
+            };
+            for (int16_t i = 0; i < MAX_NUM_TRAINING_DURATION; i++)
+            {
+                labelConfig.top = 153 + 120 * i;
+                // labelConfig.textId = textId[i];
+                labelConfig.text = text[i];
+                DurationLabel[i] = LabelViewinit(labelConfig);
+                if (DurationLabel[i] == nullptr)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "DurationLabel[%d] is nullptr", i);
+                    return nullptr;
+                }
+                scrollView->Add(DurationLabel[i]);
+            }
+            /* -------------------------------------------------------------------------- */
+            if (temp == nullptr)
+            {
+                temp = new UIImageView();
+                if (temp == nullptr)
+                {
+                    return nullptr;
+                }
+                int y = DurationButton[MAX_NUM_TRAINING_DURATION - 1]->GetY() + DurationButton[MAX_NUM_TRAINING_DURATION - 1]->GetHeight();
+                temp->SetPosition(43, y, 380, 40);
+                temp->SetVisible(false);
+                scrollView->Add(temp);
+            }
+        }
+        UpdateRespiratoryTrainingDurationSelectionView();
+        return scrollView;
+    }
+
+    void RespiratoryTrainingDurationSelectionView::UpdateRespiratoryTrainingDurationSelectionView(void)
+    {
+        for (int i = 0; i < MAX_NUM_TRAINING_DURATION; i++)
+        {
+            if (i == RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingSelectTime() - 1)
+            {
+                DurationButton[i]->SetImageSrc(PNG_CHECKBOX_ON_IMAGE, PNG_CHECKBOX_ON_IMAGE);
+            }
+            else
+            {
+                DurationButton[i]->SetImageSrc(PNG_CHECKBOX_OFF_IMAGE, PNG_CHECKBOX_OFF_IMAGE);
+            }
+            DurationButton[i]->Invalidate();
+        }
+    }
+}
index 3c15415..47a4435 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-11 16:26:20
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-28 20:12:26
+ * @LastEditTime: 2024-10-04 20:05:04
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/respiratorytraining/src/RespiratoryTrainingModel.cpp
  */
 #include "respiratorytraining/include/RespiratoryTrainingModel.h"
 #include "heartrate/include/HeartModel.h"
 #include <custom_utils.h>
 #include "gfx_utils/mem_check.h"
+#include "ConfigModel.h"
+
+#include <chrono>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+#include <thread>
+#include <unordered_map>
 namespace OHOS
 {
     // 声明定时器变量
     static osTimerId_t g_timer = NULL;
-    static int Time = 0;
-    static constexpr int ONE_MINUTE = 60; // 一分钟
-    static bool START_FLAG = false;
+    static constexpr uint64_t ONE_MIN = 60000 * 1;   // 1分钟
+    static constexpr uint64_t TWO_MIN = 60000 * 2;   // 2分钟
+    static constexpr uint64_t THREE_MIN = 60000 * 3; // 3分钟
+    static constexpr uint64_t FOUR_MIN = 60000 * 4;  // 4分钟
+    static constexpr uint64_t FIVE_MIN = 60000 * 5;  // 5分钟
 
     RespiratoryTrainingModel::RespiratoryTrainingModel() {}
 
@@ -34,6 +44,46 @@ namespace OHOS
         return instance;
     }
 
+    // 获取训练时长,单位min
+    int RespiratoryTrainingModel::GetRespiratoryTrainingSelectTime()
+    {
+        return ConfigModel::GetInstance()->get_configData_int(ConfigModel::CONFIGMODEL_ITEM_RESPIRATORY_TRAINING_DURATION_SELECTION);
+    }
+
+    // 设置训练时长,单位min
+    void RespiratoryTrainingModel::SetRespiratoryTrainingSelectTime(int time)
+    {
+        ConfigModel::GetInstance()->set_condigData_Int(ConfigModel::CONFIGMODEL_ITEM_RESPIRATORY_TRAINING_DURATION_SELECTION, time);
+    }
+
+    uint64_t RespiratoryTrainingModel::GetRespiratoryTrainingTime()
+    {
+        int time = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingSelectTime();
+        uint64_t time_;
+        switch (time_)
+        {
+        case 1:
+            time_ = ONE_MIN;
+            break;
+        case 2:
+            time_ = TWO_MIN;
+            break;
+        case 3:
+            time_ = THREE_MIN;
+            break;
+        case 4:
+            time_ = FOUR_MIN;
+            break;
+        case 5:
+            time_ = FIVE_MIN;
+            break;
+        default:
+            time_ = ONE_MIN;
+            break;
+        }
+        return time_;
+    }
+
     // 每进行一次呼吸训练,呼吸训练次数自加1
     void RespiratoryTrainingModel::AddRespiratoryTrainingTimes()
     {
@@ -43,36 +93,64 @@ namespace OHOS
     // 获取呼吸训练总时间
     std::string RespiratoryTrainingModel::GetRespiratoryTrainingTotalTime(void)
     {
-        RespiratoryTrainingTime = std::to_string(RespiratoryTrainingTimes) + "min";
-        return RespiratoryTrainingTime;
+        RespiratoryTrainingTime += GetRespiratoryTrainingSelectTime();
+        return (std::to_string(RespiratoryTrainingTime) + "min");
     }
 
-    //获取平均心率值
+    // 获取平均心率值
     int RespiratoryTrainingModel::GetAverageHeartRate(void)
     {
-        if(count != 0) {
+        if (count != 0)
+        {
             return heartTotal / count;
         }
         return 0;
     }
 
+    // 清除当日的呼吸训练时间
+    void RespiratoryTrainingModel::ClearTotalRespiratoryTrainingTime(void)
+    {
+        if (RespiratoryTrainingTime != 0)
+        {
+            RespiratoryTrainingTime = 0;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ClearTotalRespiratoryTrainingTime success!!");
+        }
+    }
+
     void RespiratoryTrainingModel::calculateHeartrateTotal(void)
     {
-        heartTotal += HeartModel::GetInstance()->GetShowHeartdata();
-        count++;
+        // 获取当前时间(以微秒为单位)
+        uint32_t currentTime = static_cast<uint32_t>(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count());
+
+        // 记录和检查上一次调用的时间
+        static uint32_t lastCallTime = 0;
+        if (currentTime - lastCallTime < 1000000)
+        {
+            // 小于1秒
+            return;
+        }
+        lastCallTime = currentTime; // 更新最后调用时间
+
+        uint16_t heartrate = HeartModel::GetInstance()->GetShowHeartdata();
+        if (heartrate != 0)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartrate = %d", heartrate);
+            heartTotal += heartrate;
+            count++;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "heartTotal = %0.f,count = %d,h_rate = %d", heartTotal, count, heartrate);
+        }
     }
 
     void RespiratoryTrainingModel::ResumeStatus()
     {
-        Time = 5;
-        START_FLAG = false;
+        heartTotal = 0;
+        count = 0;
         HeartModel::GetInstance()->Heart_Control(HeartState::End, HeartCheck::INITIATIVE); // 关闭心率检测
     }
     /* -------------------------------------------------------------------------- */
     /*定时器到期时的处理*/
     static void RT_TimerCallbackProc(int data)
     {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RT_TimerCallbackProc,Time = %d", Time);
         RespiratoryTrainingView *p_RespiratoryTrainingView = RespiratoryTrainingView::GetInstance();
         if (p_RespiratoryTrainingView == nullptr)
         {
index 18129cb..ecbd147 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-05-07 11:26:06
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-08-14 10:24:30
+ * @LastEditTime: 2024-10-04 18:05:11
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTraining/src/RespiratoryTrainingPresenter.cpp
  */
 
@@ -17,6 +17,7 @@
 #include <string>
 #include "respiratorytraining/include/RespiratoryTrainingModel.h"
 #include "gfx_utils/mem_check.h"
+#include "map"
 namespace OHOS
 {
 
@@ -75,6 +76,27 @@ namespace OHOS
         if (viewId == RTCLABELBUTTON)
         {
             NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            return true;
+        }
+        std::map<std::string, int> viewMap = {
+            {TRAINING_DURATION_ONE_MIN, 1},
+            {TRAINING_DURATION_TWO_MIN, 2},
+            {TRAINING_DURATION_THREE_MIN, 3},
+            {TRAINING_DURATION_FOUR_MIN, 4},
+            {TRAINING_DURATION_FIVE_MIN, 5},
+        };
+        auto it = viewMap.find(viewId);
+        if (it != viewMap.end())
+        {
+            if (viewId == it->first)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "select time = %d", it->second);
+                RespiratoryTrainingModel::GetInstance().SetRespiratoryTrainingSelectTime(it->second);
+                if (RespiratoryTrainingDurationSelectionView::GetInstance())
+                {
+                    RespiratoryTrainingDurationSelectionView::GetInstance()->UpdateRespiratoryTrainingDurationSelectionView();
+                }
+            }
         }
         return true;
     }
@@ -92,11 +114,18 @@ namespace OHOS
 
     bool RespiratoryTrainingPresenter::OnDragEnd(UIView &view, const DragEvent &event)
     {
-        UNUSED(view);
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingPresenter::OnDragEnd");
         if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT && RespiratoryTrainingPresenter::X_DRAG_FLAG)
         {
-            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            std::string viewId = view.GetViewId();
+            if (viewId == RESPIRATORYTRAINING_DURATIONSELECTION_VIEW)
+            {
+                view_->ChangeView(RESPIRATORY_TRAINING_DURATION_SELECTION, RESPIRATORYTRAINING);
+            }
+            else
+            {
+                NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+            }
             RespiratoryTrainingPresenter::X_DRAG_FLAG = false;
         }
         return true;
@@ -115,4 +144,60 @@ namespace OHOS
         }
         return true;
     }
+
+    std::string RespiratoryTrainingPresenter::GetRespiratoryTrainingSelectTime()
+    {
+        int time = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingSelectTime();
+        std::string text;
+        switch (time)
+        {
+        case 1:
+            text = "1分钟 >";
+            break;
+        case 2:
+            text = "2分钟 >";
+            break;
+        case 3:
+            text = "3分钟 >";
+            break;
+        case 4:
+            text = "4分钟 >";
+            break;
+        case 5:
+            text = "5分钟 >";
+            break;
+        default:
+            text = "1分钟 >";
+            break;
+        }
+        return text;
+    }
+
+    std::string RespiratoryTrainingPresenter::GetRespiratoryTrainingSelectTime1()
+    {
+        int time = RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingSelectTime();
+        std::string text;
+        switch (time)
+        {
+        case 1:
+            text = "1min";
+            break;
+        case 2:
+            text = "2min";
+            break;
+        case 3:
+            text = "3min";
+            break;
+        case 4:
+            text = "4min";
+            break;
+        case 5:
+            text = "5min";
+            break;
+        default:
+            text = "1min";
+            break;
+        }
+        return text;
+    }
 }
\ No newline at end of file
index 181d067..a6e39d6 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-05-07 11:25:58
  * @LastEditors: luozheng 1732036298@qq.com
- * @LastEditTime: 2024-09-28 20:13:37
+ * @LastEditTime: 2024-10-04 18:26:22
  * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/RespiratoryTraining/src/RespiratoryTrainingView.cpp
  */
 
@@ -46,6 +46,10 @@ namespace OHOS
         {
             container_->Add(RespiratoryTrainingScrollView[thisView]);
         }
+        if (TrainingDurationSelectiontitlelabel)
+        {
+            TrainingDurationSelectiontitlelabel->SetText(presenter_->GetRespiratoryTrainingSelectTime().c_str());
+        }
         return true;
     }
 
@@ -60,7 +64,36 @@ namespace OHOS
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new scrollView[%d] fail", thisView);
                 return false;
             }
-            RespiratoryTrainingScrollView[thisView] = p_RespiratoryTrainingCompletedView->RespiratoryTrainingCompletedViewInit();
+            UIScrollView *scrollView = p_RespiratoryTrainingCompletedView->RespiratoryTrainingCompletedViewInit();
+            if (scrollView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingCompletedViewInit fail!!");
+                return false;
+            }
+            RespiratoryTrainingScrollView[thisView] = scrollView;
+            container_->Add(RespiratoryTrainingScrollView[thisView]);
+        }
+        return true;
+    }
+
+    bool RespiratoryTrainingView::ChangeRespiratoryTrainingDurationSelectionView(int16_t thisView)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingView::ChangeRespiratoryTrainingCompletedView");
+        if (RespiratoryTrainingScrollView[thisView] == nullptr)
+        {
+            p_RespiratoryTrainingDurationSelectionView = new RespiratoryTrainingDurationSelectionView();
+            if (p_RespiratoryTrainingDurationSelectionView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new scrollView[%d] fail", thisView);
+                return false;
+            }
+            UIScrollView *scrollView = p_RespiratoryTrainingDurationSelectionView->RespiratoryTrainingDurationSelectionViewInit();
+            if (scrollView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingDurationSelectionViewInit fail!!");
+                return false;
+            }
+            RespiratoryTrainingScrollView[thisView] = scrollView;
             container_->Add(RespiratoryTrainingScrollView[thisView]);
         }
         return true;
@@ -75,6 +108,7 @@ namespace OHOS
     static const RespiratoryTrainingViewMapper ViewMapper[] = {
         {RESPIRATORYTRAINING, &RespiratoryTrainingView::ChangeRespiratoryTrainingView},
         {RESPIRATORYTRAININGCOMPLETED, &RespiratoryTrainingView::ChangeRespiratoryTrainingCompletedView},
+        {RESPIRATORY_TRAINING_DURATION_SELECTION, &RespiratoryTrainingView::ChangeRespiratoryTrainingDurationSelectionView},
     };
 
     bool RespiratoryTrainingView::ClickFunc(int16_t interface)
@@ -128,124 +162,16 @@ namespace OHOS
         RootView::GetInstance()->SetOnKeyActListener(keyactListener);
     }
 
-#if 0
-    void RespiratoryTrainingView::ClearAll(void)
-    {
-        if (container_ != nullptr)
-        {
-            container_->RemoveAll();
-            delete container_;
-            container_ = nullptr;
-        }
-
-        if (RespiratoryTrainingAnimator_ != nullptr)
-        {
-            RespiratoryTrainingAnimator_->Stop();
-            delete RespiratoryTrainingAnimator_;
-            RespiratoryTrainingAnimator_ = nullptr;
-        }
-
-        if (RespiratoryTrainingCallBack_ != nullptr)
-        {
-            delete RespiratoryTrainingCallBack_;
-            RespiratoryTrainingCallBack_ = nullptr;
-        }
-
-        if (RespiratoryTrainingImg_ != nullptr)
-        {
-            ImageCacheManager::GetInstance().UnloadSingleRes(RespiratoryTrainingImagePath);
-            delete RespiratoryTrainingImg_;
-            RespiratoryTrainingImg_ = nullptr;
-        }
-
-        if (RespiratoryTrainingLabel_ != nullptr)
-        {
-            delete RespiratoryTrainingLabel_;
-            RespiratoryTrainingLabel_ = nullptr;
-        }
-    }
-
-    // 初始化呼吸训练动画图片信息
-    void RespiratoryTrainingView::InitializeRespiratoryTrainingImageInfo()
-    {
-        for (uint8_t i = 0; i < RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES; i++)
-        {
-            RespiratoryTrainingImageInfo[i].imagePath = (RespiratoryTrainingArray[i]);
-            RespiratoryTrainingImageInfo[i].imageType = RespiratoryTrainingImg_SRC_FILE_PATH;
-            RespiratoryTrainingImageInfo[i].pos.x = RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_X;
-            RespiratoryTrainingImageInfo[i].pos.y = RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_Y;
-            RespiratoryTrainingImageInfo[i].width = RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_W;
-            RespiratoryTrainingImageInfo[i].height = RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_H;
-        }
-    }
-
-    // 设置动画属性
-    void RespiratoryTrainingView::SetAnimatorViewProperties()
-    {
-        RespiratoryTrainingAnimatorView->SetPosition(RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_X, RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_Y);
-        RespiratoryTrainingAnimatorView->Resize(RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_W, RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_H);
-        RespiratoryTrainingAnimatorView->SetStyle(STYLE_BACKGROUND_COLOR, 0xffffffff);
-        RespiratoryTrainingAnimatorView->SetStyle(STYLE_BACKGROUND_OPA, 0xff);
-        RespiratoryTrainingAnimatorView->SetImageAnimatorSrc(RespiratoryTrainingImageInfo, RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES, RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_TIMEOFUPDATE);
-        RespiratoryTrainingAnimatorView->SetRepeat(true);
-        RespiratoryTrainingAnimatorView->Start();
-    }
-
-    // 创建呼吸训练动画视图
-    void RespiratoryTrainingView::CreateRespiratoryTrainingAnimatorView()
-    {
-        RespiratoryTrainingArray = RespiratoryTrainingView::GetInstance()->CreateImagePathsArray("/user/res/remind/RESPIRATORY_TRAINING_/", "bin", RESPIRATORY_TRAINING_IMAGE_ANIMATOR_VIEW_NUM_FRAMES);
-
-        if (RespiratoryTrainingAnimatorView == nullptr)
-        {
-            RespiratoryTrainingAnimatorView = new UIImageAnimatorView();
-            if (RespiratoryTrainingAnimatorView == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateDeviceRESPIRATORY_TRAINING_ingView]RespiratoryTrainingAnimatorView new fail");
-                return;
-            }
-
-            InitializeRespiratoryTrainingImageInfo();
-            SetAnimatorViewProperties();
-        }
-    }
-
-    // 创建呼吸训练标签视图
-    void RespiratoryTrainingView::CreateRespiratoryTrainingLabelView()
-    {
-        if (RespiratoryTrainingLabelView == nullptr)
-        {
-            RespiratoryTrainingLabelView = new UILabelExt();
-            if (RespiratoryTrainingLabelView == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[CreateDeviceRESPIRATORY_TRAINING_ingView]RespiratoryTrainingLabelView new fail");
-                return;
-            }
-            SetLabelViewProperties();
-        }
-    }
-
-    void RespiratoryTrainingView::SetLabelViewProperties()
-    {
-        RespiratoryTrainingLabelView->SetPosition(83, 320, 360, 70);
-    }
-
-    void RespiratoryTrainingView::RespiratoryTrainingViewInit(void)
-    {
-        CreateRespiratoryTrainingAnimatorView();
-        CreateRespiratoryTrainingLabelView();
-    }
-#endif
-
     const static int16_t BUTTON_WIDTH = 320;
     const static int16_t BUTTON_HEIGHT = 100;
     const static int16_t INTERVAL_STEP = 80;
     const Vector2<float> VIEW_CENTER = {120, 120};
     static constexpr const char *RespiratoryTrainingImagePath = "/user/res/RespiratoryTraining/RespiratoryTraining.bin";
+    static constexpr const char *RespiratoryTrainingImageBGPath = "/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin";
 
     void RespiratoryTrainingCallback::Callback(UIView *view)
     {
-       RespiratoryTrainingModel::GetInstance().calculateHeartrateTotal();
+        RespiratoryTrainingModel::GetInstance().calculateHeartrateTotal();
         // 1.计算当前时间与开始时间的差值,用于控制动画的时间。
         uint32_t currentTime = HALTick::GetInstance().GetTime();
         curTime = currentTime - startTimestamp;
@@ -299,43 +225,42 @@ namespace OHOS
         img_->Invalidate();
     }
 
+    void RespiratoryTrainingView::HandStartRespiratoryTraining()
+    {
+        if (titlelabel && TrainingDurationSelectiontitlelabel && Image && RespiratoryTrainingStartButton && RespiratoryTrainingStartLabel)
+        {
+            titlelabel->SetVisible(false);
+            TrainingDurationSelectiontitlelabel->SetVisible(false);
+            Image->SetVisible(false);
+            RespiratoryTrainingStartButton->SetVisible(false);
+            RespiratoryTrainingStartLabel->SetVisible(false);
+        }
+
+        if (RespiratoryTrainingStartNote_ && RespiratoryTrainingImg_)
+        {
+            RespiratoryTrainingStartNote_->SetVisible(true);
+            RespiratoryTrainingImg_->SetVisible(true);
+        }
+
+        StartRespiratoryTraining();                                                                                                  // 开始呼吸训练
+        HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE);                                         // 开启心率检测
+        RespiratoryTrainingModel::GetInstance().RT_StartTimer(RespiratoryTrainingModel::GetInstance().GetRespiratoryTrainingTime()); // 开启定时器
+        ui_api_vibrate_once_func();                                                                                                  // 震动
+    }
+
     bool RespiratoryTrainingView::OnClick(UIView &view, const ClickEvent &event)
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingView::OnClick");
-        UNUSED(view);
         UNUSED(event);
-#if 0
-        if (!animateStart_)
+
+        if (&view == RespiratoryTrainingStartButton)
         {
-            RespiratoryTrainingAnimator_->Start();
-            animateStart_ = false;
-            if (RespiratoryTrainingStart_ != nullptr)
-            {
-                RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Remove(RespiratoryTrainingStart_);
-                delete RespiratoryTrainingStart_;
-                RespiratoryTrainingStart_ = nullptr;
-            }
-            RespiratoryTrainingLabel_ = new UILabelExt();
-            if (RespiratoryTrainingLabel_ == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingLabel_ new fail");
-                return false;
-            }
-            RespiratoryTrainingLabel_->SetPosition(53, 320, 360, 70); // 180, 380, 100, 50: left, right, width, height
-            // RespiratoryTrainingLabel_->SetText("现在呼气");
-            RespiratoryTrainingLabel_->SetTextId(STR_EXHALE_NOW);
-            RespiratoryTrainingLabel_->SetStyle(STYLE_TEXT_FONT, 30);
-            RespiratoryTrainingLabel_->SetStyle(STYLE_LINE_HEIGHT, 35);
-            RespiratoryTrainingLabel_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
-            RespiratoryTrainingLabel_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-            RespiratoryTrainingLabel_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-            RespiratoryTrainingLabel_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
-            RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingLabel_);
-            RespiratoryTrainingCallBack_->SetTextView(RespiratoryTrainingLabel_);
-            RespiratoryTrainingCallBack_->startTimestamp = HALTick::GetInstance().GetTime();
-            RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Invalidate();
+            HandStartRespiratoryTraining();
+        }
+        else if (&view == TrainingDurationSelectiontitlelabel)
+        {
+            ChangeView(RESPIRATORYTRAINING, RESPIRATORY_TRAINING_DURATION_SELECTION);
         }
-#endif
         return true;
     }
 
@@ -399,23 +324,9 @@ namespace OHOS
         RespiratoryTrainingImg_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
         RespiratoryTrainingImg_->SetAutoEnable(false);
         RespiratoryTrainingImg_->SetResizeMode(UIImageView::ImageResizeMode::CENTER);
+        RespiratoryTrainingImg_->SetVisible(false);
         RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingImg_);
-
-#if 0
-        // 创建并设置呼吸训练开始按钮
-        RespiratoryTrainingStart_ = new UILabelButton();
-        if (RespiratoryTrainingStart_ == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingStart_ new failed!");
-            return false;
-        }
-        RespiratoryTrainingStart_->SetPosition(158, 320, 150, 75);
-        RespiratoryTrainingStart_->SetText("Start");
-        RespiratoryTrainingStart_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
-        RespiratoryTrainingStart_->SetOnClickListener(this);
-        RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStart_);
-#else
-
+        /* -------------------------------------------------------------------------- */
         RespiratoryTrainingStartNote_ = new UILabelExt();
         if (RespiratoryTrainingStartNote_ == nullptr)
         {
@@ -430,9 +341,88 @@ namespace OHOS
         RespiratoryTrainingStartNote_->SetLineBreakMode(UILabel::LINE_BREAK_WRAP);
         RespiratoryTrainingStartNote_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
         RespiratoryTrainingStartNote_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        RespiratoryTrainingStartNote_->SetVisible(false);
         RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStartNote_);
         return true;
-#endif
+    }
+
+    bool RespiratoryTrainingView::InitRespiratoryTrainingElements2()
+    {
+        titlelabel = new UILabelExt();
+        if (titlelabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "titlelabel new failed!");
+            return false;
+        }
+        titlelabel->SetPosition(83, 50, 300, 35);
+        titlelabel->SetStyle(STYLE_TEXT_FONT, 30);
+        titlelabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+        titlelabel->SetTextId(STR_BREATH_TRAINING);
+        titlelabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        titlelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        titlelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(titlelabel);
+        /* -------------------------------------------------------------------------- */
+        TrainingDurationSelectiontitlelabel = new UILabelExt();
+        if (TrainingDurationSelectiontitlelabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TrainingDurationSelectiontitlelabel new failed!");
+            return false;
+        }
+        TrainingDurationSelectiontitlelabel->SetPosition(83, 95, 300, 35);
+        TrainingDurationSelectiontitlelabel->SetStyle(STYLE_TEXT_FONT, 30);
+        TrainingDurationSelectiontitlelabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+        TrainingDurationSelectiontitlelabel->SetText(presenter_->GetRespiratoryTrainingSelectTime().c_str());
+        TrainingDurationSelectiontitlelabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        TrainingDurationSelectiontitlelabel->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff));
+        TrainingDurationSelectiontitlelabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        TrainingDurationSelectiontitlelabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        TrainingDurationSelectiontitlelabel->SetTouchable(true);
+        TrainingDurationSelectiontitlelabel->SetOnClickListener(this);
+        RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(TrainingDurationSelectiontitlelabel);
+        /* -------------------------------------------------------------------------- */
+        Image = new UIImageView();
+        if (Image == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Image new failed!");
+            return false;
+        }
+        Image->SetSrc(RespiratoryTrainingImageBGPath);
+        Image->SetPosition(133, 133, 200, 200);
+        Image->SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);
+        Image->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+        Image->SetAutoEnable(false);
+        Image->SetResizeMode(UIImageView::CENTER);
+        RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(Image);
+        /* -------------------------------------------------------------------------- */
+        RespiratoryTrainingStartButton = new UILabelButtonExt();
+        if (RespiratoryTrainingStartButton == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Image new failed!");
+            return false;
+        }
+        RespiratoryTrainingStartButton->SetPosition(93, 330, 280, 90);
+        RespiratoryTrainingStartButton->SetOnClickListener(this);
+        RespiratoryTrainingStartButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff4fc34c);
+        RespiratoryTrainingStartButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        RespiratoryTrainingStartButton->SetStyleForState(STYLE_BACKGROUND_OPA, 0x00, UIButton::PRESSED);
+        RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStartButton);
+        /* -------------------------------------------------------------------------- */
+        RespiratoryTrainingStartLabel = new UILabelExt();
+        if (RespiratoryTrainingStartLabel == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingStartLabel new failed!");
+            return false;
+        }
+        RespiratoryTrainingStartLabel->SetPosition(143, 358, 180, 35);
+        RespiratoryTrainingStartLabel->SetStyle(STYLE_TEXT_FONT, 30);
+        RespiratoryTrainingStartLabel->SetStyle(STYLE_LINE_HEIGHT, 35);
+        RespiratoryTrainingStartLabel->SetTextId(STR_START); // 开始
+        RespiratoryTrainingStartLabel->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        RespiratoryTrainingStartLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        RespiratoryTrainingStartLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->Add(RespiratoryTrainingStartLabel);
+        return true;
     }
 
     bool RespiratoryTrainingView::InitRespiratoryTrainingCallBackAndAnimator()
@@ -469,8 +459,8 @@ namespace OHOS
             return false;
         }
         RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-        RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetScrollBlankSize(50);
-        RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetReboundSize(35);
+        // RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetScrollBlankSize(50);
+        // RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetReboundSize(35);
         RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetHorizontalScrollState(false);
         RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetTouchable(true);
         RespiratoryTrainingScrollView[RESPIRATORYTRAINING]->SetDraggable(true);
@@ -483,15 +473,17 @@ namespace OHOS
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RespiratoryTrainingView::RespiratoryTrainingViewInit");
         if (!InitRespiratoryTrainingScrollView() || !InitRespiratoryTrainingElements() ||
-            !InitRespiratoryTrainingCallBackAndAnimator())
+            !InitRespiratoryTrainingElements2() || !InitRespiratoryTrainingCallBackAndAnimator())
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RecordListViewInit fail!!");
             return;
         }
+#if 0
         StartRespiratoryTraining();                                                          // 开始呼吸训练
         HeartModel::GetInstance()->Heart_Control(HeartState::Start, HeartCheck::INITIATIVE); // 开启心率检测
         RespiratoryTrainingModel::GetInstance().RT_StartTimer(ONE_MIN);                      // 开启一个一分钟的定时器
         ui_api_vibrate_once_func();                                                          // 震动提醒
+#endif
     }
 
     void RespiratoryTrainingView::ClearAll(void)
@@ -536,15 +528,51 @@ namespace OHOS
             delete RespiratoryTrainingLabel_;
             RespiratoryTrainingLabel_ = nullptr;
         }
+        if (RespiratoryTrainingStartNote_ != nullptr)
+        {
+            delete RespiratoryTrainingStartNote_;
+            RespiratoryTrainingStartNote_ = nullptr;
+        }
+        if (titlelabel != nullptr)
+        {
+            delete titlelabel;
+            titlelabel = nullptr;
+        }
+        if (TrainingDurationSelectiontitlelabel != nullptr)
+        {
+            delete TrainingDurationSelectiontitlelabel;
+            TrainingDurationSelectiontitlelabel = nullptr;
+        }
+        if (Image != nullptr)
+        {
+            delete Image;
+            Image = nullptr;
+        }
+        if (RespiratoryTrainingStartButton != nullptr)
+        {
+            delete RespiratoryTrainingStartButton;
+            RespiratoryTrainingStartButton = nullptr;
+        }
+        if (RespiratoryTrainingStartLabel != nullptr)
+        {
+            delete RespiratoryTrainingStartLabel;
+            RespiratoryTrainingStartLabel = nullptr;
+        }
 
         if (p_RespiratoryTrainingCompletedView != nullptr)
         {
             delete p_RespiratoryTrainingCompletedView;
             p_RespiratoryTrainingCompletedView = nullptr;
-
             RespiratoryTrainingScrollView[RESPIRATORYTRAININGCOMPLETED] = nullptr;
         }
 
+        if (p_RespiratoryTrainingDurationSelectionView != nullptr)
+        {
+            delete p_RespiratoryTrainingDurationSelectionView;
+            p_RespiratoryTrainingDurationSelectionView = nullptr;
+            RespiratoryTrainingScrollView[RESPIRATORY_TRAINING_DURATION_SELECTION] = nullptr;
+        }
+
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[RespiratoryTrainingView]ClearAll end!!");
     }
 
index b50a695..de9b712 100644 (file)
@@ -66,6 +66,7 @@
 #include "ConfigModelC.h"
 #include "heart_blood/health_service/health_service.h"
 #include "vibrator_service.h"
+#include "respiratorytraining/include/RespiratoryTrainingModel.h"
 
 #define DIALDATASET 1
 //#include "Systemupgrade.h"
@@ -637,6 +638,7 @@ void MsgCenterNotifyNextDayProc(const Topic topic, Request *req)
     /* ---------------------------------- 健康数据相关 ---------------------------------- */
     // 清空当日的心率血氧数据
     HealthService::GetInstance()->CleanHealthData();
+    RespiratoryTrainingModel::GetInstance().ClearTotalRespiratoryTrainingTime();
     // 通知UI更新
     GraphicService::GetInstance()->PostGraphicEvent(
         std::bind(&OHOS::HeartModel::CleanAllData, OHOS::HeartModel::GetInstance()));
@@ -1262,7 +1264,11 @@ void MsgCenterNotifyDebugOutProc(const Topic topic, Request *req)
 {
     unused(req);
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "MsgCenterNotifyDebugOutProc !");
-    NotificationManager::GetInstance()->ShowNotify(showDebugOutputNotify, (uint16_t)topic, true);
+    if (CheckPriority(topic))
+    {
+        NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_ONE);
+        NotificationManager::GetInstance()->ShowNotify(showDebugOutputNotify, (uint16_t)topic, true);
+    }
 }
 //每日训练数据刷新
 void MsgCenterNotifyActivityProc(const Topic topic, Request* req)
diff --git a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/RespiratoryTraining/RespiratoryTraining_BG.bin
new file mode 100644 (file)
index 0000000..bdcb5a3
--- /dev/null
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b510277397ae32dea9d06e919cd012b66e3054a5f567e328d14a72e7e3c4054b
+size 38424
index 9cd1bdf..360de80 100644 (file)
@@ -141,6 +141,7 @@ namespace OHOS
             CONFIGMODEL_ITEM_FLASHLIGHT_COLOR_VALUE, // color value
             CONFIGMODEL_ITEM_FLASHLIGHT_FLASHING_LEVEL, // flashing level
 
+            CONFIGMODEL_ITEM_RESPIRATORY_TRAINING_DURATION_SELECTION, // 呼吸训练时长选择
             CONFIGMODEL_ITEM_MAX,
 
            
@@ -397,6 +398,7 @@ namespace OHOS
             {ConfigDataType::DATATYPE_INT,     "color_index",             "0" }, // CONFIGMODEL_ITEM_FLASHLIGHT_COLOR_INDEX, // color index
             {ConfigDataType::DATATYPE_INT,     "color_value",             "0" }, // CONFIGMODEL_ITEM_FLASHLIGHT_COLOR_VALUE, // color value
             {ConfigDataType::DATATYPE_INT,     "flashing_level",             "0" }, // CONFIGMODEL_ITEM_FLASHLIGHT_FLASHING_LEVEL, // flashing level
+            {ConfigDataType::DATATYPE_INT,     "rt_select_time",             "1" }, // CONFIGMODEL_ITEM_RESPIRATORY_TRAINING_DURATION_SELECTION,呼吸训练选择的时长
 
         };
         ConfigModel();                                        // 私有构造函数,确保无法在外部实例化