消息:增加信息多次发送的控制 1139/2 1139/head 1140/target/1 1141/target/1 1142/target/1
authorCaisking <3449750381@qq.com>
Thu, 10 Oct 2024 03:38:43 +0000 (11:38 +0800)
committerCaisking <3449750381@qq.com>
Thu, 10 Oct 2024 03:38:43 +0000 (11:38 +0800)
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp

index 49e0d4b..e8eb16f 100644 (file)
  * @Date: 2024-06-21 09:56:18
  * @LastEditors: luozheng 1732036298@qq.com
  * @LastEditTime: 2024-10-09 14:53:41
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp
+ * @FilePath:
+ * /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp
  */
 
 #include "message/include/MessageModel.h"
-#include "common/image_cache_manager.h"
+#include "AppViewIDs.h"
+#include "ConfigModel.h"
+#include "MainModel.h"
+#include "MainViewSample.h"
+#include "NativeAbility.h"
 #include "UiConfig.h"
-#include "ui_resource_image.h"
-#include "samgr_lite.h"
-#include <vector>
-#include <sstream>
-#include <iomanip>
-#include <fstream>
-#include <iostream>
-#include <string>
+#include "bleANCS.h"
+#include "broadcast_feature.h"
+#include "broadcast_service.h"
 #include "cJSON.h"
-#include "wearable_log.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 <map>
 #include <filesystem>
+#include <fstream>
+#include <iomanip>
+#include <iostream>
+#include <map>
 #include <service/graphic_service.h>
-#include "thread_adapter.h"
-#include "broadcast_feature.h"
-#include "broadcast_service.h"
-#include "bleANCS.h"
-#include "AppViewIDs.h"
-#include "NativeAbility.h"
-#include "MainModel.h"
-#include "ConfigModel.h"
-#include "MainViewSample.h"
-#include "custom_runtime.h"
+#include <sstream>
+#include <string>
+#include <thread>
+#include <vector>
 
 #include "message/include/MessageCardView.h"
-#include "message/include/MessageView.h"
 #include "message/include/MessageControlView.h"
+#include "message/include/MessageView.h"
 
 #define MESSAGE_JSON_FILE "user/userdata/ancs.json"
 #define MESSAGE_JSON_DIR "user/userdata/message/"
 #define PRINTFDATA 0
 
-extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time, char date_separator, char time_separator, date_format_t format);
+extern "C" errcode_t uapi_get_TIME_STR(uint32_t time, char *p_time,
+                                       char date_separator, char time_separator,
+                                       date_format_t format);
 
 #ifdef __cplusplus
-extern "C"
-{
+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 void Notify(void *args, const Topic topic, Request *request)
-    {
-        UNUSED(args);
-        UNUSED(topic);
-        if (request == NULL)
-        {
-            return;
-        }
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "request %d\r\n", request->msgId);
-        if (request->msgId == TOPIC_EVENT_MESSAGE_UPDATA)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TOPIC_EVENT_MESSAGE_UPDATA");
-            ancs_data_info_t *messageInfo = new ancs_data_info_t();
-            if(messageInfo == NULL)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new ancs_data_info_t fail");
-                return;
-            }
-            int rets = memcpy_s(messageInfo, sizeof(ancs_data_info_t), (ancs_data_info_t *)request->data, request->len);
-            if (rets != EOK)
-            {
-                delete messageInfo; // 处理内存分配失败的情况
-                messageInfo = NULL;
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "memcpy_s ancs_data_info_t fail ret = %d", rets);
-                return;
-            }
-            MessageModel::GetInstance().AddMessageData(messageInfo);
-            delete messageInfo; // 释放内存
-
-            // 发送信息进行弹窗 
-            if(uapi_dev_runtime_get_train_status()||uapi_dev_runtime_get_saveele_status()|| uapi_dev_runtime_get_respiratory_training_status())
-            {
-              //增加训练模式下,不弹窗
-              //省电模式,不弹窗
-              //呼吸训练,不弹窗
-                return;
-            }
-            CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0);
-        }
-    }
-
-    void saveancsdata()
-    {
-        printf("saveancs\r\n");
-        OHOS::MessageModel::GetInstance().SaveMessagesToStorage();
-        return;
-    }
-
-#ifdef __cplusplus
+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);
 }
-#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 ::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;
-        }
+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);
+}
 
