* @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
{