同步消息更新;信息已完成接口待完善
authorCaisking <3449750381@qq.com>
Thu, 11 Jul 2024 12:53:09 +0000 (20:53 +0800)
committerCaisking <3449750381@qq.com>
Thu, 11 Jul 2024 12:53:09 +0000 (20:53 +0800)
13 files changed:
code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230app/nativeui/message/include/MessageModel.h
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlView.cpp
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp
code/sdk/application/wearable/fd230app/nativeui/message/src/MessagePresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageShowPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageView.cpp
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/broadcast/include/broadcast_feature.h
code/sdk/application/wearable/service/broadcast/src/broadcast_implement.c
code/sdk/application/wearable/service/msg_center/src/msg_center_customer.cpp
code/sdk/application/wearable/service/msg_center/src/notify/message_notification.cpp

index 4506ada..34c0079 100644 (file)
@@ -430,6 +430,8 @@ namespace OHOS
         BluetoothModel::GetInstance()->Init();
         TraingModel::GetInstance()->Init();     // 训练消息订阅
         TakephotosModel::GetInstance()->Init(); // 拍照消息订阅
+        MessageModel::GetInstance().Init();     // 消息订阅监听
+
         // 初始化默认首页
         ScreenModels::GetInstance()->PreLoadAppimages();
         // NativeAbility::GetInstance().SetDefaultSliceId(VIEW_MAIN);
index 6ccd7f1..0d08b65 100644 (file)
@@ -1,27 +1,4 @@
-/*** 
- * @Date: 2024-06-29 18:03:40
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-10 21:34:39
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageModel.h
- */
-/***
- * @Date: 2024-06-29 18:03:40
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-10 17:18:42
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageModel.h
- */
-/***
- * @Date: 2024-06-21 09:56:18
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-07-08 09:22:12
- * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageModel.h
- */
-/***
- * @Date: 2024-04-15 10:55:58
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-06-20 10:02:36
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/include/MessageModel.h
- */
+
 #ifndef MESSAGE_MODEL_H
 #define MESSAGE_MODEL_H
 
@@ -33,6 +10,8 @@
 #include "UiConfig.h"
 #include "MessagePresenter.h"
 #include "message/include/MessageAdapter.h"
+#include "bletest.h"
+#include <vector>
 
 namespace OHOS
 {
@@ -50,43 +29,59 @@ namespace OHOS
     class MessageModel
     {
     public:
+        MessageModel();
+        ~MessageModel();
+        void Init();
+
         static MessageModel &GetInstance();
         void InitMessageListItems();                        // 初始化消息列表项
         const MessageListItem *GetMessageListItems() const; // 获取消息列表项
-        // uint8_t GetMessageListCount() 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();                               // 判断数组是否存在数据
 
-        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();                                   // 获取最新信息项
-        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数据
     private:
-        MessageModel();
-        MessageModel(const MessageModel &);
         MessageModel &operator=(const MessageModel &);
-        virtual ~MessageModel();
 
-        uint8_t numberOfItems;                                                                 // 项数
+        uint16_t numberOfItems;                                                                // 项数
         static const uint16_t MaxMessageListCount = 10;                                        // 消息列表最大数量
         MessageListItem Messages[MaxMessageListCount] = {0, false, nullptr, nullptr, nullptr}; // 消息列表
-        uint8_t indexCurrent;                                                                  // 选择的项
-        std::map<int, std::string> fileIndexMap;
+        uint8_t currentIndex_;                                                                 // 选择的项
+        std::vector<MessageData> MessageVector;
 
-        bool jsonDataExists{false}; // Json数据存在标志
-        bool popupViewState{false}; // 弹出视图状态
+        bool popupViewState_{false}; // 弹出视图状态
     };
 }
 