-        char *jsonData = cJSON_Print(root);
-        file << jsonData << std::endl;
-        file.close();
-        cJSON_free(jsonData);
-        cJSON_Delete(root);
+// 存储消息更新的定时器
+static std::chrono::milliseconds updateDelay(1000); // 设置更新延迟,1s
+static std::chrono::steady_clock::time_point lastUpdateTime;
+static bool shouldDisplayMessage = false;
+static ancs_data_info_t *lastMessageInfo = NULL;
+static std::mutex messageMutex; // 互斥锁
 
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Messages saved to storage successfully");
-        return true;
-    }
-    // 初始化列表
-    void MessageModel::InitMessageListItems()
-    {
-        bool unread_state = false;            // 初始化未读状态
-        numberOfItems = MessageVector.size(); // 获取 MessageVector 的大小
+static void Notify(void *args, const Topic topic, Request *request) {
+  UNUSED(args);
+  UNUSED(topic);
 
-        WEARABLE_LOGE(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 (request == NULL) {
+    return;
+  }
 
-            // 检查消息是否已读
-            if (!msg.isRead)
-                unread_state = true;
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "request %d\r\n", request->msgId);
 
-            // 填充 Messages 数组
-            Messages[count] = {count, msg.isRead, msg.labelTitle, msg.labelDetails, msg.labelTime};
-        }
+  if (request->msgId == TOPIC_EVENT_MESSAGE_UPDATA) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "TOPIC_EVENT_MESSAGE_UPDATA");
 
-        // 更新未读状态
-        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;
+    // 创建新的消息信息
+    ancs_data_info_t *messageInfo = new ancs_data_info_t();
+    if (messageInfo == NULL) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "new ancs_data_info_t fail");
+      return;
     }
 
-    // 获取当前项[数组下标]
-    uint8_t MessageModel::GetCurrentIndex()
-    {
-        return currentIndex_;
+    // 复制请求数据到新的消息信息
+    int rets = memcpy_s(messageInfo, sizeof(ancs_data_info_t),
+                        (ancs_data_info_t *)request->data, request->len);
+    if (rets != EOK) {
+      delete messageInfo;
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "memcpy_s ancs_data_info_t fail ret = %d", rets);
+      return;
     }
 
-    // 增加消息项[添加数组项]
-    void MessageModel::AddMessageData(ancs_data_info_t *messageInfo)
-    {
-        if (messageInfo == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo is null");
-            return;
-        }
+    // 更新到模型里面的数组
+    MessageModel::GetInstance().AddMessageData(messageInfo);
 
-        MessageData data;
-        data.isRead = messageInfo->read;
-        data.labelDetails = messageInfo->msg;
-        data.labelTitle = messageInfo->title;
-        data.timestamp = messageInfo->time;
+    // 加锁以保护共享变量
+    std::lock_guard<std::mutex> lock(messageMutex);
 
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AddMessageData data.isRead is %d,data.labelDetails is %s,data.labelTitle is %s,data.timestamp is %d", data.isRead, data.labelDetails.c_str(), data.labelTitle.c_str(), data.timestamp);
+    // 更新最后一条消息信息
+    if (lastMessageInfo != NULL) {
+      delete lastMessageInfo; // 释放之前保存的消息信息
+    }
+    lastMessageInfo = messageInfo; // 保存新的消息信息
+    shouldDisplayMessage = true;   // 标记需要显示新消息
 
-        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);
-        }
+    // 设置最后更新时间
+    lastUpdateTime = std::chrono::steady_clock::now();
+  }
 
-        // 添加数据
-        MessageVector.push_back(data);
+  // 检查是否需要显示新消息
+  {
+    std::lock_guard<std::mutex> lock(messageMutex); // 加锁以保护共享变量
 
-        // 删除多余的数据
-        while (MessageVector.size() > MaxMessageListCount)
-        {
-            MessageVector.erase(MessageVector.begin());
+    if (shouldDisplayMessage) {
+      // 检查是否达到延迟时间
+      auto now = std::chrono::steady_clock::now();
+      if (now - lastUpdateTime >= updateDelay) {
+        // 发送信息进行弹窗
+        if (uapi_dev_runtime_get_train_status() ||
+            uapi_dev_runtime_get_saveele_status() ||
+            uapi_dev_runtime_get_respiratory_training_status()) {
+          // 增加训练模式下,不弹窗
+          // 省电模式,不弹窗
+          // 呼吸训练,不弹窗
+          return;
         }
 
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo add is ok");
-    }
+        // 发送弹窗通知 会自动查询到数组的最新一个
+        CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0);
 
-    // 获取目前的项
-    MessageData *MessageModel::GetCurrentMessageData()
-    {
-        if (currentIndex_ < MessageVector.size())
-        {
-            return &MessageVector[currentIndex_];
-        }
-        return nullptr;
+        // 发送完毕,重置标志
+        shouldDisplayMessage = false; // 重置状态
+      }
     }
+  }
+}
 
