【消息通知】UI 1721/1 1721/head 1723/target/1
authorCaisking <Casiking@zhihuishixun.com>
Tue, 15 Apr 2025 09:37:51 +0000 (17:37 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Tue, 15 Apr 2025 09:37:51 +0000 (17:37 +0800)
25 files changed:
code/sdk/application/wearable/fd230/nativeapp/nativeui/clock/src/MainClockView.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/main/include/MainViewSample.h
code/sdk/application/wearable/fd230/nativeapp/nativeui/main/src/MainViewSample.cpp
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageAdapter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageCardView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageItemView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageLackView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessagePresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowPresenter.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageView.h [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageAdapter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageCardView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageItemView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageLackView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessagePresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowPresenter.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowView.cpp [new file with mode: 0644]
code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageView.cpp [new file with mode: 0644]

index 380016e..4fc4685 100644 (file)
  
      void MainClockView::UpdateStateShow()
      {
-        //  if (messageicon_ == nullptr || dialstateicon_ == nullptr)
-        //      return;
+         if (messageicon_ == nullptr || dialstateicon_ == nullptr)
+             return;
  
-        //  /*配置未读状态*/
-        //  messageicon_->SetVisible(MainModel::GetInstance().getMessageActiveState());
-        //  /*配置表盘状态*/
-        //  dialstateicon_->SetVisible(true);
-        //  switch (MainModel::GetInstance().getHighestPriorityActiveState())
-        //  {
-        //  case DialState::DO_NOT_DISTURB:
-        //      dialstateicon_->SetSrc(DISTURBICON);
-        //      break;
-        //  case DialState::SLEEP:
-        //      dialstateicon_->SetSrc(SLEEPICON);
-        //      break;
-        //  case DialState::LOCK:
-        //      dialstateicon_->SetSrc(LOCKICON);
-        //      break;
-        //  default:
-        //      dialstateicon_->SetVisible(false);
-        //      break;
-        //  }
+         /*配置未读状态*/
+         messageicon_->SetVisible(MainModel::GetInstance().getMessageActiveState());
+         /*配置表盘状态*/
+         dialstateicon_->SetVisible(true);
+         switch (MainModel::GetInstance().getHighestPriorityActiveState())
+         {
+         case DialState::DO_NOT_DISTURB:
+             dialstateicon_->SetSrc(DISTURBICON);
+             break;
+         case DialState::SLEEP:
+             dialstateicon_->SetSrc(SLEEPICON);
+             break;
+         case DialState::LOCK:
+             dialstateicon_->SetSrc(LOCKICON);
+             break;
+         default:
+             dialstateicon_->SetVisible(false);
+             break;
+         }
      }
  
      void MainClockView::PreLoad(void)
            
              /*增加手表状态图标*/
              InitImageView(dialstateicon_, 213, 2, 40, 40, "disturbicon", DISTURBICON);
-             // dialstateicon_->SetVisible(false);
+             dialstateicon_->SetVisible(false);
  
              /*增加未读图标*/
              InitImageView(messageicon_, 223, 444, 20, 20, "messageicon_", MESSAGEICON);
index 1d9741a..e2af5d7 100644 (file)
@@ -37,7 +37,7 @@
 #include "weather/include/WeatherControlView.h"
 #include "goal/include/goalControlView.h"
 
-// #include "message/include/MessageControlView.h"
+#include "message/include/MessageControlView.h"
 // #include "sleep/include/SleepCardView.h"
 #include "set_card/include/SetMainView.h"
 // #include "heartrate/include/HeartRateCardView.h"
@@ -111,7 +111,7 @@ namespace OHOS
         // BloodCardView *bloodView{nullptr};
         // SleepCardView *sleepView{nullptr};
         // Training_CardView *traingView{nullptr};
-        // MessageControlView *messageView{nullptr};
+        MessageControlView *messageView{nullptr};
         SetMainView *setmainView{nullptr};
 
         WeatherControlView *weatherControlView{nullptr};
@@ -119,8 +119,8 @@ namespace OHOS
         // ApplistCardView *applistCardView{nullptr};
         UIButton *changebut{nullptr};
 
-        // UIImageView *dialstateicon_{nullptr}; 
-        // UIImageView *messageicon_{nullptr};    
+        UIImageView *dialstateicon_{nullptr}; 
+        UIImageView *messageicon_{nullptr};    
         /* -------------------------------------------------------------------------- */
         UICardPage *recordCard[MAX_CARD]{nullptr};
         bool pageStatus[MAX_CARD]{false};
index ffdfe04..dc9e257 100644 (file)
@@ -98,30 +98,14 @@ namespace OHOS
             delete activityWeekView;
             activityWeekView = nullptr;
         }
-        // if (messageView != nullptr)
-        // {
-        //     messageView->ClearBackgroundBlur();
-        //     messageView->RemoveAll();
-        //     delete messageView;
-        //     messageView = nullptr;
-        // }
-        // if (MessageLable != nullptr)
-        // {
-        //     delete MessageLable;
-        //     MessageLable = nullptr;
-        // }
-        // if (dialstateicon != nullptr)
-        // {
-        //     mainClockView->Remove(dialstateicon);
-        //     delete dialstateicon;
-        //     dialstateicon = nullptr;
-        // }
-        // if (messageicon != nullptr)
-        // {
-        //     mainClockView->Remove(messageicon);
-        //     delete messageicon;
-        //     messageicon = nullptr;
-        // }
+        if (messageView != nullptr)
+        {
+            messageView->ClearBackgroundBlur();
+            messageView->RemoveAll();
+            delete messageView;
+            messageView = nullptr;
+        }
+
         if (compassControlView != nullptr)
         {
             compassControlView->RemoveAll();
@@ -351,21 +335,21 @@ namespace OHOS
         dropDownView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
         dropDownView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
         /* -------------------------------------------------------------------------- */
-        // if (messageView == nullptr) {
-        //     messageView = new MessageControlView();
-        //     if (messageView == nullptr)
-        //     {
-        //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail");
-        //         return;
-        //     }
-        // }
+        if (messageView == nullptr) {
+            messageView = new MessageControlView();
+            if (messageView == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageView new fail");
+                return;
+            }
+        }
 
-        // messageView->SetViewId("messageView");
-        // messageView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
-        // messageView->PreLoad();
-        // messageView->SetDraggable(false);
-        // // messageView->SetIntercept(true);
-        // messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+        messageView->SetViewId("messageView");
+        messageView->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+        messageView->PreLoad();
+        messageView->SetDraggable(false);
+        // messageView->SetIntercept(true);
+        messageView->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
 #endif
     }
 
@@ -379,7 +363,7 @@ namespace OHOS
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::VertViewLoad");
         mainSwipeGroup->VerAdd(dropDownView, UICrossView::VPage::UP_PAGE);
-        // mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE);
+        mainSwipeGroup->VerAdd(messageView, UICrossView::VPage::DOWN_PAGE);
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MainViewSample::PullViewLoad::Pull View Load complete");
     }
     
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageAdapter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageAdapter.h
new file mode 100644 (file)
index 0000000..daef831
--- /dev/null
@@ -0,0 +1,57 @@
+/*** 
+ * @Date: 2024-08-12 15:34:39
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-09-10 10:54:51
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageAdapter.h
+ */
+
+#ifndef Message_ADAPTER_H
+#define Message_ADAPTER_H
+#include <list>
+#include <string>
+#include "components/ui_list.h"
+#include "components/abstract_adapter.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_checkbox.h"
+#include "components/ui_label_button_ext.h"
+
+namespace OHOS
+{
+
+    typedef struct
+    {
+        int index;
+        bool read;                // 是否未读
+        std::string labeltitle;   // 来信人
+        std::string labeldetails; // 信息内容
+        std::string labeltime;    // 来信时间
+    } MessageListItem;
+
+    class MessageListAdapter : public AbstractAdapter
+    {
+    public:
+        explicit MessageListAdapter();
+        virtual ~MessageListAdapter();
+
+        void SetData(std::list<MessageListItem> &data);
+
+        virtual uint16_t GetCount(void) override;
+
+        virtual UIView *GetView(UIView *inView, int16_t index) override;
+
+        virtual void AddListItem(const MessageListItem &item);
+
+        void SetItemClickListener(UIView::OnClickListener *itemclicklistener)
+        {
+            itemClickListener = itemclicklistener;
+        }
+
+    private:
+        std::list<MessageListItem> listData;
+        UIView::OnClickListener *itemClickListener{nullptr};
+        UILabelButtonExt *DeleteButton{nullptr};
+    };
+}
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageCardView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageCardView.h
new file mode 100644 (file)
index 0000000..526eca9
--- /dev/null
@@ -0,0 +1,45 @@
+
+
+#ifndef MESSAGE_CARD_VIEW_H
+#define MESSAGE_CARD_VIEW_H
+
+#include "View.h"
+#include "components/root_view.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_image_view.h"
+#include "ChangeSliceListener.h"
+#include "UiConfig.h"
+#include "AppGroupView.h"
+#include "components/ui_label_button_ext.h"
+#include "message/include/MessageCardView.h"
+#include "components/ui_label_button_ext.h"
+#include "message/include/MessageAdapter.h"
+#include "message/include/MessageItemView.h"
+#include "message/include/MessageModel.h"
+namespace OHOS
+{
+#define MAINMESSAGEVIEW "messagecard"
+    class MessageCardView : public AppGroupView
+    {
+    public:
+        MessageCardView();
+        ~MessageCardView() override;
+        static MessageCardView *GetInstance(void);
+
+        void AddMessageToList(const MessageListItem &item);
+        bool InitPage(void);
+        bool InitView(void *caller) override;
+        bool GetInitViewState(void);
+        void SetUpView(MessageCardView *messageCardView);
+        void UpdateMessageCard(void);
+        UIList *GetList(void);
+
+    private:
+        void ClearAll(void);
+        MessageListAdapter *p_MessageListAdapter{nullptr};
+        UIList *MessageList = nullptr;
+        UIImageView *imageline{nullptr};
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlPresenter.h
new file mode 100644 (file)
index 0000000..e3abc0b
--- /dev/null
@@ -0,0 +1,47 @@
+/***
+ * @Date: 2024-06-22 11:36:07
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-22 14:57:34
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageControlPresenter.h
+ */
+/***
+ * @Date: 2024-06-22 11:36:16
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-22 11:39:50
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp
+ */
+
+#ifndef MESSAGE_CONTROL_PRESENTER_H
+#define MESSAGE_CONTROL_PRESENTER_H
+
+#include "Presenter.h"
+#include "components/ui_view.h"
+#include "components/ui_image_view.h"
+#include "ohos_types.h"
+#include "UiConfig.h"
+#include "AppViewIDs.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+#include "message/include/MessageControlView.h"
+
+namespace OHOS
+{
+    class MessageControlView;
+    class MessageControlPresenter : public UIView::OnClickListener
+    {
+    public:
+        MessageControlPresenter(){};
+        virtual ~MessageControlPresenter(){};
+        static MessageControlPresenter *GetInstance()
+        {
+            static MessageControlPresenter instance;
+            return &instance;
+        }
+
+        bool OnClick(UIView &view, const ClickEvent &event) override;
+
+    private:
+        UIView *view_{nullptr};
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageControlView.h
new file mode 100644 (file)
index 0000000..16b411a
--- /dev/null
@@ -0,0 +1,47 @@
+/***
+ * @Date: 2024-06-19 16:39:31
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-19 17:30:37
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlView.cpp
+ */
+/*
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.
+ * Description: MessageControlView.h
+ * Author:
+ * Create: 2022-04-02
+ */
+
+#ifndef MESSAGE_CONTROL_VIEW_H
+#define MESSAGE_CONTROL_VIEW_H
+
+#include "components/root_view.h"
+#include "UiConfig.h"
+#include "components/ui_card_page.h"
+#include "message/include/MessageLackView.h"
+#include "message/include/MessageCardView.h"
+
+namespace OHOS
+{
+
+    class MessageControlView : public UICardPage
+    {
+    public:
+        MessageControlView();
+        ~MessageControlView() override;
+        static MessageControlView *GetInstance();
+        bool InitView(void);
+        void PreLoad(void) override;
+        void UnLoad(void) override;
+        void SetLackView(bool flag);
+   
+
+    private:
+        MessageLackView *messageLackView{nullptr};
+        MessageCardView *messageCardView{nullptr};
+        bool viewiInitStatus{false};
+        bool isLack{true};
+
+        void ClearAll(void);
+    };
+}
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageItemView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageItemView.h
new file mode 100644 (file)
index 0000000..7e17347
--- /dev/null
@@ -0,0 +1,49 @@
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-09 11:55:24
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageItemView.h
+ */
+/***
+ * @Date: 2024-04-15 10:55:58
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-13 16:51:22
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageItemView.h
+ */
+
+#ifndef Message_ITEM_VIEW_H
+#define Message_ITEM_VIEW_H
+
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_view_group.h"
+#include "components/ui_checkbox.h"
+#include "components/ui_image_view.h"
+#include "message/include/MessageAdapter.h"
+#include "components/ui_label_button.h"
+
+namespace OHOS
+{
+    class MessageItemView : public UIViewGroup
+    {
+    public:
+        explicit MessageItemView();
+        virtual ~MessageItemView();
+        virtual void SetItemInfo(const MessageListItem itemInfo);
+        virtual void SetUpChild();
+        void TearDownChild();
+        int GetMessageListIndex();
+
+    private:
+        MessageItemView(const MessageItemView &);
+        UIImageView sIcon;          // 未读图标
+        UILabel stitle;             // 消息来源
+        UILabel smessgae;           // 消息
+        UILabel stime;              // 时间
+        UILabelButton sLabelButton; // 按键
+        MessageListItem sItemInfo = {0, false, nullptr, nullptr, nullptr};
+        bool isSetupChild{false};
+        bool unread_state = false;
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageLackView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageLackView.h
new file mode 100644 (file)
index 0000000..53adf1f
--- /dev/null
@@ -0,0 +1,50 @@
+/*** 
+ * @Date: 2024-06-19 17:04:12
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-10 16:50:28
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageLackView.h
+ */
+/***
+ * @Date: 2024-06-19 17:04:12
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-19 17:12:03
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageLackViewView.h
+ */
+/*
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.
+ * Description: MessageLackView.h
+ * Author:
+ * Create: 2022-04-02
+ */
+
+#ifndef MESSAGE_LACK_VIEW_H
+#define MESSAGE_LACK_VIEW_H
+
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "View.h"
+#include "ohos_types.h"
+#include "AppGroupView.h"
+#include "components/ui_image_view.h"
+
+namespace OHOS
+{
+    class MessageLackView : public AppGroupView
+    {
+    public:
+        MessageLackView();
+        ~MessageLackView() override;
+
+        bool CreateUIViewGroup(void);
+        static MessageLackView *GetInstance(void);
+        bool InitView(void *caller) override;
+
+    private:
+        UIImageView *imageline{nullptr};
+        UIImageView *imagemeage{nullptr};
+        UILabelExt *labelmeage{nullptr};
+
+        void ClearAll(void);
+    };
+}
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageModel.h
new file mode 100644 (file)
index 0000000..7f736a8
--- /dev/null
@@ -0,0 +1,85 @@
+
+#ifndef MESSAGE_MODEL_H
+#define MESSAGE_MODEL_H
+
+
+// #include "bletest.h"
+
+#include "message/include/MessagePresenter.h"
+#include <cstdint>
+#include <map>
+#include <vector>
+
+namespace OHOS {
+// 消息数据结构体
+struct MessageData {
+  bool isRead;              // 消息是否已读
+  std::string labelTitle;   // 消息标题
+  std::string labelDetails; // 消息详情
+  std::string labelTime;    // 消息时间
+  uint32_t timestamp;       // 消息时间戳
+};
+
+// 消息模型类
+class MessageModel {
+public:
+  MessageModel();
+  ~MessageModel();
+  void Init();
+
+  static MessageModel &GetInstance();
+  void InitMessageListItems(); // 初始化消息列表项
+  const MessageListItem *GetMessageListItems() const; // 获取消息列表项
+  uint8_t GetMessageCount() const;                    // 获取消息数量
+  // void AddMessageData(ancs_data_info_t *messageInfo); // 增加消息项
+  bool LoadMessagesFromStorage(); // 初始化信息数组 {开机调用一次}
+  bool SaveMessagesToStorage();   // 保存信息数组   {关机时候调用}
+  bool SetMessageAsRead();        // 设置当前项已读
+  void SetCurrentIndex(uint8_t index);  // 设置当前下标
+  uint8_t GetCurrentIndex();            // 获取当前下标
+  MessageData *GetCurrentMessageData(); // 获取当前项
+  bool DeleteCurrentMessage();          // 删除当前项
+  bool ClearAllMessages();              // 删除所有数据
+  MessageData *GetNewMessage();         // 获取最新信息
+  void SetPopupViewState(bool state);   // 设置弹出视图状态
+  bool GetPopupViewState();             // 获取弹出视图状态
+  bool HasDataVector();                 // 判断数组是否存在数据
+  void UpdateMessageView();
+
+  void at_message_test();
+
+private:
+  MessageModel &operator=(const MessageModel &);
+
+  uint16_t numberOfItems;                         // 项数
+  static const uint16_t MaxMessageListCount = 10; // 消息列表最大数量
+  MessageListItem Messages[MaxMessageListCount] = {0, false, nullptr, nullptr,
+                                                   nullptr}; // 消息列表
+  uint8_t currentIndex_;                                     // 选择的项
+  std::vector<MessageData> MessageVector;
+
+  bool popupViewState_{false}; // 弹出视图状态
+};
+} // namespace OHOS
+
+#endif
+
+#if 0
+    bool HasDataJson();                                            // 判断是否存在数据Json
+    bool GetJsonLoadStatus();                                      // 获取Json加载状态
+    std::vector<MessageData> LoadMessageData();                    // 加载消息数据
+    uint8_t GetMessageCount() const;                               // 获取消息数量
+    void SetPopupViewState(bool state);                            // 设置弹出视图状态
+    bool GetPopupViewState();                                      // 获取弹出视图状态
+    void PrintData(const MessageData messageData);                 // 打印数据
+    MessageData *GetCurrentMessageData();                          // 获取当前消息数据
+    void SetCurrentMessageData(MessageData *data);                 // 设置当前消息数据
+    bool ClearAllData();                                           // 清除所有数据
+    bool DeleteSingleItem(int currentIndex);                       // 删除单个项
+    MessageData *GetNewestData(int index);                         // 获取最新信息项
+    void SetCurrentIndex(uint8_t index);                           // 设置当前项
+    uint8_t GetCurrentIndex();                                     // 获取当前项
+    bool SetMessageIsread();                                       // 设置当前项已读
+    void DeleteExcessFiles(std::vector<std::string> &filenames);   // 删除文件
+    void SaveMessageData(const MessageData data, const int index); // 保存json数据
+#endif
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessagePresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessagePresenter.h
new file mode 100644 (file)
index 0000000..187229a
--- /dev/null
@@ -0,0 +1,44 @@
+
+
+#ifndef Message_PRESENTER_H
+#define Message_PRESENTER_H
+
+#include "Presenter.h"
+#include "MessageView.h"
+#include "message/include/MessageModel.h"
+// #include "components/ui_list.h"
+// #include "KeyInputListener.h"
+#include "common/key_code.h"
+
+namespace OHOS
+{
+    class MessageView;
+    class MessageModel;
+    class MessagePresenter : public Presenter<MessageView>,
+                             public UIView::OnClickListener,
+                             public UIView::OnDragListener,
+                             public ListScrollListener,
+                             public RootView::OnKeyActListener,
+                             public UIList
+    {
+    public:
+        MessagePresenter();
+        virtual ~MessagePresenter();
+
+        void OnStart() override;
+        void OnPause() override;
+        void OnResume() override;
+        void OnStop() override;
+
+        static MessagePresenter *GetInstance();
+
+    private:
+        // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;
+        bool OnClick(UIView &view, const ClickEvent &event) override;
+        bool OnDrag(UIView &view, const DragEvent &event) override;
+        bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+        MessageModel *model{nullptr};
+    };
+} // namespace OHOS
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowPresenter.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowPresenter.h
new file mode 100644 (file)
index 0000000..2025cb0
--- /dev/null
@@ -0,0 +1,46 @@
+/***
+ * @Date: 2024-06-17 19:39:27
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-03 14:18:46
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageShowPresenter.h
+ */
+
+#ifndef MessageShow_PRESENTER_H
+#define MessageShow_PRESENTER_H
+
+#include "Presenter.h"
+#include "MessageShowView.h"
+#include "message/include/MessageModel.h"
+#include "components/ui_list.h"
+#include "common/key_code.h"
+namespace OHOS
+{
+    class MessageShowView;
+    class MessageShowModel;
+    class MessageShowPresenter : public Presenter<MessageShowView>,
+                                 public UIView::OnClickListener,
+                                 public UIView::OnDragListener,
+                                 public RootView::OnKeyActListener,
+                                 public UIList
+    {
+    public:
+        MessageShowPresenter();
+        virtual ~MessageShowPresenter();
+
+        void OnStart() override;
+        void OnPause() override;
+        void OnResume() override;
+        void OnStop() override;
+
+        static MessageShowPresenter *GetInstance();
+
+    private:
+        // 因为继承了OnClickListener,所以有OnClick属性,至于参数,原函数也这样直接继承;
+        bool OnClick(UIView &view, const ClickEvent &event) override;
+        bool OnDrag(UIView &view, const DragEvent &event) override;
+        bool OnKeyAct(UIView &view, const KeyEvent &event) override; // 增加按键事件
+        MessageShowModel *p_MessageShowModel{nullptr};
+    };
+} // namespace OHOS
+
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageShowView.h
new file mode 100644 (file)
index 0000000..f94e746
--- /dev/null
@@ -0,0 +1,62 @@
+
+
+#ifndef MessageShow_VIEW_H
+#define MessageShow_VIEW_H
+
+// #include "BaseView.h"
+#include "View.h"
+#include "components/ui_view_group.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_list.h"
+#include "message/include/MessageModel.h"
+#include "message/include/MessageShowPresenter.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_label_button_ext.h"
+
+namespace OHOS
+{
+#define DELETEBUTTON "deletebutton"
+
+    class MessageModel;
+    class MessageShowPresenter;
+    class MessageShowView : public View<MessageShowPresenter>
+    {
+
+    public:
+        MessageShowView();
+        virtual ~MessageShowView();
+        static MessageShowView *GetInstance(void);
+
+        void OnStart() override;
+      
+
+        void InitializeLabel(UILabel *label, int posX, int posY, int width, int height, const char *viewId, int fontSize);
+        void InitializeButton(UILabelButton *&button, int left, int top, int width, int height, const char *viewId);
+
+        void UpdateMessage();
+        void InitView();
+        void DeInitView(void);
+        void PreLoad(void);
+        void UpdateShowConfig();
+
+    private:
+        UIScrollView *scrollView_ = nullptr;
+
+        UILabel *title{nullptr};
+        UILabel *time{nullptr};
+
+        UILabelButton *messageButton{nullptr};   // 消息
+        UILabelButtonExt *deleteButton{nullptr}; // 清除按键
+
+        UIImageView *background{nullptr};
+        UIImageView *backgroundtop{nullptr};
+
+        bool viewInitStatus{false};
+        std::string titleStr;
+        std::string timeStr;
+        std::string messageStr;
+    };
+} // namespace OHOS
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageView.h b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/include/MessageView.h
new file mode 100644 (file)
index 0000000..9c03f05
--- /dev/null
@@ -0,0 +1,72 @@
+
+
+#ifndef Message_VIEW_H
+#define Message_VIEW_H
+
+
+#include "View.h"
+#include "components/ui_view_group.h"
+#include "components/ui_scroll_view.h"
+#include "components/ui_list.h"
+#include "message/include/MessageAdapter.h"
+#include "message/include/MessageModel.h"
+#include "components/ui_image_view.h"
+#include "components/ui_label.h"
+#include "components/ui_label_ext.h"
+#include "components/ui_label_button_ext.h"
+#include "components/ui_list_ext.h"
+
+namespace OHOS
+{
+#define DELETEALLDATA "deletealldata"
+    enum class PopupMessage
+    {
+        LackPopup,
+        MessagePopup
+    };
+    class MessagePresenter;
+    class MessageModel;
+    class MessageView : public View<MessagePresenter>, public ListScrollListener
+    {
+
+    public:
+        MessageView();
+        virtual ~MessageView();
+        static MessageView *GetInstance(void);
+
+        void OnStart() override;
+      
+        void AddMessageToList(const MessageListItem &item);
+        UIList *GetList();
+
+        void ShowLackView();
+        void ShowMessageView();
+        void SetPopupViewStatus(PopupMessage view, bool status);
+
+        void InitView(void);
+        void DeInitView(void);
+        void PreLoad(void);
+
+        bool InitPage();
+        bool SetupViewPage(MessageView *messageView);
+        void UpdataButton(int num);
+
+    private:
+        /*无消息界面*/
+        UIScrollView *lackView{nullptr};
+        UIImageView *imageline{nullptr};
+        UIImageView *imagemeage{nullptr};
+        UILabelExt *labeltitle{nullptr};
+        UILabelExt *labelmeage{nullptr};
+
+        /*消息列表界面*/
+        UIScrollView *messageView{nullptr};
+        UIImageView *imageline2{nullptr};
+        MessageListAdapter *p_MessageListAdapter{nullptr};
+        UIList *MessageList = nullptr;
+
+        bool viewInitStatus{false};
+
+    };
+} // namespace OHOS
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageAdapter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageAdapter.cpp
new file mode 100644 (file)
index 0000000..20d0116
--- /dev/null
@@ -0,0 +1,105 @@
+/***
+ * @Author: Caisking 3449750381@qq.com
+ * @Date: 2024-01-29 19:58:37
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-21 10:35:36
+ * @FilePath:
+ * /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageAdapter.cpp
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置
+ * 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+#include "message/include/MessageAdapter.h"
+#include "message/include/MessageItemView.h"
+#include "message/include/MessageModel.h"
+#include "message/include/MessagePresenter.h"
+#include "wearable_log.h"
+
+#include "uicomponents/UIComponents.h"
+namespace OHOS {
+MessageListAdapter::MessageListAdapter() {}
+
+MessageListAdapter::~MessageListAdapter() {
+  if (DeleteButton) {
+    delete DeleteButton;
+    DeleteButton = nullptr;
+  }
+  listData.clear();
+}
+
+uint16_t MessageListAdapter::GetCount(void) { return listData.size() + 1; }
+
+void MessageListAdapter::SetData(std::list<MessageListItem> &data) {
+  if (!listData.empty()) {
+    listData.clear();
+  }
+  std::list<MessageListItem>::iterator it;
+  for (it = data.begin(); it != data.end(); it++) {
+    listData.push_back(*it);
+  }
+}
+
+/// @brief
+/// @param inView 一个指向已存在的视图对象的指
+/// @param index 要创建的视图在列表中的索引l。
+/// @return 返回该视图对象
+UIView *MessageListAdapter::GetView(UIView *inView, int16_t index) {
+  // 1.先检查列表数据是否为空,若为空则返回空指针
+  if (listData.empty()) {
+    return nullptr;
+  }
+  // 2.接着检查索引是否小于0,若小于0则返回空指针
+  if (index < 0) {
+    return nullptr;
+  }
+  // printf("GetView : index %d\r\n", index);
+  // 3.检查是否超出列表数据大小,若超出则返回空指针
+  size_t uindex = index;
+  if (uindex > listData.size())
+    return nullptr;
+
+  MessageItemView *item = nullptr;
+  if (uindex == listData.size()) {
+    if (inView == nullptr) {
+      item = new MessageItemView();
+    } else {
+      item = static_cast<MessageItemView *>(inView);
+      // item->TearDownChild();
+      item->RemoveAll();
+    }
+    InitButtonExt(DeleteButton, 0, 0, 380, 100, DELETEALLDATA, STR_CLEANALL,
+                  30);
+    DeleteButton->SetOnClickListener(itemClickListener);
+    item->Add(DeleteButton);
+    item->SetViewIndex(index);
+    item->SetOnClickListener(nullptr);
+    item->SetHeight(300);
+    // printf("GetView : item GetHeight %d  GetWidth %d\r\n", item->GetHeight(),
+    //        item->GetWidth());
+    return item;
+  }
+  // 4.通过迭代器访问列表中指定索引位置的元素,将其赋值给itemData变量
+  std::list<MessageListItem>::iterator it = listData.begin();
+  for (int i = 0; i < index; i++) {
+    it++;
+  }
+  MessageListItem itemData = *it;
+  // 5.根据传入的inView参数是否已经存在一个视图对象,若为空则创建一个新的MessageItemView对象,否则将inView转换成MessageItemView类型的指针
+  if (inView == nullptr) {
+    item = new MessageItemView();
+  } else {
+    item = static_cast<MessageItemView *>(inView);
+    item->TearDownChild();
+    item->RemoveAll();
+  }
+  item->SetUpChild();
+  item->SetItemInfo(itemData);
+  item->SetViewIndex(index);
+  item->SetOnClickListener(itemClickListener);
+  return item;
+}
+
+void MessageListAdapter::AddListItem(const MessageListItem &item) {
+  listData.push_back(item);
+}
+} // namespace OHOS
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageCardView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageCardView.cpp
new file mode 100644 (file)
index 0000000..2dddf40
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: MessageCardView.cpp
+ * Author:
+ * Create: 2021-12-21
+ */
+
+#include <string>
+#include "common/image_cache_manager.h"
+#include "ui_resource_image.h"
+#include "message/include/MessageCardView.h"
+#include "message/include/MessagePresenter.h"
+#include "uicomponents/UIComponents.h"
+#include "message/include/MessageControlPresenter.h"
+namespace OHOS
+{
+
+    static MessageCardView *g_pMessageCardView = nullptr;
+    static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6;
+    static constexpr int16_t MORE_LIST_POSITION_X = 43;
+    static constexpr int16_t MORE_LIST_POSITION_Y = 95;
+    static constexpr int16_t MORE_SCROLLBLANKSIZE = 35; // 设置此滚动视图的空白大小。
+    static constexpr int16 MAX_SCR_DIS = 1000;
+    static constexpr int16 LIST_POS = 20;
+    static constexpr int16 SNUM_2 = 2;
+    static constexpr uint8_t NUM_2 = 2;
+
+    static constexpr char *lineimagePath = "/user/res/message/Line.bin";
+    MessageCardView::MessageCardView()
+    {
+        SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+        g_pMessageCardView = this;
+    }
+
+    MessageCardView::~MessageCardView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageCardView::~MessageCardView()");
+        ClearAll();
+        g_pMessageCardView = nullptr;
+    }
+
+    void MessageCardView::ClearAll(void)
+    {
+         RemoveAll();
+        if (imageline != nullptr)
+        {
+            delete imageline;
+            imageline = nullptr;
+        }
+        if (MessageList != nullptr)
+        {
+            delete MessageList;
+            MessageList = nullptr;
+        }
+        if(p_MessageListAdapter != nullptr)
+        {
+            delete p_MessageListAdapter;
+            p_MessageListAdapter = nullptr;
+        } 
+    }
+    void MessageCardView::AddMessageToList(const MessageListItem &item)
+    {
+        p_MessageListAdapter->AddListItem(item);
+    }
+    // 初始化页面
+    bool MessageCardView::InitPage(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitPage is begin");
+
+        /*初始化image*/
+        InitImageView(imageline, 193, 30, 365, 35, "image", lineimagePath);
+        Add(imageline);
+
+        // UIList 的适配器
+        if(p_MessageListAdapter == nullptr)
+        {
+            p_MessageListAdapter = new MessageListAdapter();
+        }
+
+        p_MessageListAdapter->SetItemClickListener(MessageControlPresenter::GetInstance());
+        if (MessageList == nullptr)
+        {
+            MessageList = new UIList();
+        }
+        // MessageList->SetPosition(MORE_LIST_POSITION_X, MORE_LIST_POSITION_Y, 466, 466);
+        MessageList->SetPosition(MORE_LIST_POSITION_X, MORE_LIST_POSITION_Y, 466, 466);
+        MessageList->SetThrowDrag(true);
+        MessageList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+        MessageList->SetMaxScrollDistance(1000); // 1000: max scroll distance
+        MessageList->SetSwipeACCLevel(200);      // 800: compensation distance
+        MessageList->SetDragACCLevel(5);         // 5: drag acceleration
+        MessageList->SetViewId(MAINMESSAGEVIEW);
+        MessageList->SetOnClickListener((UIView::OnClickListener *)OHOS::MessageControlPresenter::GetInstance());
+        MessageList->SetIntercept(true);
+
+
+        Add(MessageList);
+        MessageList->SetAdapter(p_MessageListAdapter);
+
+        // MessageList->RefreshList();
+        // SetDraggable(true);
+        // SetTouchable(true);
+
+        initViewStatus = true;
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitPage is end");
+        return true;
+    }
+
+    // 初始化视图为可拖拽,可触摸
+    bool MessageCardView::InitView(void *caller)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageCardView InitView %p", caller);
+        if (InitPage() == false)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitPage fail");
+            return false;
+        }
+        SetDraggable(true);
+        SetTouchable(true);
+        return true;
+    }
+
+    bool MessageCardView::GetInitViewState(void)
+    {
+        return initViewStatus;
+    }
+
+    MessageCardView *MessageCardView::GetInstance(void)
+    {
+        return g_pMessageCardView;
+    }
+    void MessageCardView::SetUpView(MessageCardView *messageCardView)
+    {
+        /* 加载list */
+        MessageModel::GetInstance().InitMessageListItems();
+        const MessageListItem *itemInfo =   MessageModel::GetInstance().GetMessageListItems();
+        uint8_t num = MessageModel::GetInstance().GetMessageCount();
+        for (int i = 0; i < num; i++)
+        {
+            messageCardView->AddMessageToList(itemInfo[i]);
+        }
+    }
+    void MessageCardView::UpdateMessageCard()
+    {
+    }
+    UIList *MessageCardView::GetList()
+    {
+        return MessageList;
+    }
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlPresenter.cpp
new file mode 100644 (file)
index 0000000..2179f2c
--- /dev/null
@@ -0,0 +1,75 @@
+/***
+ * @Date: 2024-06-22 11:36:16
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-03 14:23:21
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp
+ */
+/***
+ * @Date: 2024-06-22 11:36:16
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-25 15:51:56
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp
+ */
+
+#include "message/include/MessageControlPresenter.h"
+#include "message/include/MessageControlView.h"
+#include "message/include/MessageModel.h"
+
+#include "AppViewIDs.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+#include "NativeAbility.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+#include "UiConfig.h"
+#include "wearable_log.h"
+
+#include "uicomponents/UIComponents.h"
+
+namespace OHOS
+{
+    bool MessageControlPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        UNUSED(event);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageControlView::OnClick %s", view.GetViewId());
+
+        MessageModel &messageModel = MessageModel::GetInstance();
+
+        if (!messageModel.HasDataVector())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Vector data not loaded.");
+            return false;
+        }
+
+        if (strcmp(view.GetViewId(), DELETEALLDATA) == 0)
+        {
+            // 执行全部删除操作
+            messageModel.ClearAllMessages();
+            NativeAbility::GetInstance().Back();
+            return true;
+        }
+
+        // 获取 MessageItemView 并检查索引
+        MessageItemView *pMessageItemView = dynamic_cast<MessageItemView *>(&view);
+        if (!pMessageItemView)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Invalid view type for view ID %s.", view.GetViewId());
+            return false;
+        }
+
+        int index = pMessageItemView->GetMessageListIndex();
+        int messageCount = messageModel.GetMessageCount();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Clicked message index: %d, Total messages: %d", index, messageCount);
+
+        if (index >= 0 && index < messageCount)
+        {
+            messageModel.SetCurrentIndex(index);
+            messageModel.SetMessageAsRead();
+            NativeAbility::GetInstance().EnterSlice(VIEW_MESSAGE_SHOW); // 切换到详情界面
+            return true;
+        }
+
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Index %d is out of bounds.", index);
+        return false;
+    }
+} // namespace OHOS
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageControlView.cpp
new file mode 100644 (file)
index 0000000..d95047a
--- /dev/null
@@ -0,0 +1,117 @@
+
+#include "message/include/MessageControlView.h"
+#include "message/include/MessageControlPresenter.h"
+#include "message/include/MessageModel.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+static MessageControlView *g_pMessageControlView{nullptr};
+MessageControlView::MessageControlView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "MessageControlView::MessageControlView()");
+  SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+  g_pMessageControlView = this;
+}
+
+MessageControlView::~MessageControlView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                "MessageControlView::~MessageControlView()");
+  if (viewiInitStatus) {
+    ClearAll();
+  }
+  g_pMessageControlView = nullptr;
+}
+
+MessageControlView *MessageControlView::GetInstance() {
+  return g_pMessageControlView;
+}
+
+void MessageControlView::ClearAll(void) {
+  RemoveAll();
+  if (messageLackView != nullptr) {
+    messageLackView->RemoveAll();
+    delete messageLackView;
+    messageLackView = nullptr;
+  }
+  if (messageCardView != nullptr) {
+    messageCardView->RemoveAll();
+    delete messageCardView;
+    messageCardView = nullptr;
+  }
+}
+
+bool MessageControlView::InitView(void) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageControlView InitView");
+  if (messageLackView == nullptr) {
+    messageLackView = new MessageLackView();
+    if (messageLackView == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "MessageLackView::new messageLackView fail");
+      return false;
+    }
+  }
+  if (messageLackView->CreateUIViewGroup() == false) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CreateUIViewGroup fail");
+    return false;
+  }
+  if (messageCardView == nullptr) {
+    messageCardView = new MessageCardView();
+    if (messageCardView == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "MessageCardView::new messageCardView fail");
+      return false;
+    }
+  }
+  if (messageCardView->InitPage() == false) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "InitPage fail");
+    return false;
+  }
+  
+  Add(messageCardView);
+  Add(messageLackView);
+
+  isLack = MessageModel::GetInstance().HasDataVector();
+  if (!isLack) {
+    messageCardView->SetVisible(false);
+    messageLackView->SetVisible(true);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageLackView true");
+  } else {
+    messageCardView->SetVisible(true);
+    messageCardView->SetUpView(messageCardView);
+    messageCardView->GetList()->RefreshList();
+    messageLackView->SetVisible(false);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageCardView true");
+  }
+  return true;
+}
+
+void MessageControlView::SetLackView(bool flag) {
+  // 避免相同设置多次赋值
+  if (flag == isLack)
+    return;
+
+  isLack = flag;
+
+  if (isLack) {
+    messageLackView->SetVisible(true);
+    messageCardView->SetVisible(false);
+  } else {
+    messageLackView->SetVisible(false);
+    messageCardView->SetVisible(true);
+  }
+}
+
+void MessageControlView::PreLoad(void) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageControlView::PreLoad");
+  if (!viewiInitStatus) {
+    InitView();
+    viewiInitStatus = true;
+  }
+}
+
+void MessageControlView::UnLoad(void) {
+  // Message's usage scenes is complicated, so we do not release it's resources
+  // inner slice.
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageControlView::UnLoad");
+}
+} // namespace OHOS
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageItemView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageItemView.cpp
new file mode 100644 (file)
index 0000000..f4e7c83
--- /dev/null
@@ -0,0 +1,142 @@
+#include "message/include/MessageItemView.h"
+#include "message/include/MessageModel.h"
+#include "ConfigModel.h"
+namespace OHOS
+{
+    static constexpr const char *ICON_IMAGE = "user/res/message/Icon.bin";
+
+#define SELF_ADAPTION 1
+#define RECTANGLE_WIDTH 380
+
+// 定义不同大小背景矩形的长度常量
+#define SMALL_RECTANGLE_LENGTH 180
+#define MEDIUM_RECTANGLE_LENGTH 210
+#define BIG_RECTANGLE_LENGTH 240
+
+// 定义不同大小标签的长度常量
+#define SMALL_LABEL_LENGTH 30
+#define MEDIUM_LABEL_LENGTH 80
+#define BIG_LABEL_LENGTH 115
+
+// 时间的top
+#define SMALL_TIMELABEL_LENGTH 110
+#define MEDIUM_TIMELABEL_LENGTH 141
+#define BIG_LABELTIME_LENGTH 173
+
+    // 定义全局变量
+    static int item_length = BIG_RECTANGLE_LENGTH;
+    static int label_length = BIG_LABEL_LENGTH;
+    static int time_top = BIG_LABELTIME_LENGTH;
+
+    MessageItemView::MessageItemView()
+    {
+        SetPosition(0, 0, RECTANGLE_WIDTH, item_length);
+        SetStyle(STYLE_BACKGROUND_OPA, 255);
+        SetStyle(STYLE_BORDER_RADIUS, 20);
+        SetTouchable(true);
+    }
+
+    MessageItemView::~MessageItemView()
+    {
+        RemoveAll();
+    }
+
+    void MessageItemView::SetItemInfo(const MessageListItem itemInfo)
+    {
+        sItemInfo = itemInfo;
+#if SELF_ADAPTION
+        // 根据 labeldetails 的大小设置矩形和标签的长度
+        // printf("itemInfo.labeldetails.size():%d\r\n", itemInfo.labeldetails.size());
+
+        if (itemInfo.labeldetails.size() <= 30) // 一行
+        {
+            item_length = SMALL_RECTANGLE_LENGTH;
+            label_length = SMALL_LABEL_LENGTH;
+            time_top = SMALL_TIMELABEL_LENGTH;
+        }
+        else if (itemInfo.labeldetails.size() > 30 && itemInfo.labeldetails.size() <= 60) // 两行
+        {
+            item_length = MEDIUM_RECTANGLE_LENGTH;
+            label_length = MEDIUM_LABEL_LENGTH;
+            time_top = MEDIUM_TIMELABEL_LENGTH;
+        }
+        else
+        {
+            item_length = BIG_RECTANGLE_LENGTH;
+            label_length = BIG_LABEL_LENGTH;
+            time_top = BIG_LABELTIME_LENGTH;
+        }
+        /* 自适应消息列表配置 测试中 */
+        SetPosition(0, 0, RECTANGLE_WIDTH, item_length);
+        smessgae.SetPosition(40, 69, 300, label_length);
+        stime.SetPosition(40, time_top, 300, 33);
+        sLabelButton.SetPosition(0, 0, 380, item_length - 20);
+#endif
+        sIcon.SetSrc(ICON_IMAGE);
+        stitle.SetText(itemInfo.labeltitle.c_str());
+        smessgae.SetText(itemInfo.labeldetails.c_str());
+        stime.SetText(itemInfo.labeltime.c_str());
+        // 设置图标可见性
+        sIcon.SetVisible(!itemInfo.read);
+
+        // printf("MessageItemView   itemInfo %d %s %s\r\n", itemInfo.read, itemInfo.labeltitle.c_str(), itemInfo.labeldetails.c_str(), itemInfo.labeltime.c_str());
+        // printf("MessageItemView   size %d %d %d\r\n", label_length, item_length, time_top);
+    }
+    void MessageItemView::TearDownChild()
+    {
+        if (!isSetupChild)
+            return;
+
+        Remove(&sIcon);
+        Remove(&stitle);
+        Remove(&smessgae);
+        Remove(&stime);
+        Remove(&sLabelButton);
+
+        isSetupChild = false;
+    }
+    void MessageItemView::SetUpChild()
+    {
+        if (isSetupChild)
+            return;
+
+        sIcon.SetPosition(40, 43);
+        sIcon.SetStyle(STYLE_IMAGE_OPA, OPA_OPAQUE);
+
+        stitle.SetPosition(60, 31, 280, 35);
+        stitle.SetTextColor(Color::White());
+        stitle.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        // 来回滚动属性
+        stitle.SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION);
+        stitle.SetRollSpeed(23);
+
+        smessgae.SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+        smessgae.SetTextColor(Color::Gray());
+        smessgae.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+
+        stime.SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+        stime.SetTextColor(Color::Gray());
+        stime.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
+
+        sLabelButton.SetPosition(0, 0, 380, item_length - 20);
+        sLabelButton.SetStyle(STYLE_BACKGROUND_COLOR, 0xff303030);
+        sLabelButton.SetStyle(STYLE_BORDER_RADIUS, 20);
+
+        sLabelButton.SetStyleForState(STYLE_BORDER_RADIUS, 20, UIButton::PRESSED);
+        sLabelButton.SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED);
+        sLabelButton.SetTouchable(true);
+
+        Add(&sLabelButton);
+        Add(&sIcon);
+        Add(&stitle);
+        Add(&smessgae);
+        Add(&stime);
+
+        isSetupChild = false;
+    }
+
+    int MessageItemView::GetMessageListIndex()
+    {
+        return sItemInfo.index;
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageLackView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageLackView.cpp
new file mode 100644 (file)
index 0000000..fe01bf4
--- /dev/null
@@ -0,0 +1,96 @@
+/***
+ * @Date: 2024-06-19 17:04:20
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-19 18:04:58
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageLackView.cpp
+ */
+/*
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.
+ * Description: MessageLackView.cpp
+ * Author:
+ * Create: 2022-04-02
+ */
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "message/include/MessageLackView.h"
+#include "message/include/MessageModel.h"
+#include "uicomponents/UIComponents.h"
+namespace OHOS
+{
+    static constexpr char *lineimagePath = "/user/res/message/Line.bin";
+    static constexpr char *messageimagePath = "/user/res/message/message.bin";
+    static MessageLackView *g_pMainView = nullptr;
+    MessageLackView::MessageLackView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageLackView::MessageLackView");
+        SetPosition(0, 0, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+        g_pMainView = this;
+    }
+
+    MessageLackView::~MessageLackView()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageLackView::~MessageLackView");
+        ClearAll();
+        g_pMainView = nullptr;
+    }
+
+    void MessageLackView::ClearAll(void)
+    {
+        RemoveAll();
+        if (imageline != nullptr)
+        {
+            delete imageline;
+            imageline = nullptr;
+        }
+        if (imagemeage != nullptr)
+        {
+            delete imagemeage;
+            imagemeage = nullptr;
+        }
+        if (labelmeage != nullptr)
+        {
+            delete labelmeage;
+            labelmeage = nullptr;
+        }
+    }
+
+    MessageLackView *MessageLackView::GetInstance(void)
+    {
+        return g_pMainView;
+    }
+
+    bool MessageLackView::CreateUIViewGroup(void)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageLackView::CreateUIViewGroup");
+
+        /*初始化label*/
+        InitRollLabel(labelmeage, 53, 276, 360, 40, "labelMessage", STR_MESSAGENO, DEFAULT_VECTOR_FONT_FILENAME, 30);
+        labelmeage->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff));
+        /*初始化image*/
+        InitImageView(imageline, 193, 30, 365, 35, "image", lineimagePath);
+        InitImageView(imagemeage, 183, 156, 100, 100, "image", messageimagePath);
+
+        Add(imageline);
+        Add(imagemeage);
+        Add(labelmeage);
+
+        SetDraggable(false);
+        SetTouchable(false);
+        initViewStatus = true;
+        return true;
+    }
+
+    bool MessageLackView::InitView(void *caller)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageLackView InitView %p", caller);
+        bool ret = CreateUIViewGroup();
+        if (ret == false)
+        {
+            return false;
+        }
+        SetDraggable(true);
+        SetTouchable(true);
+        return true;
+    }
+
+}
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageModel.cpp
new file mode 100644 (file)
index 0000000..86a2f5d
--- /dev/null
@@ -0,0 +1,1109 @@
+/*
+ * @Date: 2024-06-21 09:56:18
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-10-11 19:05:25
+ * @FilePath:
+ * /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp
+ */
+
+#include "message/include/MessageModel.h"
+#include "AppViewIDs.h"
+#include "ConfigModel.h"
+#include "MainModel.h"
+#include "MainViewSample.h"
+#include "NativeAbility.h"
+#include "UiConfig.h"
+
+// #include "bleANCS.h"
+
+#include "broadcast_feature.h"
+#include "broadcast_service.h"
+#include "cJSON.h"
+#include "common/image_cache_manager.h"
+#include "custom_runtime.h"
+#include "custom_utils.h"
+#include "samgr_lite.h"
+#include "thread_adapter.h"
+#include "ui_resource_image.h"
+#include "wearable_log.h"
+#include <algorithm>
+#include <chrono>
+#include <cstring>
+#include <dirent.h>
+#include <filesystem>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <map>
+#include <service/graphic_service.h>
+#include <sstream>
+#include <stdlib.h>
+#include <string>
+#include <thread>
+#include <vector>
+
+#include "message/include/MessageCardView.h"
+#include "message/include/MessageControlView.h"
+#include "message/include/MessageView.h"
+
+// #include "traing/include/TraingModel.h"
+
+#define MESSAGE_JSON_FILE "user/userdata/ancs.json"
+#define MESSAGE_JSON_DIR "user/userdata/message/"
+#define PRINTFDATA 0
+
+// #include "message_notification.h"
+#include "msg_center.h"
+#include "notification_manager.h"
+
+extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time,
+                                       char date_separator, char time_separator,
+                                       date_format_t format);
+
+// #include "msg_center_customerC.h"
+
+// void show_notify_messgae() {
+//   // printf("show_notify_messgae\n");
+//   OHOS::NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_THREE);
+//   OHOS::NotificationManager::GetInstance()->ShowNotify(
+//       OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true);
+// }
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+static void Notify(void *args, const Topic topic, Request *request);
+
+using namespace OHOS;
+
+Subscriber MessageSubscirber = {
+    .identity = NULL,
+    .args = NULL,
+    .Notify = Notify,
+};
+
+void MessageSubscribeTopic(Topic topic) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "stepsubscribeTopic, topic=%u", topic);
+  BroadcastApi *broadcastApi = NULL;
+  IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,
+                                                     BROADCAST_FEATURE_NAME);
+  if (api == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "stepsubscribeTopic, GetFeatureApi failed");
+    return;
+  }
+  int result =
+      api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);
+  if (result != 0 || broadcastApi == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "stepsubscribeTopic, QueryInterface failed");
+    return;
+  }
+  broadcastApi->SubscribeTopic((IUnknown *)broadcastApi, topic,
+                               &MessageSubscirber);
+  broadcastApi->Release((IUnknown *)broadcastApi);
+}
+
+void MessageUnsubscribeTopic(Topic topic) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageUnsubscribeTopic, topic=%u",
+                topic);
+  BroadcastApi *broadcastApi = NULL;
+  IUnknown *api = SAMGR_GetInstance()->GetFeatureApi(BROADCAST_SERVICE_NAME,
+                                                     BROADCAST_FEATURE_NAME);
+  if (api == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "MessageUnsubscribeTopic, GetFeatureApi failed");
+    return;
+  }
+  int result =
+      api->QueryInterface(api, DEFAULT_VERSION, (void **)&broadcastApi);
+  if (result != 0 || broadcastApi == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "MessageUnsubscribeTopic, QueryInterface failed");
+    return;
+  }
+  broadcastApi->UnsubscribeTopic((IUnknown *)broadcastApi, topic,
+                                 &MessageSubscirber);
+  broadcastApi->Release((IUnknown *)broadcastApi);
+}
+
+// 存储消息更新的定时器
+static uint32_t messageTimestamp = 0;
+
+static void Notify(void *args, const Topic topic, Request *request) {
+  UNUSED(args);
+  UNUSED(topic);
+
+  if (request == NULL) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Received NULL request");
+    return;
+  }
+
+  // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d", request->msgId);
+
+  // if (request->msgId == TOPIC_EVENT_MESSAGE_UPDATA) {
+  //   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+  //                 "Processing TOPIC_EVENT_MESSAGE_UPDATA");
+
+  //   if (request->data == NULL) {
+  //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Received NULL data");
+  //     return;
+  //   }
+
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Received request %d",
+  //                 request->msgId);
+  //   ancs_data_info_t *messageInfo = (ancs_data_info_t *)request->data;
+  //   ancs_data_info_t messageInfo_;
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo");
+
+  //   messageInfo_.title = (char *)malloc(messageInfo->titlelen + 1);
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo.title");
+  //   if (messageInfo_.title == NULL) {
+  //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+  //                   "Failed to allocate memory for title");
+  //     return;
+  //   }
+
+  //   memcpy(messageInfo_.title, messageInfo->title, messageInfo->titlelen);
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "memcpy");
+  //   messageInfo_.title[messageInfo->titlelen] = '\0';
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+  //                 "messageInfo.title[messageInfo->titlelen]");
+  //   messageInfo_.msg = (char *)malloc(messageInfo->msglen + 1);
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "messageInfo_.msg");
+  //   if (messageInfo_.msg == NULL) {
+  //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+  //                   "Failed to allocate memory for message");
+  //     free(messageInfo_.title); // Free previously allocated title
+  //     return;
+  //   }
+
+  //   memcpy(messageInfo_.msg, messageInfo->msg, messageInfo->msglen);
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+  //                 "messageInfo.msg[messageInfo->msglen]");
+  //   messageInfo_.msg[messageInfo->msglen] = '\0';
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+  //                 "messageInfo_.msg[messageInfo->msglen end");
+
+  //   messageInfo_.appid = messageInfo->appid;
+  //   messageInfo_.uid = messageInfo->uid;
+  //   messageInfo_.time = messageInfo->time;
+  //   messageInfo_.read = 0;
+
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "message_data %p %p\r\n",
+  //                 messageInfo_.title, messageInfo_.msg);
+
+  //   MessageModel::GetInstance().AddMessageData(&messageInfo_);
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddMessageData");
+
+  //   // uint32_t currentTimestamp = OHOS::TraingModel::GetInstance()->get_current_time();
+  //   uint32_t currentTimestamp = 0;
+  //   if (currentTimestamp - messageTimestamp <= 1) {
+  //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageTimestamp too short");
+  //     free(messageInfo_.title);
+  //     free(messageInfo_.msg);
+  //     return;
+  //   }
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "get_current_time end");
+
+  //   messageTimestamp = currentTimestamp;
+
+  //   /*
+  //     以下状态不进行消息弹窗
+  //     -训练中
+  //     -省电模式
+  //     -呼吸训练中
+  //     -使用语音助手
+  //   */
+  //   if (uapi_dev_runtime_get_train_status() ||
+  //       uapi_dev_runtime_get_saveele_status() ||
+  //       uapi_dev_runtime_get_respiratory_training_status() ||
+  //       uapi_dev_runtime_get_voice_status()) {
+
+  //     free(messageInfo_.title);
+  //     free(messageInfo_.msg);
+  //     return;
+  //   }
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "status end");
+
+  //   CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0);
+
+  //   // show_notify_messgae();
+
+  //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Message popup sent");
+
+  //   free(messageInfo_.title);
+  //   free(messageInfo_.msg);
+  // }
+}
+void saveancsdata() {
+  // printf("saveancs\r\n");
+  OHOS::MessageModel::GetInstance().SaveMessagesToStorage();
+  return;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+namespace OHOS {
+MessageModel::MessageModel() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageModel");
+  // LoadMessagesFromStorage();
+}
+MessageModel::~MessageModel() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageModel::~MessageModel()");
+  MessageUnsubscribeTopic(TOPIC_EVENT_MESSAGE_UPDATA); // 取消订阅
+}
+MessageModel &MessageModel::GetInstance() {
+  static MessageModel instance;
+  return instance;
+}
+
+void MessageModel::at_message_test() {
+  // // Initialize timestamp
+  // uint32_t timestamp = 0;
+  // if (uapi_get_timestampe_ss(&timestamp) != ERRCODE_SUCC) {
+  //   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get timestamp");
+  //   return;
+  // }
+
+  // ancs_data_info_t data;
+  // const char *title = "title"; // Assuming title and msg are defined elsewhere
+  // const char *msg = "message";
+
+  // data.title = (char *)malloc(strlen(title) + 1);
+  // data.msg = (char *)malloc(strlen(msg) + 1);
+
+  // if (data.title == NULL || data.msg == NULL) {
+  //   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Memory allocation failed");
+  //   free(data.title); // Free previously allocated memory
+  //   free(data.msg);
+  //   return;
+  // }
+
+  // strcpy(data.title, title);
+  // strcpy(data.msg, msg);
+
+  // data.appid = 0;
+  // data.uid = 0;
+  // data.time = timestamp;
+  // data.read = 0;
+  // data.hasCode = 1;
+
+  // data.msglen = strlen(msg);
+  // data.titlelen = strlen(title);
+
+  // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "message_data %s %s\r\n", data.title,
+  //               data.msg);
+
+  // CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA, (uint8_t *)&data,
+  //                    sizeof(ancs_data_info_t));
+
+  // free(data.title);
+  // free(data.msg);
+
+  // Simulate message push notification (if needed)
+  // OHOS::NotificationManager::GetInstance()->ShowNotify(
+  //     OHOS::CreateMessageView, TOPIC_EVENT_MESSAGENOTE, true);
+}
+
+void MessageModel ::Init() {
+  MessageSubscribeTopic(TOPIC_EVENT_MESSAGE_UPDATA); // 进行消息订阅
+}
+// 获取消息列表项
+const MessageListItem *MessageModel::GetMessageListItems() const {
+  return Messages;
+}
+
+// 获取消息数量
+uint8_t MessageModel::GetMessageCount() const { return numberOfItems; }
+
+// 加载Message文件
+bool MessageModel::LoadMessagesFromStorage() {
+  // 加载消息过滤文件
+  // filtration_file_read();
+
+  std::ifstream file(MESSAGE_JSON_FILE);
+  if (!file.is_open()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for reading");
+    return false;
+  }
+
+  std::string fileContent((std::istreambuf_iterator<char>(file)),
+                          std::istreambuf_iterator<char>());
+  file.close();
+
+  cJSON *root = cJSON_Parse(fileContent.c_str());
+  if (!root) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error parsing JSON file");
+    return false; // JSON 解析失败,直接返回
+  }
+
+  cJSON *messageArray = cJSON_GetObjectItem(root, "messages");
+  if (!messageArray || !cJSON_IsArray(messageArray)) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid data format in JSON file");
+    cJSON_Delete(root);
+    return false; // 无效的消息数组,直接返回
+  }
+
+  // 清空现有数据
+  // MessageVector.clear();
+
+  // 将JSON数据转换为MessageData并添加到消息数组中
+  int dataCount = cJSON_GetArraySize(messageArray);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dataCount is %d", dataCount);
+
+  for (int i = 0; i < dataCount; i++) {
+    cJSON *item = cJSON_GetArrayItem(messageArray, i);
+    if (!item) // 检查数组项是否有效
+    {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid item at index %d", i);
+      cJSON_Delete(root);
+      return false; // 找到无效项,直接返回
+    }
+
+    // 验证并获取各字段
+    cJSON *isRead = cJSON_GetObjectItem(item, "isRead");
+    cJSON *labelDetails = cJSON_GetObjectItem(item, "labelDetails");
+    cJSON *labelTitle = cJSON_GetObjectItem(item, "labelTitle");
+    cJSON *timestamp = cJSON_GetObjectItem(item, "timestamp");
+
+    // 检查必要字段是否存在
+    if (!isRead || !cJSON_IsBool(isRead) || !timestamp ||
+        !cJSON_IsNumber(timestamp)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "Invalid message format at index %d", i);
+      cJSON_Delete(root);
+      return false; // 找到无效数据格式,直接返回
+    }
+
+    // 如果所有必要字段有效,则解析并构造 MessageData
+    MessageData data;
+    data.isRead = cJSON_IsTrue(isRead);
+
+    // 允许 labelDetails 和 labelTitle 字段为空字符串
+    data.labelDetails = (labelDetails && cJSON_IsString(labelDetails))
+                            ? labelDetails->valuestring
+                            : "";
+    data.labelTitle = (labelTitle && cJSON_IsString(labelTitle))
+                          ? labelTitle->valuestring
+                          : "";
+    data.timestamp = timestamp->valuedouble;
+
+    // 处理时间字符串
+    char labelTime[20];
+    if (uapi_get_TIME_STR(data.timestamp, labelTime, '.', ':',
+                          DATE_Y_M_D_H_M) != ERRCODE_SUCC) {
+      data.labelTime = std::string("--");
+    } else {
+      data.labelTime = std::string(labelTime);
+    }
+
+    MessageVector.push_back(data);
+  }
+
+  cJSON_Delete(root);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                "Messages loaded from storage successfully");
+  return true; // 所有消息成功加载
+}
+// 保存Message文件
+bool MessageModel::SaveMessagesToStorage() {
+  // 消息过滤文件保存
+  // filtration_file_save();
+  if (MessageVector.empty()) {
+    // 清空文件
+    std::ofstream file(MESSAGE_JSON_FILE,
+                       std::ofstream::out | std::ofstream::trunc);
+    if (file.is_open()) {
+      file.close();
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "MessageVector is empty, existing file was cleared");
+      return true;
+    } else {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "MessageVector is empty,Failed to open file for writing");
+      return false;
+    }
+  }
+
+  cJSON *root = cJSON_CreateObject();
+  cJSON *messageArray = cJSON_CreateArray();
+
+  for (const auto &data : MessageVector) {
+    cJSON *item = cJSON_CreateObject();
+    cJSON_AddBoolToObject(item, "isRead", data.isRead);
+    cJSON_AddStringToObject(item, "labelDetails", data.labelDetails.c_str());
+    cJSON_AddStringToObject(item, "labelTitle", data.labelTitle.c_str());
+    cJSON_AddNumberToObject(item, "timestamp", data.timestamp);
+
+    cJSON_AddItemToArray(messageArray, item);
+  }
+
+  cJSON_AddItemToObject(root, "messages", messageArray);
+
+  std::ofstream file(MESSAGE_JSON_FILE,
+                     std::ofstream::out | std::ofstream::trunc);
+  if (!file.is_open()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for writing");
+    cJSON_Delete(root);
+    return false;
+  }
+
+  char *jsonData = cJSON_Print(root);
+  file << jsonData << std::endl;
+  file.close();
+  cJSON_free(jsonData);
+  cJSON_Delete(root);
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                "Messages saved to storage successfully");
+  return true;
+}
+// 初始化列表
+void MessageModel::InitMessageListItems() {
+  bool unread_state = false;            // 初始化未读状态
+  numberOfItems = MessageVector.size(); // 获取 MessageVector 的大小
+
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "当前的项数是 %d", numberOfItems);
+  if (numberOfItems == 0) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageVector is empty");
+    return;
+  }
+  // 从 MessageVector 的末尾开始迭代
+  for (int i = numberOfItems - 1, count = 0;
+       i >= 0 && count < MaxMessageListCount; i--, count++) {
+    const auto &msg = MessageVector[i]; // 使用引用避免复制
+
+    // 检查消息是否已读
+    if (!msg.isRead)
+      unread_state = true;
+
+    // 填充 Messages 数组
+    Messages[count] = {count, msg.isRead, msg.labelTitle, msg.labelDetails,
+                       msg.labelTime};
+  }
+
+  // 更新未读状态
+  ConfigModel::GetInstance()->set_condigData_Bool(
+      ConfigModel::CONFIGMODEL_ITEM_MESSAGE_UNREAD, unread_state);
+}
+// 设置当前项[数组下标]
+void MessageModel::SetCurrentIndex(uint8_t index) {
+  if (index < 0 || index > MaxMessageListCount)
+    return;
+  numberOfItems = MessageVector.size();
+  currentIndex_ = numberOfItems - index - 1;
+}
+
+// 获取当前项[数组下标]
+uint8_t MessageModel::GetCurrentIndex() { return currentIndex_; }
+
+// 增加消息项[添加数组项]
+// void MessageModel::AddMessageData(ancs_data_info_t *messageInfo) {
+//   if (messageInfo == nullptr) {
+//     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo is null");
+//     return;
+//   }
+
+//   // 创建并填充 MessageData
+//   MessageData data;
+//   data.isRead = messageInfo->read;
+//   data.labelDetails = messageInfo->msg ? messageInfo->msg : "";
+//   data.labelTitle = messageInfo->title ? messageInfo->title : "";
+//   data.timestamp = messageInfo->time;
+
+//   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+//                 "AddMessageData data.isRead is %d, data.labelDetails is %s, "
+//                 "data.labelTitle is %s, data.timestamp is %u",
+//                 data.isRead, data.labelDetails.c_str(), data.labelTitle.c_str(),
+//                 data.timestamp);
+
+//   // 处理时间字符串
+//   char labelTime[20];
+//   if (uapi_get_TIME_STR(data.timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) !=
+//       ERRCODE_SUCC) {
+//     data.labelTime = "--"; // 默认值
+//   } else {
+//     data.labelTime = labelTime; // 直接使用 labelTime
+//   }
+
+//   // 添加数据到消息向量
+//   MessageVector.push_back(data);
+
+//   // 删除多余的数据
+//   if (MessageVector.size() > MaxMessageListCount) {
+//     MessageVector.erase(MessageVector.begin(),
+//                         MessageVector.begin() +
+//                             (MessageVector.size() - MaxMessageListCount));
+//   }
+
+//   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo add is ok");
+// }
+
+// 获取目前的项
+MessageData *MessageModel::GetCurrentMessageData() {
+  if (currentIndex_ < MessageVector.size()) {
+    return &MessageVector[currentIndex_];
+  }
+  return nullptr;
+}
+
+// 设置当前项已读
+bool MessageModel::SetMessageAsRead() {
+  if (currentIndex_ < MessageVector.size()) {
+    MessageVector[currentIndex_].isRead = true;
+    return true;
+  }
+  return false;
+}
+
+// 删除当前项[删除数组的当前项]
+bool MessageModel::DeleteCurrentMessage() {
+  if (currentIndex_ < MessageVector.size()) {
+    MessageVector.erase(MessageVector.begin() + currentIndex_);
+    return true;
+  }
+  return false;
+}
+
+// 删除所有数据[清空数组]
+bool MessageModel::ClearAllMessages() {
+  MessageVector.clear();
+  return true;
+}
+
+// 获取最新信息[数组的最后一个]
+MessageData *MessageModel::GetNewMessage() {
+  if (!MessageVector.empty()) {
+    return &MessageVector.back();
+  }
+  return nullptr;
+}
+// 判断数组是否存在数据
+bool MessageModel::HasDataVector() {
+  // 检查 MessageVector 是否为空
+  bool hasData = !MessageVector.empty();
+
+  // 如果没有数据,更新未读状态为 false
+  if (!hasData) {
+    ConfigModel::GetInstance()->set_condigData_Bool(
+        ConfigModel::CONFIGMODEL_ITEM_MESSAGE_UNREAD, false);
+  }
+
+  return hasData; // 返回是否有数据
+}
+
+// 设置弹窗状态
+void MessageModel::SetPopupViewState(bool state) { popupViewState_ = state; }
+
+// 获取弹窗状态
+bool MessageModel::GetPopupViewState() { return popupViewState_; }
+void MessageModel::UpdateMessageView() {
+  // 更新主界面卡片
+  if (MessageControlView::GetInstance() && MainViewSample::GetInstance()) {
+    // 配置主界面回退界面
+    CardId Id = MainViewSample::GetInstance()->GetHorCurrentCard();
+    MainModel::GetInstance().SetFromSetCardView(true);
+    MainModel::GetInstance().SetFromCardId(Id);
+
+    NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+    return;
+  }
+
+  // 更新Message界面
+  auto messageView = MessageView::GetInstance();
+  if (messageView) // 检查Message界面实例
+  {
+    NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE);
+  } else {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UpdateListView: MessageView instance is nullptr");
+  }
+}
+
+} // namespace OHOS
+
+#if 0
+ uint8_t MessageModel::GetMessageCount() const
+    {
+        return (numberOfItems != 0 ? numberOfItems : MaxMessageListCount);
+    }
+    /* -------------------------------------------------------------------------- */
+    void MessageModel::PrintData(MessageData messagedata)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "--------------------------------------");
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Title: %s", (messagedata.labelTitle).c_str());
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Details: %s", (messagedata.labelDetails).c_str());
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Time: %s", (messagedata.labelTime).c_str());
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message Read: %d", messagedata.isRead);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "--------------------------------------");
+    }
+    /*打印文件名数组*/
+    void PrintFileName(const std::vector<std::string> &filenames)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Filenames:");
+        for (const auto &filename : filenames)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s", filename.c_str());
+        }
+    }
+
+    /*打印message数组*/
+    void PrintMessageData(const std::vector<MessageData> &MessageVector)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageVector:");
+        for (const auto &message : MessageVector)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title: %s", message.labelTitle.c_str());
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Details: %s", message.labelDetails.c_str());
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timestamp: %d", message.timestamp);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "IsRead: %d", message.isRead);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "");
+        }
+    }
+    /*打印map*/
+    void PrintMessageMap(const std::map<int, std::string> &messageMap)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageMap:");
+        for (const auto &pair : messageMap)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Key: %d, Value: %s", pair.first, pair.second.c_str());
+        }
+    }
+    /* -------------------------------------------------------------------------- */
+    /*检查是否存在数据*/
+    bool MessageModel::HasDataJson()
+    {
+        // 打开消息数据目录
+        DIR *dir = opendir(MESSAGE_JSON_DIR);
+        if (dir == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open MESSAGE_JSON_DIR");
+            jsonDataExists = false;
+            return false;
+        }
+
+        // 在作用域结束时自动关闭目录
+        struct DirCloser
+        {
+            void operator()(DIR *d) const
+            {
+                if (d)
+                    closedir(d);
+            }
+        };
+        std::unique_ptr<DIR, DirCloser> dirPtr(dir);
+
+        // 检查目录是否为空
+        struct dirent *ent;
+        // 是否存在文件标志位
+        bool isEmpty = true;
+        while ((ent = readdir(dir)) != nullptr)
+        {
+            // 过滤掉当前目录和上级目录
+            if (strcmp(ent->d_name, ".") == 0 || strcmp(ent->d_name, "..") == 0)
+            {
+                continue;
+            }
+            // 普通文件
+            if (ent->d_type == DT_REG || ent->d_type == DT_UNKNOWN)
+            {
+                isEmpty = false;
+                break;
+            }
+        }
+
+        if (isEmpty)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No data files found in MESSAGE_JSON_DIR");
+            jsonDataExists = false;
+            return false;
+        }
+
+        jsonDataExists = true;
+        return true;
+    }
+
+    /*加载json函数*/
+    /*
+        加载messagejson文件夹 MESSAGE_JSON_DIR
+        文件夹里面的文件[一条数据]一个文件 按序号命名,0.json 1.json 2.json...
+        需要建立一个文件名和数组下标对应的map ->方便进行对文件操作?
+        最多加载10条数据(先按序号排序??)
+        如果还有多余的遍历删除序号最小的文件(消息最早的)
+        获取到一个 MessageData 数组返回
+
+            1.遍历文件夹的每一个文件 排序
+            2.先加载?
+            3.每次加载一个文件 更新一下map
+            4.超过10条。后面的文件直接删除
+            5.返回数组
+    */
+
+    /*遍历文件夹*/
+    std::vector<std::string> GetFileNamesInDirectory(const std::string &directory)
+    {
+        std::vector<std::string> filenames;
+        DIR *dir;
+        struct dirent *ent;
+        if ((dir = opendir(directory.c_str())) != nullptr)
+        {
+            while ((ent = readdir(dir)) != nullptr)
+            {
+                std::string fileName = ent->d_name;
+                if (fileName != "." && fileName != "..")
+                {
+                    // 2.遍历文件夹里面的文件名生成文件名数组
+                    if (ent->d_type == DT_REG || ent->d_type == DT_UNKNOWN) // 普通文件
+                    {
+                        fileName = directory + fileName;
+                        filenames.push_back(fileName);
+                        // printf("GetFileNamesInDirectory:%s\r\n", fileName.c_str());
+                    }
+                    else if (ent->d_type == DT_DIR) // 目录
+                    {
+                        continue;
+                    }
+                }
+            }
+            closedir(dir);
+            return filenames;
+        }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s is null!", directory.c_str());
+        return filenames;
+    }
+
+    /*文件名数组 删除多余项*/
+    void MessageModel::DeleteExcessFiles(std::vector<std::string> &filenames)
+    {
+        if (filenames.size() > MaxMessageListCount)
+        {
+            int numFilesToDelete = filenames.size() - MaxMessageListCount;
+            for (int i = 0; i < numFilesToDelete; i++)
+            {
+                std::remove(filenames[i].c_str());      // 删除文件
+                filenames.erase(filenames.begin() + i); // 从数组中删除相应的文件名
+            }
+        }
+    }
+
+    /*message json 加载*/
+    std::vector<MessageData> MessageModel::LoadMessageData()
+    {
+        std::vector<MessageData> MessageVector; // 返回的数据列表
+        std::vector<std::string> filenames;     // 文件名数组
+
+        // 1.检查消息目录是否存在
+        filenames = GetFileNamesInDirectory(MESSAGE_JSON_DIR);
+        // 3.检查文件夹是否为空
+        if (filenames.empty())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message directory is empty");
+            return MessageVector;
+        }
+
+        // 4.文件名排序
+        // std::sort(filenames.begin(), filenames.end());
+
+        // 5.文件数量超出限制删除多余文件
+        DeleteExcessFiles(filenames); // 删除多余文件
+
+        // 6.解析json
+        for (int i = 0; i < filenames.size(); i++)
+        {
+            std::ifstream file((filenames[i]));
+            if (!file.is_open())
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open file %s ", filenames[i].c_str());
+                continue; // 跳过当前文件
+            }
+
+            std::string jsonData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
+            file.close();
+
+            cJSON *root = cJSON_Parse(jsonData.c_str());
+            if (root == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file %s ", filenames[i].c_str());
+                continue; // 跳过当前文件
+            }
+
+            MessageData messagedata;
+
+            messagedata.labelTitle = cJSON_GetObjectItem(root, "title")->valuestring;
+            messagedata.labelDetails = cJSON_GetObjectItem(root, "msg")->valuestring;
+            messagedata.isRead = cJSON_GetObjectItem(root, "read")->valueint;
+
+            // 获取时间
+            uint32 timestamp = cJSON_GetObjectItem(root, "time")->valueint;
+            messagedata.timestamp = timestamp;
+            char labelTime[20];
+            if (uapi_get_TIME_STR(timestamp, labelTime, '.', ':', DATE_Y_M_D_H_M) != ERRCODE_SUCC)
+            {
+                messagedata.labelTime = std::string("2024.1.1 00:00");
+            }
+            else
+            {
+                messagedata.labelTime = std::string(labelTime);
+            }
+
+            // 生成json数组数组
+            MessageVector.push_back(messagedata);
+            // 维护map 映射文件名和数组下标
+            fileIndexMap[i] = filenames[i];
+            cJSON_Delete(root);
+        }
+
+#if PRINTFDATA
+        PrintFileName(filenames);
+        PrintMessageData(MessageVector);
+        PrintMessageMap(fileIndexMap);
+#endif
+        return MessageVector;
+    }
+
+    void MessageModel::InitMessageListItems()
+    {
+        // 读取json数据
+        std::vector<MessageData> messageVector = LoadMessageData();
+        if (!messageVector.empty())
+        {
+            numberOfItems = messageVector.size();
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "the numberOfItems is %d", numberOfItems);
+            for (int i = numberOfItems - 1, count = 0; i >= 0 && count < MaxMessageListCount; i--, count++)
+            {
+                MessageData messageData;
+                messageData.isRead = messageVector[i].isRead;
+                messageData.labelTitle = messageVector[i].labelTitle;
+                messageData.labelDetails = messageVector[i].labelDetails;
+                messageData.labelTime = messageVector[i].labelTime;
+                // PrintData(messageData);
+                // 获取是否读取 来信 信息内容 时间
+                Messages[count] = {count, messageData.isRead, messageData.labelTitle, messageData.labelDetails, messageData.labelTime};
+            }
+        }
+    }
+
+    const MessageListItem *MessageModel::GetMessageListItems() const
+    {
+        return Messages;
+    }
+
+    bool MessageModel::GetJsonLoadStatus()
+    {
+        return jsonDataExists;
+    }
+
+    // 设置当前界面
+    void MessageModel::SetPopupViewState(bool state)
+    {
+        popupViewState = state;
+    }
+
+    // 获取当前界面 0:没有记录 | 1:有记录
+    bool MessageModel::GetPopupViewState()
+    {
+        return popupViewState;
+    }
+
+    /*保存json数据*/
+    void MessageModel::SaveMessageData(const MessageData data, const int index)
+    {
+        cJSON *root = cJSON_CreateObject();
+
+        cJSON *item = cJSON_CreateObject();
+        cJSON_AddStringToObject(item, "title", data.labelTitle.c_str());
+        cJSON_AddStringToObject(item, "msg", data.labelDetails.c_str());
+        cJSON_AddNumberToObject(item, "time", data.timestamp);
+        cJSON_AddNumberToObject(item, "read", data.isRead);
+
+        std::string jsonString = cJSON_Print(root);
+        cJSON_Delete(root);
+
+        std::ofstream file(fileIndexMap[index]);
+        if (file.is_open())
+        {
+            file << jsonString;
+            file.close();
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SaveMessageData is ok");
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to open file for writing");
+        }
+    }
+
+    // 获取目前的message
+    MessageData *MessageModel::GetCurrentMessageData()
+    {
+        PrintData(message_);
+        return &message_;
+    }
+
+    // 设置目前的message
+    void MessageModel::SetCurrentMessageData(MessageData *data)
+    {
+        if (data != nullptr)
+        {
+            message_.labelDetails = data->labelDetails;
+            message_.labelTime = data->labelTime;
+            message_.labelTitle = data->labelTitle;
+            message_.isRead = data->isRead;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SetMessageData is ok");
+        }
+    }
+
+    // 清除所有数据[删除文件夹内所有文件]
+    bool MessageModel::ClearAllData()
+    {
+        // 遍历fileIndexMap并删除对应文件
+        for (auto it = fileIndexMap.begin(); it != fileIndexMap.end(); ++it)
+        {
+            std::string filePath = it->second;
+            uapi_delete_files(filePath.c_str());
+        }
+
+        // 清空fileIndexMap
+        fileIndexMap.clear();
+
+        return true; // 表示清除操作成功
+    }
+
+    // 删除单个项 [通过 map 删除]
+    bool MessageModel::DeleteSingleItem(int currentIndex)
+    {
+        if (currentIndex < 0)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid index for deletion: Index is less than 0");
+            return false;
+        }
+
+        auto it = std::next(fileIndexMap.begin(), currentIndex);
+        if (it == fileIndexMap.end())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Item at index not found");
+            return false;
+        }
+
+        // 删除文件
+        uapi_delete_files(it->second.c_str());
+
+        // 删除对应项
+        fileIndexMap.erase(it);
+
+        return true;
+    }
+    // 设置当前项已读
+    bool MessageModel::SetMessageIsread()
+    {
+        // 1.找到对应的项文件
+        if (fileIndexMap.find(indexCurrent) == fileIndexMap.end())
+        {
+            // 检查索引是否存在于map中
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Index not found in fileIndexMap");
+            return false;
+        }
+        std::ofstream file(fileIndexMap[indexCurrent]);
+        if (!file.is_open())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "filename is error");
+            return false;
+        }
+
+        // 2.获取文件内容
+        std::string jsonData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
+        file.close();
+        if (jsonData.empty())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData is null");
+            return false;
+        }
+
+        // 3.设置属性已读
+        cJSON *root = cJSON_Parse(jsonData.c_str());
+        if (root == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file");
+            return false;
+        }
+
+        // 4.更新数据并保存文件
+        cJSON_ReplaceItemInObject(root, "isRead", cJSON_CreateNumber(1)); // 将"isRead"属性值设为1,表示已读
+
+        // 5.重新生成 JSON 字符串
+        char *updatedJsonData = cJSON_Print(root);
+
+        // 6.打开文件以写入更新后的数据
+        outFile.open(fileIndexMap[indexCurrent]);
+        if (outFile.is_open())
+        {
+            outFile << updatedJsonData; // 将更新后的 JSON 数据写入文件
+            outFile.close();
+            cJSON_free(updatedJsonData);
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file for writing");
+            cJSON_free(updatedJsonData);
+            cJSON_Delete(root);
+            return false;
+        }
+        // 释放 JSON 对象内存
+        cJSON_Delete(root);
+        return true;
+    }
+    // 获取最新消息项
+    MessageData *MessageModel::GetNewestData(int index)
+    {
+        // 打开文件
+        std::string filename = MESSAGE_JSON_DIR + std::to_string(index) + ".json";
+        std::ifstream file(filename);
+        if (!file.is_open())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file");
+            return nullptr;
+        }
+
+        // 获取文件内容
+        std::string jsonData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
+        file.close();
+
+        if (jsonData.empty())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: File is empty");
+            return nullptr;
+        }
+
+        // 解析JSON数据
+        cJSON *root = cJSON_Parse(jsonData.c_str());
+        if (root == nullptr)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to parse JSON in file");
+            return nullptr;
+        }
+
+        // 创建MessageData对象并设置属性
+        MessageData *data = new MessageData();
+        data->labelTitle = cJSON_GetObjectItem(root, "title")->valuestring;
+        data->labelDetails = cJSON_GetObjectItem(root, "msg")->valuestring;
+        data->isRead = cJSON_GetObjectItem(root, "read")->valueint;
+        data->timestamp = cJSON_GetObjectItem(root, "time")->valueint;
+
+        // 释放资源并返回数据
+        cJSON_Delete(root);
+        return data;
+    }
+    // 设置当前项
+    void MessageModel::SetCurrentIndex(uint8_t index)
+    {
+        indexCurrent = index;
+    }
+    // 获取当前项
+    uint8_t MessageModel::GetCurrentIndex()
+    {
+        return indexCurrent;
+    }
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessagePresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessagePresenter.cpp
new file mode 100644 (file)
index 0000000..dee2b48
--- /dev/null
@@ -0,0 +1,155 @@
+
+
+#include "AppViewIDs.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+
+#include "message/include/MessagePresenter.h"
+#include "message/include/MessageAdapter.h"
+#include "message/include/MessageItemView.h"
+#include "components/ui_abstract_scroll_bar.h"
+#include "gfx_utils/graphic_log.h"
+#include "wearable_log.h"
+#include "NativeAbility.h"
+#include "common/key_code.h"
+#include "KeyInputListener.h"
+#include "custom_utils.h"
+#include "gfx_utils/mem_check.h"
+
+#include "NativeRegisterManager.h"
+namespace OHOS
+{
+
+    REGIST_MENU_PRO(VIEW_MESSAGE, MessageView, MessagePresenter,
+        PNG_APPLIST_MESSAGE_IMAGE_BIG, PNG_APPLIST_MESSAGE_IMAGE,PNG_APPLIST_MESSAGE_IMAGE, "消息通知", STR_MESSAGE_NOTIFICATION);
+
+    // 当前Presenter属性实例化的内存指针
+    static MessagePresenter *g_pMessagePresenter = nullptr;
+
+    MessagePresenter::MessagePresenter()
+    {
+        model = &MessageModel::GetInstance();
+        g_pMessagePresenter = this;
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(true);
+#endif
+    }
+
+    MessagePresenter::~MessagePresenter()
+    {
+        g_pMessagePresenter = nullptr;
+#ifdef MEM_CHECK
+        MemCheck::GetInstance()->EnableLeakCheck(false);
+#endif
+    }
+
+    MessagePresenter *MessagePresenter::GetInstance()
+    {
+        return g_pMessagePresenter;
+    }
+
+    void MessagePresenter::OnStart()
+    {
+        model->InitMessageListItems();
+        Presenter<MessageView>::OnStart();
+    }
+
+    void MessagePresenter::OnPause(void)
+    {
+        Presenter<MessageView>::OnPause();
+    }
+    void MessagePresenter::OnResume(void)
+    {
+        if (view_ == nullptr)
+        {
+            return;
+        }
+
+        if (model->GetPopupViewState())
+        {
+            const MessageListItem *itemInfo = model->GetMessageListItems();
+            for (int i = 0; i < model->GetMessageCount(); i++)
+            {
+                view_->AddMessageToList(itemInfo[i]);
+            }
+        }
+
+        Presenter<MessageView>::OnResume();
+    }
+
+    void MessagePresenter::OnStop(void)
+    {
+        Presenter<MessageView>::OnStop();
+    }
+
+    bool MessagePresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT &&
+            (event.GetDeltaX() > 20) && (event.GetDeltaX() > (2 * MATH_ABS(event.GetDeltaY()))))
+        {
+            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+        }
+        if(event.GetDragDirection() == DragEvent::DIRECTION_TOP_TO_BOTTOM)
+        {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+        }
+        return true;
+    }
+
+    bool MessagePresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        UNUSED(event);
+        if (MessageModel::GetInstance().GetPopupViewState())
+        {
+            if (!(model->HasDataVector()))
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Vector data not loaded.");
+                return false;
+            }
+
+            if (strcmp(view.GetViewId(), DELETEALLDATA) == 0)
+            {
+                // 执行全部删除操作
+                model->ClearAllMessages();
+                NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+                return true;
+            }
+
+            // 获取 MessageItemView 并检查索引
+            MessageItemView *pMessageItemView = dynamic_cast<MessageItemView *>(&view);
+            if (!pMessageItemView)
+            {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error: Invalid view type for view ID %s.", view.GetViewId());
+                return false;
+            }
+
+            int index = pMessageItemView->GetMessageListIndex();
+            int messageCount = model->GetMessageCount();
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Clicked message index: %d, Total messages: %d", index, messageCount);
+
+            if (index >= 0 && index < messageCount)
+            {
+                model->SetCurrentIndex(index);
+                model->SetMessageAsRead();
+                NativeAbility::GetInstance().EnterSlice(VIEW_MESSAGE_SHOW); // 切换到详情界面
+                return true;
+            }
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Error: Index %d is out of bounds.", index);
+        }
+
+        return false;
+    }
+
+    bool MessagePresenter::OnKeyAct(UIView &view, const KeyEvent &event)
+    {
+        unsigned short keyID = event.GetKeyId();
+        unsigned short keyState = event.GetState();
+        // 如果是power键,且是亮屏状态,按键释放就返回上一级
+        if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0)
+        {
+            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+        }
+        return true;
+    }
+
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowPresenter.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowPresenter.cpp
new file mode 100644 (file)
index 0000000..33cb8be
--- /dev/null
@@ -0,0 +1,101 @@
+/***
+ * @Date: 2024-06-17 19:39:36
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-03 14:19:43
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageShowPresenter.cpp
+ */
+
+#include "AppViewIDs.h"
+#include "components/ui_label_ext.h"
+#include "ui_resource_string.h"
+#include "NativeAbility.h"
+#include "message/include/MessageShowPresenter.h"
+#include "components/ui_abstract_scroll_bar.h"
+#include "gfx_utils/graphic_log.h"
+#include "wearable_log.h"
+
+#include "common/key_code.h"
+#include "KeyInputListener.h"
+#include "custom_utils.h"
+#include "NativeRegisterManager.h"
+
+namespace OHOS
+{
+    REGIST_SLICE(VIEW_MESSAGE_SHOW, MessageShowView, MessageShowPresenter);
+
+    // 当前Presenter属性实例化的内存指针
+    static MessageShowPresenter *g_pMessageShowPresenter = nullptr;
+
+    MessageShowPresenter::MessageShowPresenter()
+    {
+        g_pMessageShowPresenter = this;
+    }
+
+    MessageShowPresenter::~MessageShowPresenter()
+    {
+        g_pMessageShowPresenter = nullptr;
+    }
+
+    MessageShowPresenter *MessageShowPresenter::GetInstance()
+    {
+        return g_pMessageShowPresenter;
+    }
+
+    void MessageShowPresenter::OnStart()
+    {
+        Presenter<MessageShowView>::OnStart();
+    }
+
+    void MessageShowPresenter::OnPause(void)
+    {
+        Presenter<MessageShowView>::OnPause();
+    }
+
+    void MessageShowPresenter::OnResume(void)
+    {
+        Presenter<MessageShowView>::OnResume();
+    }
+
+    void MessageShowPresenter::OnStop(void)
+    {
+        Presenter<MessageShowView>::OnStop();
+    }
+
+    bool MessageShowPresenter::OnDrag(UIView &view, const DragEvent &event)
+    {
+        if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT &&
+            (event.GetDeltaX() > 20) && (event.GetDeltaX() > (2 * MATH_ABS(event.GetDeltaY()))))
+        {
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE);
+            NativeAbility::GetInstance().Back();
+        }
+        return true;
+    }
+
+    bool MessageShowPresenter::OnClick(UIView &view, const ClickEvent &event)
+    {
+        UNUSED(event);
+        if (strcmp(view.GetViewId(), DELETEBUTTON) == 0)
+        {
+            // 删除当前项
+            MessageModel::GetInstance().DeleteCurrentMessage();
+
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE);
+            NativeAbility::GetInstance().Back();
+        }
+        return true;
+    }
+
+    bool MessageShowPresenter::OnKeyAct(UIView &view, const KeyEvent &event)
+    {
+        unsigned short keyID = event.GetKeyId();
+        unsigned short keyState = event.GetState();
+        // 如果是power键,且是亮屏状态,按键释放就返回上一级
+        if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER) && keyState == 1 && uapi_get_screen_state() == 0)
+        {
+            // NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+            NativeAbility::GetInstance().Back(TransitionType::TRANSITION_BACK_TO_HEXAGONS);
+        }
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageShowView.cpp
new file mode 100644 (file)
index 0000000..49e8c56
--- /dev/null
@@ -0,0 +1,282 @@
+/***
+ * @Date: 2024-06-17 19:40:11
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-17 20:20:46
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageShowView.cpp
+ */
+
+#include "message/include/MessageShowView.h"
+#include "message/include/MessageShowPresenter.h"
+#include "message/include/MessageModel.h"
+
+#include "UiConfig.h"
+#include "wearable_log.h"
+#include "uicomponents/UIComponents.h"
+#include "string"
+namespace OHOS
+{
+    // 定义按键颜色宏
+#define DEFAULT_BACKGROUND_COLOR 0xff191919
+#define PRESSED_BACKGROUND_COLOR 0xff249115
+#define PRESSED_BORDER_COLOR 0xff0b1928
+
+    static MessageShowView *g_pMessageShowView{nullptr};
+    static constexpr const int kTitlePosX = 73;
+    static constexpr const int kTitlePosY = 60;
+    static constexpr const int kTitleWidth = 320;
+    static constexpr const int kTitleHeight = 35;
+    static constexpr const int kTitleFontSize = 30;
+    static constexpr const char *kTitleViewId = "title";
+    // static constexpr const Color kTitleTextColor = Color::White();
+
+    static constexpr const int kTimePosX = 73;
+    static constexpr const int kTimePosY = 104;
+    static constexpr const int kTimeWidth = 320;
+    static constexpr const int kTimeHeight = 33;
+    static constexpr const int kTimeFontSize = 28;
+    static constexpr const char *kTimeViewId = "time";
+
+    // 配置默认值
+    static constexpr const int defaultRectWidth = 100;
+    static constexpr const int defaultLabelWidth = 40;
+    // static constexpr const Color kTimeTextColor = Color::Gray();
+#if 0
+    std::string titleStr = "12306中国高速铁路";
+    std::string timeStr = "2023.12.26 17:23";
+    std::string messageStr = "【铁路12306】系统已自动为您生成订单EC09828333,04月23日G2231次,深圳北站13:31开。请您在2小时内完成支付。您可通过以下链接进行支付。https://www.12306.cn/index/";
+#endif
+
+    MessageShowView::MessageShowView()
+    {
+        g_pMessageShowView = this;
+    }
+
+    MessageShowView::~MessageShowView()
+    {
+        if (viewInitStatus == true)
+        {
+            DeInitView();
+        }
+        g_pMessageShowView = nullptr;
+    }
+
+    MessageShowView *MessageShowView::GetInstance()
+    {
+        return g_pMessageShowView;
+    }
+    void MessageShowView::DeInitView()
+    {
+        if(scrollView_)
+        {
+            scrollView_->RemoveAll();
+        }
+
+        delete title;
+        title = nullptr;
+
+        delete time;
+        time = nullptr;
+
+        delete messageButton;
+        messageButton = nullptr;
+
+        delete deleteButton;
+        deleteButton = nullptr;
+
+        delete background;
+        background = nullptr;
+
+        delete backgroundtop;
+        backgroundtop = nullptr;
+    }
+
+    void MessageShowView::InitializeLabel(UILabel *label, int posX, int posY, int width, int height, const char *viewId, int fontSize)
+    {
+        label = new UILabel();
+        if (label == nullptr)
+        {
+            return; // 内存分配失败,返回
+        }
+        label->SetPosition(posX, posY);
+        label->Resize(width, height);
+        label->SetViewId(viewId);
+        label->SetFont(DEFAULT_VECTOR_FONT_FILENAME, fontSize);
+        label->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+        label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        label->SetVisible(true);
+    }
+    void MessageShowView::InitializeButton(UILabelButton *&button, int left, int top, int width, int height, const char *viewId)
+    {
+        button = new UILabelButton();
+        if (button == nullptr)
+        {
+            return; // 内存分配失败,返回
+        }
+        button->SetPosition(left, top);
+        button->Resize(width, height);
+        button->SetViewId(viewId);
+        button->SetStyle(STYLE_BACKGROUND_COLOR, DEFAULT_BACKGROUND_COLOR);
+        button->SetStyleForState(STYLE_BACKGROUND_COLOR, DEFAULT_BACKGROUND_COLOR, UIButton::PRESSED);
+        button->SetStyleForState(STYLE_BORDER_COLOR, PRESSED_BORDER_COLOR, UIButton::PRESSED);
+        button->SetVisible(true);
+    }
+    void MessageShowView::UpdateShowConfig()
+    {
+        // 默认配置: 矩形和标签的初始宽度
+        const int maxCharsPerLine = 39;
+        const int baseRectWidth = defaultRectWidth;
+        const int baseLabelWidth = defaultLabelWidth;
+        const int extraRectWidthPerLine = 30;
+        const int extraLabelWidthPerLine = 50;
+
+        // 计算行数
+        int totalChars = messageStr.size();
+        int lines = (totalChars / maxCharsPerLine) + (totalChars % maxCharsPerLine ? 1 : 0);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateShowConfig lines %d", lines);
+
+        // 小于等于2行时,无需更新
+        if (lines <= 2)
+            return;
+
+        // 计算更新后的宽度
+        int additionalLines = lines - 1; // 增加一行预备
+        int updatedRectWidth = baseRectWidth + (additionalLines * extraRectWidthPerLine);
+        int updatedLabelWidth = baseLabelWidth + (additionalLines * extraLabelWidthPerLine);
+
+        // 输出配置结果
+        messageButton->SetPosition(33, 157, 380, updatedRectWidth);
+        deleteButton->SetPosition(43, 157 + updatedRectWidth + 20, 380, 100);
+
+        /*加载空白*/
+        CreateLine(background, 43, deleteButton->GetY() + deleteButton->GetHeight() + 40, 380, 100,
+                   "line");
+        background->SetVisible(false);
+        scrollView_->Add(background);
+
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "updatedRectWidth %d updatedLabelWidth %d lines %d \r\n", updatedRectWidth, updatedLabelWidth, lines);
+    }
+    void MessageShowView::InitView()
+    {
+        /* -------------------------------------------------------------------------- */
+
+        CreateLine(backgroundtop, 0, 0, 100, 60, "line");
+        backgroundtop->SetVisible(false);
+        scrollView_->Add(backgroundtop);
+        
+        title = new UILabel();
+        if (title == nullptr)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "title:: new UILabel fail");
+            return; // 内存分配失败,返回
+        }
+        title->SetPosition(83, 60, 300, 35);
+        title->SetText(titleStr.c_str());
+        title->SetStyle(STYLE_TEXT_FONT, 30);
+        title->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        title->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        title->SetLineBreakMode(UILabel::LINE_BREAK_OSCILLATION); // 来回滚动属性
+        title->SetRollSpeed(23);
+        title->SetVisible(true);
+        /* -------------------------------------------------------------------------- */
+        time = new UILabel();
+        if (time == nullptr)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "time:: new UILabel fail");
+            return; // 内存分配失败,返回
+        }
+        time->SetPosition(73, 104, 320, 33);
+        time->SetViewId("time");
+        time->SetText(timeStr.c_str());
+        time->SetTextColor(Color::Gray());
+        time->SetStyle(STYLE_TEXT_FONT, 28);
+        time->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
+        time->SetLineBreakMode(UILabel::LINE_BREAK_ELLIPSIS);
+        time->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
+        time->SetVisible(true);
+        /* -------------------------------------------------------------------------- */
+        /*初始化消息内容*/
+        InitializeButton(messageButton, 33, 157, 380, defaultRectWidth, "message");
+        messageButton->SetStyle(STYLE_BACKGROUND_COLOR, 0xff191919);
+        messageButton->SetStyle(STYLE_BORDER_RADIUS, 20);
+        messageButton->SetStyle(STYLE_PADDING_LEFT, 15);
+        messageButton->SetTextColor(Color::GetColorFromRGBA(0x99, 0x99, 0x99, 0xff));
+        messageButton->SetAlign(TEXT_ALIGNMENT_LEFT);
+        messageButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        messageButton->SetStyleForState(STYLE_BACKGROUND_COLOR, 0xff000000, UIButton::PRESSED);
+        messageButton->SetStyleForState(STYLE_BORDER_COLOR, 0xff0b1928, UIButton::PRESSED);
+        messageButton->SetStyleForState(STYLE_BORDER_RADIUS, 20, UIButton::PRESSED);
+        messageButton->SetTouchable(false);
+        messageButton->SetText(messageStr.c_str());
+        // messageButton->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
+        /* -------------------------------------------------------------------------- */
+        /*加载清除按键*/
+        InitButtonExt(deleteButton, 43, 157 + defaultRectWidth + 20, 380, 100, DELETEBUTTON, STR_CLEAN, 30);
+        deleteButton->SetOnClickListener(static_cast<UIView::OnClickListener *>(MessageShowPresenter::GetInstance()));
+        /* -------------------------------------------------------------------------- */
+        scrollView_->Add(title);
+        scrollView_->Add(time);
+        scrollView_->Add(messageButton);
+        scrollView_->Add(deleteButton);
+        /* -------------------------------------------------------------------------- */
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "InitView is ok!");
+
+        // UpdateMessage();
+    }
+
+    void MessageShowView::UpdateMessage()
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateMessage");
+        MessageData *data = MessageModel::GetInstance().GetCurrentMessageData();
+        if (data == nullptr)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateMessage is error");
+            return;
+        }
+        titleStr = data->labelTitle;
+        timeStr = data->labelTime;
+        messageStr = data->labelDetails;
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "UpdateMessage title %s time %s message %s", titleStr.c_str(), timeStr.c_str(), messageStr.c_str());
+    }
+    void MessageShowView::PreLoad(void)
+    {
+        if (!viewInitStatus)
+        {
+            UpdateMessage();
+            InitView();
+            viewInitStatus = true;
+        }
+    }
+
+    void MessageShowView::OnStart()
+    {
+        View<MessageShowPresenter>::OnStart();
+
+        scrollView_ = new UIScrollView();
+        if (scrollView_ == nullptr)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "scrollView_ new fail");
+            return;
+        }
+        scrollView_->SetPosition(0, 0);
+        scrollView_->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+        // scrollView_->SetScrollBlankSize(20);
+        // scrollView_->SetReboundSize(50);
+        scrollView_->SetHorizontalScrollState(false); // 设置水平滚动失效
+        scrollView_->SetDirection(1);
+
+        scrollView_->SetOnDragListener(presenter_);
+        scrollView_->SetTouchable(true);
+        scrollView_->SetDraggable(true);
+        // scrollView_->SetStyle(STYLE_BACKGROUND_COLOR, BACK_GROUND_COLOR);
+        scrollView_->SetStyle(STYLE_BACKGROUND_COLOR, Color::Black().full);
+
+        PreLoad();
+
+        UpdateShowConfig();
+
+        AddViewToRootContainer(scrollView_);
+
+        // scrollView_->SetOnKeyActListener(presenter_);
+    }
+   
+}
\ No newline at end of file
diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageView.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/message/src/MessageView.cpp
new file mode 100644 (file)
index 0000000..f433600
--- /dev/null
@@ -0,0 +1,223 @@
+/***
+ * @Date: 2024-07-12 11:19:45
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-08-09 14:03:51
+ * @FilePath:
+ * /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageView.cpp
+ */
+
+#include "message/include/MessageView.h"
+#include "message/include/MessageModel.h"
+#include "message/include/MessagePresenter.h"
+
+#include "UiConfig.h"
+#include "uicomponents/UIComponents.h"
+#include "wearable_log.h"
+namespace OHOS {
+static constexpr char *lineimagePath = "/user/res/message/Line.bin";
+static constexpr char *messageimagePath = "/user/res/message/message.bin";
+static const uint32_t BACK_GROUND_COLOR = 0xfff6f6f6;
+static constexpr int16_t More_LIST_POSITION_X = 43;
+static constexpr int16_t More_LIST_POSITION_Y = 120;
+static constexpr int16_t More_SCROLLBLANKSIZE =
+    35; // 设置此滚动视图的空白大小。
+static constexpr int16 MAX_SCR_DIS = 1000;
+static constexpr int16 LIST_POS = 20;
+static constexpr int16 SNUM_2 = 2;
+static constexpr uint8_t NUM_2 = 2;
+
+static MessageView *g_pMessageView{nullptr};
+
+MessageView::MessageView() { g_pMessageView = this; }
+
+MessageView::~MessageView() {
+  g_pMessageView = nullptr;
+  DeInitView();
+}
+
+MessageView *MessageView::GetInstance() { return g_pMessageView; }
+void MessageView::InitView() {
+  // 展示界面
+  if (MessageModel::GetInstance().HasDataVector()) {
+    // printf("存在数据!\r\n");
+    SetPopupViewStatus(PopupMessage::MessagePopup, true);
+  } else {
+    // printf("不存在数据!\r\n");
+    SetPopupViewStatus(PopupMessage::LackPopup, true);
+  }
+}
+void MessageView::DeInitView() {
+  if (lackView) {
+    lackView->RemoveAll();
+    if (labeltitle) {
+      delete labeltitle;
+      labeltitle = nullptr;
+    }
+    if (labelmeage) {
+      delete labelmeage;
+      labelmeage = nullptr;
+    }
+    if (imageline) {
+      delete imageline;
+      imageline = nullptr;
+    }
+    if (imagemeage) {
+      delete imagemeage;
+      imagemeage = nullptr;
+    }
+    delete lackView;
+    lackView = nullptr;
+  }
+  if (messageView) {
+    messageView->RemoveAll();
+    if (p_MessageListAdapter) {
+      delete p_MessageListAdapter;
+      p_MessageListAdapter = nullptr;
+    }
+    if (MessageList) {
+      delete MessageList;
+      MessageList = nullptr;
+    }
+    if (imageline2) {
+      delete imageline2;
+      imageline2 = nullptr;
+    }
+    delete messageView;
+    messageView = nullptr;
+  }
+}
+
+void MessageView::PreLoad(void) {
+  if (!viewInitStatus) {
+    InitView();
+    viewInitStatus = true;
+  }
+}
+
+/*无数据界面*/
+void MessageView::ShowLackView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowLackView start");
+  if (lackView == nullptr) {
+    lackView = new UIScrollView();
+    if (lackView == nullptr) {
+      return;
+    }
+  }
+  lackView->SetPosition(0, 0);
+  lackView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+  lackView->SetScrollBlankSize(20);
+  lackView->SetReboundSize(50);
+  lackView->SetDirection(1);
+  lackView->SetViewId("lackView");
+
+  /*初始化label*/
+  InitRollLabel(labeltitle, 83, 50, 300, 35, "labletitle",
+                STR_MESSAGE_NOTIFICATION, DEFAULT_VECTOR_FONT_FILENAME, 30);
+  InitRollLabel(labelmeage, 53, 276, 360, 40, "labelMessage", STR_MESSAGENO,
+                DEFAULT_VECTOR_FONT_FILENAME, 30);
+  labelmeage->SetTextColor(Color::GetColorFromRGBA(0x66, 0x66, 0x66, 0xff));
+  /*初始化image*/
+  InitImageView(imageline, 193, 30, 365, 35, "image", lineimagePath);
+  InitImageView(imagemeage, 183, 156, 100, 100, "image", messageimagePath);
+
+  lackView->Add(imageline);
+  lackView->Add(imagemeage);
+  lackView->Add(labeltitle);
+  lackView->Add(labelmeage);
+
+  AddViewToRootContainer(lackView);
+  lackView->SetDraggable(true);
+  lackView->SetTouchable(true);
+
+  lackView->SetOnDragListener(presenter_);
+
+  lackView->SetVisible(false); // 界面隐藏
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowLackView end");
+}
+
+/*数据界面*/
+void MessageView::ShowMessageView() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowmessageView start");
+  if (messageView == nullptr) {
+    messageView = new UIScrollView();
+    if (messageView == nullptr) {
+      return;
+    }
+  }
+  messageView->SetPosition(0, 0);
+  messageView->Resize(VERTICAL_RESOLUTION, HORIZONTAL_RESOLUTION);
+  messageView->SetHorizontalScrollState(false); // 设置横向不可以滚动
+  messageView->SetDirection(0);
+  messageView->SetVerticalScrollState(false); // 禁止垂直滑动
+  messageView->SetViewId("messageView");
+
+  InitImageView(imageline2, 193, 30, 80, 8, "image", lineimagePath);
+  messageView->Add(imageline2);
+
+  // UIList 的适配器
+  if (p_MessageListAdapter == nullptr) {
+    p_MessageListAdapter = new MessageListAdapter();
+  }
+
+  p_MessageListAdapter->SetItemClickListener(presenter_);
+  if (MessageList == nullptr) {
+    MessageList = new UIList();
+  }
+  MessageList->SetPosition(43, 95, HORIZONTAL_RESOLUTION, VERTICAL_RESOLUTION);
+  MessageList->SetScrollStateListener(this);
+  MessageList->SetThrowDrag(true);
+  MessageList->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
+  MessageList->SetMaxScrollDistance(1000);
+  MessageList->SetSwipeACCLevel(200);
+  MessageList->SetDragACCLevel(5);
+  MessageList->SetIntercept(true);
+
+  MessageList->SetOnClickListener(presenter_);
+  messageView->SetOnDragListener(presenter_);
+
+  messageView->Add(MessageList);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "MessageList is add");
+  AddViewToRootContainer(messageView);
+
+  messageView->SetVisible(false); // 隐藏界面
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShowmessageView end");
+}
+
+/*控制显示界面*/
+void MessageView::SetPopupViewStatus(PopupMessage view, bool status) {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetPopupViewStatus %d", view);
+
+  if (view == PopupMessage::LackPopup) {
+    MessageModel::GetInstance().SetPopupViewState(false); // 设置状态为无消息
+    lackView->SetVisible(true);                           // 隐藏界面
+    messageView->SetVisible(false);                       // 隐藏界面
+  } else if (view == PopupMessage::MessagePopup) {
+    MessageModel::GetInstance().SetPopupViewState(true); // 设置状态为有消息
+    lackView->SetVisible(false);                         // 隐藏界面
+    messageView->SetVisible(true);                       // 隐藏界面
+  }
+}
+
+/// @brief 页面启动时需要执行的代码逻辑
+void MessageView::OnStart() {
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartResultView::OnStart");
+  View<MessagePresenter>::OnStart();
+
+  ShowMessageView();
+  ShowLackView();
+  PreLoad();
+
+  if (MessageModel::GetInstance().HasDataVector()) {
+    if (p_MessageListAdapter) {
+      MessageList->SetAdapter(p_MessageListAdapter);
+    }
+  }
+}
+void MessageView::AddMessageToList(const MessageListItem &item) {
+  p_MessageListAdapter->AddListItem(item);
+}
+// 获取列表
+UIList *MessageView::GetList() { return MessageList; }
+/// @brief 创建页面的视图
+
+} // namespace OHOS
\ No newline at end of file