-#endif
\ No newline at end of file
+#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
index 9579665..73a9063 100644 (file)
@@ -1,3 +1,9 @@
+/***
+ * @Date: 2024-06-22 11:36:16
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-11 19:17:25
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp
+ */
 /***
  * @Date: 2024-06-22 11:36:16
  * @LastEditors: Caisking 3449750381@qq.com
@@ -38,7 +44,7 @@ namespace OHOS
             return false;
         }
 
-        if (!MessageModel::GetInstance().GetJsonLoadStatus())
+        if (!MessageModel::GetInstance().HasDataVector())
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Json data not loaded.");
             return false;
@@ -46,7 +52,7 @@ namespace OHOS
         if (strcmp(view.GetViewId(), DELETEALLDATA) == 0)
         {
             // 执行全部删除操作
-            MessageModel::GetInstance().ClearAllData();
+            MessageModel::GetInstance().ClearAllMessages();
             NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
             return true;
         }
@@ -60,32 +66,8 @@ namespace OHOS
         MessageCardView::GetInstance()->GetList()->GetViewIndex();
         int index = p_MessageItemView->GetMessageListIndex();
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "index is %d", index);
-        // 读取json数据
-        std::vector<MessageData> messageDataVector = MessageModel::GetInstance().LoadMessageData();
-
-        if (messageDataVector.empty())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: messageDataVector is empty");
-            return false;
-        }
-
-        if (index < 0)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Invalid index (index < 0)");
-            return false;
-        }
-
-        if (index >= messageDataVector.size())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Invalid index (index out of range)");
-            return false;
-        }
-
-        int arraynum = messageDataVector.size() - 1;
-        MessageData &messageData = messageDataVector[arraynum - index];
 
-        MessageModel::GetInstance().SetCurrentMessageData(&messageData);
-        MessageModel::GetInstance().SetCurrentIndex(arraynum - index);
+        MessageModel::GetInstance().SetCurrentIndex(index);
         // 切换到详情界面
         NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE_SHOW);
 
index 4dd68ba..336a09d 100644 (file)
@@ -77,7 +77,7 @@ namespace OHOS
         }
         Add(messageCardView);
         Add(messageLackView);
-        uint8_t status = MessageModel::GetInstance().HasDataJson();
+        uint8_t status = MessageModel::GetInstance().HasDataVector();
         if (status == 0)
         {
             messageCardView->SetVisible(false);
index d4e43c3..77b04e4 100644 (file)
@@ -4,14 +4,6 @@
  * @LastEditTime: 2024-06-22 15:32:37
  * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp
  */
-/*
- * @Author: Caisking 3449750381@qq.com
- * @Date: 2024-01-29 19:58:37
- * @LastEditors: Caisking 3449750381@qq.com
- * @LastEditTime: 2024-06-14 19:15:15
- * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp
- * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
- */
 
 #include "message/include/MessageModel.h"
 #include "common/image_cache_manager.h"
 #include <dirent.h>
 #include <map>
 #include <filesystem>
+#include <service/graphic_service.h>
+#include "thread_adapter.h"
+#include "broadcast_feature.h"
+#include "broadcast_service.h"
 
 #define MESSAGE_JSON_FILE "user/userdata/message/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);
+
+#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 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)
+        {
+            ancs_data_info_t *messageInfo = new ancs_data_info_t();
+            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; // 释放内存
+
+            // 发送信息进行弹窗
+            CustomEventPublish(TOPIC_EVENT_MESSAGENOTE, NULL, 0);
+        }
+    }
+#ifdef __cplusplus
+}
+#endif
+
 namespace OHOS
 {
-    MessageData message_;
     MessageModel::MessageModel()
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageModel");
-        HasDataJson(); // 更新json状态
     }
-
-    MessageModel::~MessageModel() {}
-
+    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()
+    {
+        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;
+        }
+
+        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);
+
+            cJSON *isRead = cJSON_GetObjectItem(item, "isRead");
+            cJSON *labelDetails = cJSON_GetObjectItem(item, "labelDetails");
+            cJSON *labelTitle = cJSON_GetObjectItem(item, "labelTitle");
+            cJSON *timestamp = cJSON_GetObjectItem(item, "timestamp");
+
+            MessageData data;
+            data.isRead = cJSON_IsTrue(isRead) ? true : false;
+            data.labelDetails = labelDetails->valuestring;
+            data.labelTitle = labelTitle->valuestring;
+            data.timestamp = timestamp->valuedouble;
+
+            MessageVector.push_back(data);
+        }
+
+        cJSON_Delete(root);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Messages loaded from storage successfully");
+        return true;
+    }
+
+    // 保存Message文件
+    bool MessageModel::SaveMessagesToStorage()
+    {
+        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);
+        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()
+    {
+        // 读取数组数据
+        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;
+                // 获取是否读取 来信 信息内容 时间
+                Messages[count] = {count, messageData.isRead, messageData.labelTitle, messageData.labelDetails, messageData.labelTime};
+            }
+        }
+    }
+    // 设置当前项[数组下标]
+    void MessageModel::SetCurrentIndex(uint8_t index)
+    {
+        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 data;
+        data.isRead = messageInfo->read;
+        data.labelDetails = messageInfo->msg;
+        data.labelTitle = messageInfo->title;
+        data.timestamp = messageInfo->time;
+
+        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");
+    }
+
+    // 获取目前的项
+    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()
+    {
+        return !MessageVector.empty();
+    }
+
+    // 设置弹窗状态
+    void MessageModel::SetPopupViewState(bool state)
+    {
+        popupViewState_ = state;
+    }
+
+    // 获取弹窗状态
+    bool MessageModel::GetPopupViewState()
+    {
+        return popupViewState_;
+    }
+
+}
+
+#if 0
+ uint8_t MessageModel::GetMessageCount() const
     {
         return (numberOfItems != 0 ? numberOfItems : MaxMessageListCount);
     }