-    // 设置当前项已读
-    bool MessageModel::SetMessageAsRead()
-    {
-        if (currentIndex_ < MessageVector.size())
-        {
-            MessageVector[currentIndex_].isRead = true;
-            return true;
-        }
-        return false;
-    }
+void saveancsdata() {
+  printf("saveancs\r\n");
+  OHOS::MessageModel::GetInstance().SaveMessagesToStorage();
+  return;
+}
 
-    // 删除当前项[删除数组的当前项]
-    bool MessageModel::DeleteCurrentMessage()
-    {
-        if (currentIndex_ < MessageVector.size())
-        {
-            MessageVector.erase(MessageVector.begin() + currentIndex_);
-            return true;
-        }
-        return false;
-    }
+#ifdef __cplusplus
+}
+#endif
 
-    // 删除所有数据[清空数组]
-    bool MessageModel::ClearAllMessages()
-    {
-        MessageVector.clear();
-        return true;
-    }
+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 ::Init() {
+  MessageSubscribeTopic(TOPIC_EVENT_MESSAGE_UPDATA); // 进行消息订阅
+}
+// 获取消息列表项
+const MessageListItem *MessageModel::GetMessageListItems() const {
+  return Messages;
+}
 
-    // 获取最新信息[数组的最后一个]
-    MessageData *MessageModel::GetNewMessage()
-    {
-        if (!MessageVector.empty())
-        {
-            return &MessageVector.back();
-        }
-        return nullptr;
-    }
-    // 判断数组是否存在数据
-    bool MessageModel::HasDataVector()
-    {
-        // 检查 MessageVector 是否为空
-        bool hasData = !MessageVector.empty();
+// 获取消息数量
+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_LOGE(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;
+}
 
-        // 如果没有数据,更新未读状态为 false
-        if (!hasData)
-        {
-            ConfigModel::GetInstance()->set_condigData_Bool(ConfigModel::CONFIGMODEL_ITEM_MESSAGE_UNREAD, false);
-        }
+// 获取当前项[数组下标]
+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 data;
+  data.isRead = messageInfo->read;
+  data.labelDetails = messageInfo->msg;
+  data.labelTitle = 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 %d",
+                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 = std::string("--");
+  } else {
+    data.labelTime = std::string(labelTime);
+  }
+
+  // 添加数据
+  MessageVector.push_back(data);
+
+  // 删除多余的数据
+  while (MessageVector.size() > MaxMessageListCount) {
+    MessageVector.erase(MessageVector.begin());
+  }
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "messageInfo add is ok");
+}
 
-        return hasData; // 返回是否有数据
-    }
+// 获取目前的项
+MessageData *MessageModel::GetCurrentMessageData() {
+  if (currentIndex_ < MessageVector.size()) {
+    return &MessageVector[currentIndex_];
+  }
+  return nullptr;
+}
 
-    // 设置弹窗状态
-    void MessageModel::SetPopupViewState(bool state)
-    {
-        popupViewState_ = state;
-    }
+// 设置当前项已读
+bool MessageModel::SetMessageAsRead() {
+  if (currentIndex_ < MessageVector.size()) {
+    MessageVector[currentIndex_].isRead = true;
+    return true;
+  }
+  return false;
+}
 
-    // 获取弹窗状态
-    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);
+// 删除当前项[删除数组的当前项]
+bool MessageModel::DeleteCurrentMessage() {
+  if (currentIndex_ < MessageVector.size()) {
+    MessageVector.erase(MessageVector.begin() + currentIndex_);
+    return true;
+  }
+  return false;
+}
 
-            NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
-            return;
-        }
+// 删除所有数据[清空数组]
+bool MessageModel::ClearAllMessages() {
+  MessageVector.clear();
+  return true;
+}
 
-        // 更新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");
-        }
-    }
+// 获取最新信息[数组的最后一个]
+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
     {