From 1c47cb339cf7cf0f772b71f921dda81ba58e2b36 Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Thu, 10 Oct 2024 11:38:43 +0800 Subject: [PATCH] =?utf8?q?=E6=B6=88=E6=81=AF=EF=BC=9A=E5=A2=9E=E5=8A=A0?= =?utf8?q?=E4=BF=A1=E6=81=AF=E5=A4=9A=E6=AC=A1=E5=8F=91=E9=80=81=E7=9A=84?= =?utf8?q?=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/message/src/MessageModel.cpp | 925 +++++++++--------- 1 file changed, 469 insertions(+), 456 deletions(-) diff --git a/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp index 49e0d4b0f..e8eb16fc4 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageModel.cpp @@ -2,518 +2,531 @@ * @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 -#include -#include -#include -#include -#include +#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 +#include #include #include -#include #include +#include +#include +#include +#include #include -#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 +#include +#include +#include #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(file)), std::istreambuf_iterator()); - 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 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 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(file)), + std::istreambuf_iterator()); + 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 { -- 2.17.1