@@ -187,6 +516,7 @@ namespace OHOS
                     // 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());
                     }
@@ -233,7 +563,7 @@ namespace OHOS
         }
 
         // 4.文件名排序
-        std::sort(filenames.begin(), filenames.end());
+        // std::sort(filenames.begin(), filenames.end());
 
         // 5.文件数量超出限制删除多余文件
         DeleteExcessFiles(filenames); // 删除多余文件
@@ -241,7 +571,7 @@ namespace OHOS
         // 6.解析json
         for (int i = 0; i < filenames.size(); i++)
         {
-            std::ifstream file((MESSAGE_JSON_DIR + filenames[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());
@@ -313,6 +643,7 @@ namespace OHOS
             }
         }
     }
+
     const MessageListItem *MessageModel::GetMessageListItems() const
     {
         return Messages;
@@ -328,11 +659,13 @@ namespace OHOS
     {
         popupViewState = state;
     }
+
     // 获取当前界面 0:没有记录 | 1:有记录
     bool MessageModel::GetPopupViewState()
     {
         return popupViewState;
     }
+
     /*保存json数据*/
     void MessageModel::SaveMessageData(const MessageData data, const int index)
     {
@@ -359,12 +692,14 @@ namespace OHOS
             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)
     {
@@ -377,60 +712,146 @@ namespace OHOS
             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());
+        }
 
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ClearAllData is ok");
-        return true;
+        // 清空fileIndexMap
+        fileIndexMap.clear();
 
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ClearAllData is fail");
-        return false;
+        return true; // 表示清除操作成功
     }
+
     // 删除单个项 [通过 map 删除]
     bool MessageModel::DeleteSingleItem(int currentIndex)
     {
-        if (currentIndex < 0 || currentIndex >= fileIndexMap.size())
+        if (currentIndex < 0)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid index for deletion");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Invalid index for deletion: Index is less than 0");
             return false;
         }
 
-        uapi_delete_files(fileIndexMap[currentIndex].c_str());
+        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);
 
-        fileIndexMap.erase(currentIndex);
         return true;
     }
     // 设置当前项已读
     bool MessageModel::SetMessageIsread()
     {
-        // 保存更新后的消息数据
-        std::vector<MessageData> messageVector = LoadMessageData();
-        if (!messageVector.empty())
+        // 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())
         {
-            messageVector[GetCurrentIndex()].isRead = true;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "jsonData is null");
+            return false;
+        }
 
-            // SaveMessageData(messageVector);
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Message marked as read and data saved");
-            return true;
+        // 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, "Failed to mark message as read and save data");
+            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()
+    MessageData *MessageModel::GetNewestData(int index)
     {
-        std::vector<MessageData> messageVector = LoadMessageData();
-        numberOfItems = messageVector.size();
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "the numberOfItems is %d", numberOfItems);
-        if (numberOfItems > 0)
+        // 打开文件
+        std::string filename = MESSAGE_JSON_DIR + std::to_string(index) + ".json";
+        std::ifstream file(filename);
+        if (!file.is_open())
         {
-            return &messageVector[numberOfItems - 1];
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Failed to open file");
+            return nullptr;
         }
-        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)
@@ -442,4 +863,4 @@ namespace OHOS
     {
         return indexCurrent;
     }
-}
+#endif
\ No newline at end of file
index 73938a2..aa5ff07 100644 (file)
@@ -113,7 +113,7 @@ namespace OHOS
             if (strcmp(view.GetViewId(), DELETEALLDATA) == 0)
             {
                 // 执行全部删除操作
-                // MessageModel::GetInstance().ClearAllData();
+                MessageModel::GetInstance().ClearAllMessages();
                 NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
                 return true;
             }
@@ -128,33 +128,9 @@ namespace OHOS
 
             int index = p_MessageItemView->GetMessageListIndex();
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "index is %d", index);
-            // 读取json数据
-            std::vector<MessageData> messageDataVector = MessageModel::GetInstance().LoadMessageData();
 
-            if (messageDataVector.empty())
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: messageDataVector is empty");
-                return false;
-            }
-
-            if (index < 0)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Invalid index (index < 0)");
-                return false;
-            }
-
-            if (index >= messageDataVector.size())
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Invalid index (index out of range)");
-                return false;
-            }
-
-            int arraynum = messageDataVector.size() - 1;
-            MessageData &messageData = messageDataVector[arraynum - index];
-
-            MessageModel::GetInstance().SetCurrentMessageData(&messageData);
-            MessageModel::GetInstance().SetCurrentIndex(arraynum - index);
-            // MessageModel::GetInstance().SetMessageIsread();
+            MessageModel::GetInstance().SetCurrentIndex(index);
+            MessageModel::GetInstance().SetMessageAsRead();
             // 切换到详情界面
             NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE_SHOW);
 
index 0596b6f..ab9eeb2 100644 (file)
@@ -1,3 +1,9 @@
+/*** 
+ * @Date: 2024-06-17 19:39:36
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-07-11 18:59:45
+ * @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageShowPresenter.cpp
+ */
 /***
  * @Date: 2024-06-17 19:39:36
  * @LastEditors: Caisking 3449750381@qq.com
@@ -84,8 +90,7 @@ namespace OHOS
         if (strcmp(view.GetViewId(), DELETEBUTTON) == 0)
         {
             // 删除当前项
-            uint8_t index = MessageModel::GetInstance().GetCurrentIndex();
-            MessageModel::GetInstance().DeleteSingleItem(index);
+            MessageModel::GetInstance().DeleteCurrentMessage();
 
             NativeAbility::GetInstance().ChangeSlice(VIEW_MESSAGE);
         }
index 729e8da..3c215a3 100644 (file)
@@ -43,10 +43,8 @@ namespace OHOS
     }
     void MessageView::InitView()
     {
-        // 刷新一下文件状态
-        MessageModel::GetInstance().HasDataJson();
         // 展示界面
-        if (MessageModel::GetInstance().GetJsonLoadStatus())
+        if (MessageModel::GetInstance().HasDataVector())
         {
             printf("存在数据!\r\n");
             SetPopupViewStatus(PopupMessage::MessagePopup, true);
@@ -292,7 +290,7 @@ namespace OHOS
     void MessageView::OnSetUpView()
     {
         View<MessagePresenter>::OnSetUpView();
-        if (MessageModel::GetInstance().GetJsonLoadStatus())
+        if (MessageModel::GetInstance().HasDataVector())
         {
             messageView->Add(MessageList);
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "MessageList is add");
index 46472a8..fa33477 100644 (file)
@@ -5082,24 +5082,27 @@ char *get_message_dir_path(void)//获取信息的文件夹路径
 void* message_data(int uid,int appid,char  *title,char  *msg,int hasCode)\r
 {\r
 \r
-    uint32_t timeBuf = 0;\r
-    if (uapi_get_timestampe_ss(&timeBuf) != ERRCODE_SUCC)\r
+    uint32_t timestampe = 0;\r
+    if (uapi_get_timestampe_ss(&timestampe) != ERRCODE_SUCC)\r
     {\r
-        timeBuf = 0;\r
+        timestampe = 0;\r
     }\r
     ancs_data_info_t *data= (ancs_data_info_t *)malloc(sizeof(ancs_data_info_t));\r
     if(data==NULL)\r
     return NULL;\r
+    memset_s(data,sizeof(ancs_data_info_t),0,sizeof(ancs_data_info_t));\r
 \r
     data->appid=appid;\r
     memcpy_s(data->title,TITLE_BUF_LEN+1,title,strlen(title));\r
-    memcpy_s(data->msg,TITLE_BUF_LEN+1,title,strlen(msg));\r
+    memcpy_s(data->msg,MSG_BUF_LEN+1,msg,strlen(msg));\r
     data->uid=uid;\r
-    data->time=timeBuf;\r
+    data->time=timestampe;\r
     data->read=0;\r
     data->hasCode=hasCode;\r
 \r
+    printf("messagedata make ok\r\n");\r
     return data;\r
+\r
     //read_message_data();\r
 }\r
 int uft8_check(char *chinese_string,int length)\r
@@ -5132,8 +5135,8 @@ int uft8_check(char *chinese_string,int length)
     }\r
     return i;\r
 }\r
-static void* ancs_msg_data =NULL;\r
 \r
+ void* ancs_msg_data =NULL;\r
 \r
 //安卓消息接收解析数据 //ANCS 2AE1\r
 uint8_t jscheck_ancs(uint8_t *data)\r
@@ -5206,13 +5209,17 @@ uint8_t jscheck_ancs(uint8_t *data)
         hasCode_t = hasCode->valueint;\r
     }\r
     cJSON_Delete(root);\r
-    if(ancs_msg_data!=NULL)\r
-    {\r
-        free(ancs_msg_data);\r
-        ancs_msg_data=NULL;\r
-    }\r
-    ancs_msg_data= message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t);\r
-    \r
+\r
+    // if(ancs_msg_data!=NULL)\r
+    // {\r
+    //     free(ancs_msg_data);\r
+    //     ancs_msg_data=NULL;\r
+    // }\r
+\r
+    printf("send message\r\n");\r
+    ancs_msg_data = message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t);\r
+    printf("send message ok\r\n");\r
+\r
     if(titleBuf != NULL){\r
         ym_free(titleBuf);\r
         titleBuf = NULL;\r
@@ -5256,7 +5263,7 @@ void ancsDataShowCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,
 \r
 void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void *data)\r
 {\r
-    CustomEventPublish(TOPIC_EVENT_MESSAGENOTE,(uint8_t*)data,sizeof(ancs_data_info_t));\r
+    CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA,(uint8_t*)data,sizeof(ancs_data_info_t));\r
     if(data)\r
     {\r
         free(data);\r
index 9a0fc10..1fdfd52 100644 (file)
@@ -90,6 +90,7 @@ typedef enum {
     TOPIC_EVENT_CANCEL_FIND_WATCH,//取消查找
     TOPIC_EVENT_DRINKREMINDER,//喝水提醒
     TOPIC_EVENT_MESSAGENOTE, //消息通知
+    TOPIC_EVENT_MESSAGE_UPDATA, //消息更新通知
     TOPIC_EVENT_SLEEPNOTE, //睡眠通知
     TOPIC_END_NUM = 20000,
 } TopicNum;
index 56f2665..d39d907 100644 (file)
@@ -68,6 +68,7 @@ static const TopicToCore topicToCoreArray[] = {
     {TOPIC_EVENT_CANCEL_FIND_WATCH,A_CORE_MASK, 1},
     {TOPIC_EVENT_DRINKREMINDER,A_CORE_MASK, 1},
     {TOPIC_EVENT_MESSAGENOTE,A_CORE_MASK, 1},
+    {TOPIC_EVENT_MESSAGE_UPDATA,A_CORE_MASK, 1},
     {TOPIC_EVENT_SLEEPNOTE,A_CORE_MASK, 1},
 #ifdef SUPPORT_CAT1_MODEM
     {TOPIC_EVENT_CAT1_INCOMMING, A_CORE_MASK, 1},
index 3c26e1e..0e39d77 100644 (file)
@@ -111,6 +111,7 @@ const PriorityMapper PRI_MAPPER[] = {
     {TOPIC_EVENT_CANCEL_FIND_WATCH,PRIORITY_TWO},// 取消找手表 [2]
     {TOPIC_EVENT_DRINKREMINDER,PRIORITY_THREE},//喝水提醒 [3]
     {TOPIC_EVENT_MESSAGENOTE,PRIORITY_THREE},//消息提醒 [3]
+    {TOPIC_EVENT_MESSAGE_UPDATA,PRIORITY_TWO},//消息更新提醒 [3]
     {TOPIC_EVENT_SLEEPNOTE,PRIORITY_THREE},//睡眠弹窗 [3]
 };
 
@@ -645,7 +646,7 @@ void MsgCenterNotifyMessageProc(const Topic topic, Request* req)
         display_api->turn_on_screen();  
     }  
     display_api->set_screen_set_keepon_timeout(1000*5);
-    NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
+    // NotificationManager::GetInstance()->SetNotifyPriority(PRIORITY_TWO);
     NotificationManager::GetInstance()->ShowNotify(showMessageNotify, (uint16_t)topic, true);
 }
 
index 9558a1c..b5d24a6 100644 (file)
@@ -95,7 +95,7 @@ namespace OHOS
         MessageGroupView->SetOnDragListener(dragListener);
 #ifdef FD230
         /*获取最新message*/
-        MessageData *data = MessageModel::GetInstance().GetNewestData();
+        MessageData *data = MessageModel::GetInstance().GetNewMessage();
         if (data != nullptr)
         {
             titleStr = data->labelTitle;