Merge #373 into sdk602patch0521 from refs/changes/373/head
author袁清梦 <3449750381@qq.com>
Tue, 25 Jun 2024 00:09:17 +0000 (00:09 +0000)
committersnickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Tue, 25 Jun 2024 00:09:17 +0000 (00:09 +0000)
Code review from 袁清梦

* refs/changes/373/head: (6 commits squashed)

  - 修复applist第一次获取样式

  - 消息增加删除按键

  - 更新英文语言文件

  - 修复en语言文件的多余分隔符

  - AI语言修改多国语言

  - 优化心率血氧存储以及显示

Signed-off-by: Caisking <3449750381@qq.com>
Reviewed-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
Merged-by: snickersun@163.com <accounts_62b90f7fcf51ade33b6f628e@mail.teambition.com>
link: https://codeup.aliyun.com/64191456b9581d62e8f81ac0/FD230/change/373
22 files changed:
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodCheckView.cpp
code/sdk/application/wearable/fd230app/nativeui/bloodoxygen/src/BloodOxygenModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/defult_health.json
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.cpp
code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/include/HeartModel.h
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartModel.cpp
code/sdk/application/wearable/fd230app/nativeui/heartrate/src/HeartView.cpp
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/input_list_en.txt
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/input_list_zh.txt
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/language_en.xml
code/sdk/application/wearable/fd230app/nativeui/language/Language_xml/language_zh.xml
code/sdk/application/wearable/fd230app/nativeui/language/font/en.lang
code/sdk/application/wearable/fd230app/nativeui/language/font/zh.lang
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageCardView.cpp
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/message/src/MessageItemView.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/MessageView.cpp
code/sdk/application/wearable/fd230app/nativeui/themestyle/src/ThemeStyleModel.cpp
code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang

index 6588368..05ea9a9 100644 (file)
@@ -105,9 +105,9 @@ namespace OHOS
         titleLabel->SetStyle(STYLE_TEXT_FONT, 28);
         // titleLabel->SetText("正在检测");
         titleLabel->SetTextId(STR_CHECKON);
-        titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_ADAPT);
+        titleLabel->SetLineBreakMode(UILabel::LINE_BREAK_MARQUEE);
         titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        titleLabel->SetRollSpeed(0);
+        titleLabel->SetRollSpeed(30);
         titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 28);
         BloodCheckScrollView->Add(titleLabel);
         /* -------------------------------------------------------------------------- */
index 5194cfe..1dcf25f 100644 (file)
@@ -17,11 +17,18 @@ namespace OHOS
      */
     BloodOxygenModel::BloodOxygenModel() : OxygenView(false), BandoffView(false), CheckView(false), ResultView(false), CheckStatus(false), wearStatus(true)
     {
-        BloodOxygenData *data = new BloodOxygenData;
-        data = HealthService::GetInstance()->ReadBloodOxygenData();
-        SPO2_ = data->SPO2;
-        timestamp_ms = data->timestamp;
-        delete data;
+        BloodOxygenData *data = HealthService::GetInstance()->ReadBloodOxygenData();
+        if (data)
+        {
+            SPO2_ = data->SPO2;
+            timestamp_ms = data->timestamp;
+            delete data;
+        }
+        else
+        {
+            SPO2_ = 0;
+            timestamp_ms = 0;
+        }
     }
     BloodOxygenModel::~BloodOxygenModel() {}
     BloodOxygenModel *BloodOxygenModel::GetInstance(void)
@@ -166,7 +173,7 @@ namespace OHOS
             BloodOxygenData *data = new BloodOxygenData;
             data->SPO2 = spo2;
             data->timestamp = BloodOxygenPresenter::GetInstance()->GetCurrentTime();
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %lld", spo2, data->timestamp);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%d %d", spo2, data->timestamp);
             SetCheckTime(data->timestamp);
             HealthService::GetInstance()->UpdateBloodOxygenData(*data);
             delete data;
index 77e0e54..0abdbde 100644 (file)
@@ -1,21 +1,11 @@
-{
-    "spo2_latest_data": {
-        "oxygen_value": 0,
-        "timestamp": 0
-    },
-    "spo2_data_list": [
-        {
-            "oxygen_value": 0,
-            "timestamp": 0
-        }
-    ],
+data{
     "heart_latest_data": {
-        "heart_value": 0,
+        "value": 0,
         "timestamp": 0
     },
     "heart_data_list": [
         {
-            "heart_value": 0,
+            "value": 0,
             "timestamp": 0
         }
     ]
index 7c1bb38..250a49e 100644 (file)
@@ -5,6 +5,7 @@
 #include "cJSON.h"
 #include <sys/stat.h>
 #include <ctime>
+#include "kv_store.h"
 namespace OHOS
 {
 
@@ -40,13 +41,19 @@ namespace OHOS
     static constexpr const char *HEALTH_JSON_PATH = "/user/userdata/health/";
     static constexpr const char *HEALTH_JSON_PATH_HEART = "/user/userdata/health/heart/";
     static constexpr const char *HEALTH_JSON_PATH_OXYGEN = "/user/userdata/health/oxygen/";
-
+    const char *GET_HEALTH_JSON_PATH_C_STR_HEART()
+    {
+        return HEALTH_JSON_PATH_HEART;
+    }
+    const char *GET_HEALTH_JSON_PATH_C_STR_OXYGEN()
+    {
+        return HEALTH_JSON_PATH_OXYGEN;
+    }
     /* --------------------------------- 文件IO操作 --------------------------------- */
     /*创建文件夹*/
     bool HealthService::CreateHealthFolder()
     {
         struct stat info;
-        // 判断HEALTH_JSON_PATH是否存在 不存在就创建
         if (stat(HEALTH_JSON_PATH, &info) != 0)
         {
             if (mkdir(HEALTH_JSON_PATH, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
@@ -55,7 +62,6 @@ namespace OHOS
                 return false; // Failed to create folder
             }
         }
-        // 判断HEALTH_JSON_PATH_HEART是否存在 不存在就创建
         if (stat(HEALTH_JSON_PATH_HEART, &info) != 0)
         {
             if (mkdir(HEALTH_JSON_PATH_HEART, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
@@ -64,7 +70,6 @@ namespace OHOS
                 return false; // Failed to create folder
             }
         }
-        // 判断HEALTH_JSON_PATH_OXYGEN是否存在 不存在就创建
         if (stat(HEALTH_JSON_PATH_OXYGEN, &info) != 0)
         {
             if (mkdir(HEALTH_JSON_PATH_OXYGEN, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
@@ -84,30 +89,34 @@ namespace OHOS
 
         return healthTypePath + currentDate + ".json";
     }
-    const char *GET_HEALTH_JSON_PATH_C_STR_HEART()
-    {
-        return HEALTH_JSON_PATH_HEART;
-    }
-    const char *GET_HEALTH_JSON_PATH_C_STR_OXYGEN()
-    {
-        return HEALTH_JSON_PATH_OXYGEN;
-    }
+    // 加载 JSON 数据
     bool HealthService::LoadJsonData(uint8_t type)
     {
-        // 创建健康数据文件夹
         if (!CreateHealthFolder())
         {
             return false;
         }
-        // 获取当天日期对应的JSON文件路径
         std::string jsonFilePath = GetJsonFilePath(type);
         printf("GetJsonFilePath:%s\r\n", jsonFilePath.c_str());
+
         std::ifstream inFile(jsonFilePath);
+        if (!inFile.is_open())
+        {
+            printf("Failed to open JSON file.\r\n");
+            FILE *fp = fopen(jsonFilePath.c_str(), "wb");
+            return false;
+        }
 
-        // 读取JSON文件内容
         std::string jsonDataString((std::istreambuf_iterator<char>(inFile)), std::istreambuf_iterator<char>());
         const char *jsonData = jsonDataString.c_str();
         printf("jsonData:%s\r\n", jsonData);
+        if (jsonDataString.empty())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " jsonDataString is error");
+            // printf("JSON file is empty.\r\n");
+            return false;
+        }
+
         if (type == HEALTH_TYPE_HEART)
         {
             heart_root = cJSON_Parse(jsonData);
@@ -119,110 +128,225 @@ namespace OHOS
 
         return true;
     }
+    // 释放 JSON 数据
+    void HealthService::ReleaseJsonData(uint8_t type)
+    {
+        if (type == HEALTH_TYPE_HEART)
+        {
+            cJSON_Delete(heart_root);
+        }
+        if (type == HEALTH_TYPE_OXYGEN)
+        {
+            cJSON_Delete(oxygen_root);
+        }
+    }
 
+    // 读取血氧数据
     BloodOxygenData *HealthService::ReadBloodOxygenData()
     {
-        LoadJsonData(HEALTH_TYPE_OXYGEN);
+        if (!LoadJsonData(HEALTH_TYPE_OXYGEN))
+        {
+            return nullptr;
+        }
+
         BloodOxygenData *data = new BloodOxygenData();
         cJSON *latestData = cJSON_GetObjectItem(oxygen_root, "spo2_latest_data");
-        data->SPO2 = cJSON_GetObjectItem(latestData, "value")->valueint;
-        data->timestamp = cJSON_GetObjectItem(latestData, "timestamp")->valuedouble;
-        cJSON_Delete(oxygen_root);
+        if (latestData != NULL)
+        {
+            data->SPO2 = cJSON_GetObjectItem(latestData, "value")->valueint;
+            data->timestamp = cJSON_GetObjectItem(latestData, "timestamp")->valuedouble;
+        }
+
+        ReleaseJsonData(HEALTH_TYPE_OXYGEN);
+        return data;
+    }
+    HeartRateData *HealthService::ReadHeartRateData()
+    {
+        if (!LoadJsonData(HEALTH_TYPE_HEART))
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadJsonData  is error ");
+            return nullptr;
+        }
+
+        HeartRateData *data = new HeartRateData();
+        cJSON *latestData = cJSON_GetObjectItem(heart_root, "heart_latest_data");
+        if (latestData != NULL)
+        {
+            // 读取心率值
+            data->Heart = cJSON_GetObjectItem(latestData, "value")->valueint;
+            data->timestamp = static_cast<uint32_t>(cJSON_GetObjectItem(latestData, "timestamp")->valueint);
+
+            char *jsonStr = cJSON_Print(heart_root);
+            if (jsonStr != NULL)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRootJSONData: %s", jsonStr);
+                cJSON_free(jsonStr);
+            }
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadHeartRateData: value %d timestamp %d", data->Heart, data->timestamp);
+        }
+        ReleaseJsonData(HEALTH_TYPE_HEART);
+
         return data;
     }
+
     bool HealthService::UpdateBloodOxygenData(const BloodOxygenData &data)
     {
-        LoadJsonData(HEALTH_TYPE_OXYGEN);
-        cJSON *latestData = cJSON_GetObjectItem(oxygen_root, "spo2_latest_data");
-        if (latestData == NULL)
+        if (!LoadJsonData(HEALTH_TYPE_OXYGEN))
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadJsonData is error");
+            // return false;
+        }
+
+        if (oxygen_root == nullptr)
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "oxygen_root is first");
+            oxygen_root = cJSON_CreateObject();
+            if (oxygen_root == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create cJSON object for oxygen_root");
+                return false;
+            }
+            cJSON_AddItemToObject(oxygen_root, "spo2_latest_data", cJSON_CreateObject());
+            cJSON_AddItemToObject(oxygen_root, "spo2_data_list", cJSON_CreateArray());
+        }
+
+        cJSON *latestData = cJSON_GetObjectItemCaseSensitive(oxygen_root, "spo2_latest_data");
+        if (latestData == NULL || !cJSON_IsObject(latestData))
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get spo2_latest_data object");
+            cJSON_Delete(oxygen_root);
+            oxygen_root = nullptr;
             return false;
         }
-        cJSON_ReplaceItemInObject(latestData, "value", cJSON_CreateNumber(data.SPO2));
-        cJSON_ReplaceItemInObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
 
-        // 将数据添加到列表的最后
+        cJSON *SPO2 = cJSON_GetObjectItemCaseSensitive(latestData, "value");
+        if (SPO2 == nullptr && cJSON_IsNumber(SPO2))
+        {
+            // Add spo2_latest_data
+            cJSON_AddItemToObject(latestData, "value", cJSON_CreateNumber(data.SPO2));
+            cJSON_AddItemToObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
+        }
+        else
+        {
+            cJSON_ReplaceItemInObject(latestData, "value", cJSON_CreateNumber(data.SPO2));
+            cJSON_ReplaceItemInObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
+        }
+
+        // Update or add to spo2_data_list
         cJSON *dataList = cJSON_GetObjectItem(oxygen_root, "spo2_data_list");
         if (dataList != NULL && cJSON_IsArray(dataList))
         {
-            cJSON *newData = cJSON_CreateObject();
-            cJSON_AddItemToObject(newData, "value", cJSON_CreateNumber(data.SPO2));
-            cJSON_AddItemToObject(newData, "timestamp", cJSON_CreateNumber(data.timestamp));
-            cJSON_AddItemToArray(dataList, newData);
+            // Check if data already exists in the list
+            bool dataExists = false;
+            cJSON *dataItem = NULL;
+            cJSON_ArrayForEach(dataItem, dataList)
+            {
+                cJSON *timestampItem = cJSON_GetObjectItemCaseSensitive(dataItem, "timestamp");
+                if (timestampItem != NULL && cJSON_IsNumber(timestampItem) && timestampItem->valuedouble == data.timestamp)
+                {
+                    cJSON_ReplaceItemInObject(dataItem, "value", cJSON_CreateNumber(data.SPO2));
+                    dataExists = true;
+                    break;
+                }
+            }
+
+            if (!dataExists)
+            {
+                cJSON *newData = cJSON_CreateObject();
+                cJSON_AddItemToObject(newData, "value", cJSON_CreateNumber(data.SPO2));
+                cJSON_AddItemToObject(newData, "timestamp", cJSON_CreateNumber(data.timestamp));
+                cJSON_AddItemToArray(dataList, newData);
+            }
         }
-        if (UpdateJsonData(HEALTH_TYPE_OXYGEN) == false)
+
+        if (!UpdateJsonData(HEALTH_TYPE_OXYGEN))
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateJsonData is error");
-            cJSON_Delete(oxygen_root);
+            printf("UpdateJsonData failed.\r\n");
+            ReleaseJsonData(HEALTH_TYPE_OXYGEN);
             return false;
         }
-        cJSON_Delete(oxygen_root);
+
+        ReleaseJsonData(HEALTH_TYPE_OXYGEN);
         return true;
     }
 
-    HeartRateData *HealthService::ReadHeartRateData()
+    bool HealthService::UpdateHeartRateData(const HeartRateData &data)
     {
-        if (!LoadJsonData(HEALTH_TYPE_HEART) && (heart_root == nullptr))
+        if (!LoadJsonData(HEALTH_TYPE_HEART))
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadHeartRateData heart_root is error ");
-            return nullptr;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadJsonData is error");
+            // return false;
         }
-        HeartRateData *data = new HeartRateData();
-        cJSON *latestData = cJSON_GetObjectItem(heart_root, "heart_latest_data");
-        // 读取心率值
-        data->Heart = cJSON_GetObjectItem(latestData, "value")->valueint;
-        // 读取时间戳,并转换为 uint32_t 类型
-        data->timestamp = static_cast<uint32_t>(cJSON_GetObjectItem(latestData, "timestamp")->valueint);
-        // 打印 JSON 数据
-        char *jsonStr = cJSON_Print(heart_root);
-        if (jsonStr != NULL)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HeartRootJSONData: %s", jsonStr);
-            cJSON_free(jsonStr);
-        }
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadHeartRateData: value %d timestamp %d", data->Heart, data->timestamp);
-        cJSON_Delete(heart_root);
-        return data;
-    }
 
-    bool HealthService::UpdateHeartRateData(const HeartRateData &data)
-    {
-        LoadJsonData(HEALTH_TYPE_HEART);
-        cJSON *latestData = cJSON_GetObjectItem(heart_root, "heart_latest_data");
-        if (latestData == NULL)
+        if (heart_root == nullptr)
         {
+            heart_root = cJSON_CreateObject();
+            if (heart_root == nullptr)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create cJSON object for heart_root");
+                return false;
+            }
+
+            cJSON_AddItemToObject(heart_root, "heart_latest_data", cJSON_CreateObject());
+            cJSON_AddItemToObject(heart_root, "heart_data_list", cJSON_CreateArray());
+        }
+
+        cJSON *latestData = cJSON_GetObjectItemCaseSensitive(heart_root, "heart_latest_data");
+        if (latestData == NULL || !cJSON_IsObject(latestData))
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to get heart_latest_data object");
+            cJSON_Delete(heart_root);
+            heart_root = nullptr;
             return false;
         }
-        cJSON_ReplaceItemInObject(latestData, "value", cJSON_CreateNumber(data.Heart));
-        cJSON_ReplaceItemInObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
 
-        // 将数据添加到列表的最后
-        cJSON *dataList = cJSON_GetObjectItem(heart_root, "heart_data_list");
-        // 获取当前数据列表长度
-        int numData = cJSON_GetArraySize(dataList);
+        cJSON *Heart = cJSON_GetObjectItemCaseSensitive(latestData, "value");
+        if (Heart == nullptr && !cJSON_IsNumber(Heart))
+        {
+            // Add heart_latest_data
+            cJSON_AddItemToObject(latestData, "value", cJSON_CreateNumber(data.Heart));
+            cJSON_AddItemToObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
+        }
+        else
+        {
+            cJSON_ReplaceItemInObject(latestData, "value", cJSON_CreateNumber(data.Heart));
+            cJSON_ReplaceItemInObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
+        }
 
-        // 如果数据列表长度已经达到360个,不再添加新数据
-        if (numData >= 360)
+        // // 更新heart_latest_data中的value和timestamp值
+        // cJSON_AddItemToObject(latestData, "value", cJSON_CreateNumber(data.Heart));
+        // cJSON_AddItemToObject(latestData, "timestamp", cJSON_CreateNumber(data.timestamp));
+
+        cJSON *dataList = cJSON_GetObjectItem(heart_root, "heart_data_list");
+        if (dataList == NULL || !cJSON_IsArray(dataList))
         {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "heart_data_list is null or not an array");
             cJSON_Delete(heart_root);
+            heart_root = nullptr;
             return false;
         }
 
-        if (dataList != NULL && cJSON_IsArray(dataList))
+        int numData = cJSON_GetArraySize(dataList);
+        if (numData >= 360)
         {
-            cJSON *newData = cJSON_CreateObject();
-            cJSON_AddItemToObject(newData, "value", cJSON_CreateNumber(data.Heart));
-            cJSON_AddItemToObject(newData, "timestamp", cJSON_CreateNumber(data.timestamp));
-            cJSON_AddItemToArray(dataList, newData);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Data list is full (360 items)");
+            return false;
         }
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateJsonData");
+
+        // 添加新数据到dataList中
+        cJSON *newData = cJSON_CreateObject();
+        cJSON_AddItemToObject(newData, "value", cJSON_CreateNumber(data.Heart));
+        cJSON_AddItemToObject(newData, "timestamp", cJSON_CreateNumber(data.timestamp));
+        cJSON_AddItemToArray(dataList, newData);
+
         if (UpdateJsonData(HEALTH_TYPE_HEART) == false)
         {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateJsonData is error");
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to update JSON data for heart rate");
             cJSON_Delete(heart_root);
+            heart_root = nullptr;
             return false;
         }
-        cJSON_Delete(heart_root);
+
         return true;
     }
 
@@ -260,5 +384,4 @@ namespace OHOS
         cJSON_free(jsonData);
         return true;
     }
-
 }
\ No newline at end of file
index 2929060..a83c82a 100644 (file)
@@ -1,3 +1,9 @@
+/*** 
+ * @Date: 2024-06-14 11:34:19
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-24 16:08:36
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/heart_blood/health_service/health_service.h
+ */
 #ifndef HEART_SERVICE_H
 #define HEART_SERVICE_H
 
 #define HEART_MAX_POINTS 360
 namespace OHOS
 {
-    const char * GET_HEALTH_JSON_PATH_C_STR_HEART();
-    const char * GET_HEALTH_JSON_PATH_C_STR_OXYGEN();
+    const char *GET_HEALTH_JSON_PATH_C_STR_HEART();
+    const char *GET_HEALTH_JSON_PATH_C_STR_OXYGEN();
 
-    typedef enum {
+    typedef enum
+    {
         HEALTH_TYPE_HEART,
         HEALTH_TYPE_OXYGEN,
     } HEALTH_TYPE;
 
     typedef struct
     {
-        uint8_t SPO2;      // 血氧值
+        uint8_t SPO2;       // 血氧值
         uint32_t timestamp; // 最近一次检测时间
     } BloodOxygenData;
 
@@ -41,7 +48,7 @@ namespace OHOS
 
     typedef struct
     {
-        uint8_t Heart;     // 心率值
+        uint8_t Heart;      // 心率值
         uint32_t timestamp; // 最近一次检测时间
     } HeartRateData;
 
@@ -52,13 +59,14 @@ namespace OHOS
         ~HealthService();
         static HealthService *GetInstance(void);
         bool CreateHealthFolder();
-        bool LoadJsonData(uint8_t type);                                     // 加载json
+        bool LoadJsonData(uint8_t type);                         // 加载json
         BloodOxygenData *ReadBloodOxygenData();                  // 读取血氧数据
         bool UpdateBloodOxygenData(const BloodOxygenData &data); // 更新血氧数据
         HeartRateData *ReadHeartRateData();                      // 读取心率数据
         HeartPoints *ReadHeartRateDataList();                    // 读取心率列表
         bool UpdateHeartRateData(const HeartRateData &data);     // 更新心率数据
-        bool UpdateJsonData( uint8_t type);                                   // 更新json
+        void ReleaseJsonData(uint8_t type);                      // 释放json
+        bool UpdateJsonData(uint8_t type);                       // 更新json
     };
 }
 #endif // HEALTH_MODEL_H
\ No newline at end of file
index d7a1572..0283372 100644 (file)
@@ -158,8 +158,8 @@ extern "C"
             bool CheckView;\r
             bool ResultView;\r
             bool CheckStatus;     // 检测状态标志\r
-            uint16_t Show_Heart_; // 显示血氧\r
-            uint16_t Heart_;      // 保存血氧\r
+            uint16_t Show_Heart_; // 显示心率\r
+            uint16_t Heart_;      // 保存心率\r
             uint64 TIME_;         // 检测时间(存(时、分),大于24小时,改为1天前,小于1分钟为刚刚)\r
 \r
             bool initstatus = true;\r
index c567465..a19f7a4 100644 (file)
@@ -189,6 +189,19 @@ namespace OHOS
         ResultView = false;\r
         CheckStatus = false;\r
         wearStatus = true;\r
+\r
+        HeartRateData *data = HealthService::GetInstance()->ReadHeartRateData();\r
+        if (data != nullptr)\r
+        {\r
+            Heart_ = data->Heart;\r
+            TIME_ = data->timestamp;\r
+            delete data;\r
+        }\r
+        else\r
+        {\r
+            Heart_ = 0;\r
+            TIME_ = 0;\r
+        }\r
     }\r
 \r
     HeartModel::~HeartModel()\r
index a24feb3..40eda29 100644 (file)
@@ -43,13 +43,19 @@ namespace OHOS
     {
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HeartView::HeartView");
         g_pMainView = this;
-        /*更新model*/
-        HeartRateData *data;
-        data = HealthService::GetInstance()->ReadHeartRateData(); // 初始化心率值
-        HeartModel::GetInstance()->UpHeartdata(data->Heart);
-        HeartModel::GetInstance()->SetCheckTime(data->timestamp);
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadHeartRateData: value %d timestamp %d", data->Heart, data->timestamp);
-        delete data;
+        /*更新model 如果model数据为0,尝试再读一次*/
+        if (!HeartModel::GetInstance()->GetHeartdata())
+        {
+            HeartRateData *data;
+            data = HealthService::GetInstance()->ReadHeartRateData(); // 初始化心率值
+            if (data != nullptr)
+            {
+                HeartModel::GetInstance()->UpHeartdata(data->Heart);
+                HeartModel::GetInstance()->SetCheckTime(data->timestamp);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ReadHeartRateData: value %d timestamp %d", data->Heart, data->timestamp);
+            }
+            delete data;
+        }
     }
 
     HeartView::~HeartView()
@@ -170,9 +176,9 @@ namespace OHOS
         titleLabel->SetStyle(STYLE_TEXT_FONT, TITLE_FONT_SIZE);
         // titleLabel->SetText("心率检测结果");
         titleLabel->SetTextId(STR_HEARTDATA);
-        titleLabel->SetLineBreakMode(UILabelExt::LINE_BREAK_ADAPT);
+        titleLabel->SetLineBreakMode(UILabelExt::LINE_BREAK_MARQUEE);
         titleLabel->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);
-        titleLabel->SetRollSpeed(0);
+        titleLabel->SetRollSpeed(30);
         titleLabel->SetFont(DEFAULT_VECTOR_FONT_FILENAME, TITLE_FONT_SIZE);
 
         UpHeartText();
index 8703cc2..0ebf8ea 100644 (file)
@@ -234,7 +234,7 @@ STR_END_MOVEMENT$End movement
 STR_END_THIS_MOVEMENT$Whether to end this movement\r
 STR_GOAL_ACCOMPLISHMENT_DEGREE$Goal accomplishment degree\r
 STR_TRAINING_DURATION$Training duration\r
-STR_OFF$Off\r
+STR_CLOSE$Off\r
 STR_MORE$More\r
 STR_MORE_APP$Check out the APP for more\r
 STR_SAVENOTE$Turning on power-saving mode turns off non-essential Bluetooth connections, as well as features such as sensor monitoring\r
@@ -265,7 +265,7 @@ STR_HEARTTITLE$Heart rate alert
 STR_HEARTMAX$Current heart rate is higher than XX\r
 STR_HEARTMIN$Current heart rate is lower than XX\r
 STR_TRAINGNO$no record\r
-STR_TRAINGGO$Go to training$\r
+STR_TRAINGGO$Go to training\r
 STR_MESSAGE$Message Notification\r
 STR_MESSAGENO$No content currently\r
 STR_CLEAN$Clear\r
@@ -280,7 +280,7 @@ STR_DISTURB$The watch will enter Do Not Disturb mode in 20 minutes. To turn it o
 STR_DISTURBNOTE$Do Not Disturb mode is enabled, thus the watch won't vibrate or ring.\r
 STR_MORNNING$Good morning\r
 STR_NOW$Current\r
-STR_NAP$Nap (5 minutes)$\r
+STR_NAP$Nap (5 minutes)\r
 STR_TACK$Please open the app first, go to "Device" - "Camera"\r
 STR_CLICK$click on "Take a Photo\r
 STR_TACKNUM$Number of photos taken: XX\r
index d5e2cce..5ca1d2b 100644 (file)
@@ -466,8 +466,8 @@ STR_ENABLE_MOBILE_DATA_FIRST$请先开启移动数据
 STR_ENABLE_BLUETOOTH_FIRST$请先开启蓝牙\r
 STR_LISTENING$正在聆听...\r
 STR_FINISH_SPEAKING$说话完毕\r
-STR_THINKING$正在思考\r
+STR_THINKING$正在思考...\r
 STR_CANCEL$取消\r
 STR_CONNECT_TIMEOUT$连接超时\r
-STR_PLEASE_RESTART_CHAT$请开始重新对话\r
+STR_PLEASE_RESTART_CHAT$请重新开始对话\r
 STR_CONTINUE_CHAT$继续对话
\ No newline at end of file
index 79683a1..d4bae33 100644 (file)
        <lanstr id="STR_END_THIS_MOVEMENT" value="Whether to end this movement"/>
        <lanstr id="STR_GOAL_ACCOMPLISHMENT_DEGREE" value="Goal accomplishment degree"/>
        <lanstr id="STR_TRAINING_DURATION" value="Training duration"/>
-       <lanstr id="STR_OFF" value="Off"/>
+       <lanstr id="STR_CLOSE" value="Off"/>
        <lanstr id="STR_MORE" value="More"/>
        <lanstr id="STR_MORE_APP" value="Check out the APP for more"/>
        <lanstr id="STR_SAVENOTE" value="Turning on power-saving mode turns off non-essential Bluetooth connections, as well as features such as sensor monitoring"/>
index dccec19..c85420e 100644 (file)
        <lanstr id="STR_ENABLE_BLUETOOTH_FIRST" value="请先开启蓝牙"/>
        <lanstr id="STR_LISTENING" value="正在聆听..."/>
        <lanstr id="STR_FINISH_SPEAKING" value="说话完毕"/>
-       <lanstr id="STR_THINKING" value="正在思考"/>
+       <lanstr id="STR_THINKING" value="正在思考..."/>
        <lanstr id="STR_CANCEL" value="取消"/>
        <lanstr id="STR_CONNECT_TIMEOUT" value="连接超时"/>
-       <lanstr id="STR_PLEASE_RESTART_CHAT" value="请开始重新对话"/>
+       <lanstr id="STR_PLEASE_RESTART_CHAT" value="请重新开始对话"/>
        <lanstr id="STR_CONTINUE_CHAT" value="继续对话"/>
 </language>
index 55bbff1..a53ba3d 100644 (file)
Binary files a/code/sdk/application/wearable/fd230app/nativeui/language/font/en.lang and b/code/sdk/application/wearable/fd230app/nativeui/language/font/en.lang differ
index 224c9cc..5aa2363 100644 (file)
Binary files a/code/sdk/application/wearable/fd230app/nativeui/language/font/zh.lang and b/code/sdk/application/wearable/fd230app/nativeui/language/font/zh.lang differ
index 4f9742b..5490290 100644 (file)
@@ -95,19 +95,19 @@ namespace OHOS
             return false;
         }
         MessageList->SetOnClickListener(clickListener);
-        UIView::OnDragListener *Messagedraglistener = static_cast<UIView::OnDragListener *>(MessagePresenter::GetInstance());
-#if 0
-        /*删除按键*/
-        int top = (MessageModel::GetInstance().GetListNum() * 100);
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "num is %d", top);
-        InitButtonExt(DeleteButton, 43, top, 380, 100, DELETEALLDATA, STR_CLOSE, 30);
-        DeleteButton->SetOnClickListener(static_cast<UIView::OnClickListener *>(MessagePresenter::GetInstance()));
-        messageView->Add(DeleteButton);
-#endif
+        UIView::OnDragListener *Messagedraglistener = (UIView::OnDragListener *)(MessageControlPresenter::GetInstance());
+
         Add(MessageList);
         MessageList->SetAdapter(p_MessageListAdapter);
         MessageList->RefreshList();
 
+        /*删除按键*/
+        int top = MessageList->GetWidth() + 130;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "top %d", top);
+        InitButtonExt(DeleteButton, 43, top, 380, 100, DELETEALLDATA, STR_CLEANALL, 30);
+        DeleteButton->SetOnClickListener((UIView::OnClickListener *)OHOS::MessageControlPresenter::GetInstance());
+        Add(DeleteButton);
+
         SetDraggable(false);
         SetTouchable(false);
         initViewStatus = true;
index aa123a7..9579665 100644 (file)
@@ -1,3 +1,9 @@
+/***
+ * @Date: 2024-06-22 11:36:16
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-24 11:00:22
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/message/src/MessageControlPresenter.cpp
+ */
 /***
  * @Date: 2024-04-15 10:55:58
  * @LastEditors: Caisking 3449750381@qq.com
@@ -31,13 +37,19 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: View is not List");
             return false;
         }
-        
+
         if (!MessageModel::GetInstance().GetJsonLoadStatus())
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Json data not loaded.");
             return false;
         }
-
+        if (strcmp(view.GetViewId(), DELETEALLDATA) == 0)
+        {
+            // 执行全部删除操作
+            MessageModel::GetInstance().ClearAllData();
+            NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
+            return true;
+        }
         // 获取 MessageItemView 并检查索引
         MessageItemView *p_MessageItemView = static_cast<MessageItemView *>(&view);
         if (!p_MessageItemView)
index f43b380..5ad8836 100644 (file)
@@ -83,6 +83,8 @@ namespace OHOS
         stitle.SetText(itemInfo.labeltitle.c_str());
         smessgae.SetText(itemInfo.labeldetails.c_str());
         stime.SetText(itemInfo.labeltime.c_str());
+
+        // printf("%d %s %s %s\r\n", itemInfo.read, itemInfo.labeltitle.c_str(), itemInfo.labeldetails.c_str(), itemInfo.labeltime.c_str());
     }
 
     void MessageItemView::SetUpChild()
@@ -98,7 +100,7 @@ namespace OHOS
 
         smessgae.SetPosition(40, 69, 300, label_length);
         smessgae.SetLineBreakMode(UILabel::LINE_BREAK_CLIP);
-        smessgae.SetTextColor(Color::Gray());      
+        smessgae.SetTextColor(Color::Gray());
         smessgae.SetFont(DEFAULT_VECTOR_FONT_FILENAME, 30);
 
         stime.SetPosition(40, time_top, 300, 33);
index 16bd283..0e6db03 100644 (file)
@@ -146,7 +146,8 @@ namespace OHOS
         {
             numberOfItems = messageVector.size();
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "the numberOfItems is %d", numberOfItems);
-            for (int i = numberOfItems - 1, count = 0; i >= 0 && count < MaxMessageListCount; i--, count++)
+            // Messages[numberOfItems] = {numberOfItems, true, "", "            全部删除", ""};
+            for (int i = numberOfItems - 1, count = 0; i >= 0 && count < MaxMessageListCount - 1; i--, count++)
             {
                 MessageData messageData;
                 messageData.isRead = messageVector[i].isRead;
@@ -156,7 +157,9 @@ namespace OHOS
                 // PrintData(messageData);
                 // 获取是否读取 来信 信息内容 时间
                 Messages[count] = {count, messageData.isRead, messageData.labelTitle, messageData.labelDetails, messageData.labelTime};
+                // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "the count is %d", count);
             }
+            // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "the Messages.Size is %d", Messages.size());
         }
     }
     const MessageListItem *MessageModel::GetMessageListItems() const
index a7fdbec..64e8e11 100644 (file)
@@ -111,6 +111,8 @@ namespace OHOS
         {
             if (strcmp(view.GetViewId(), DELETEALLDATA) == 0)
             {
+                // 执行全部删除操作
+                MessageModel::GetInstance().ClearAllData();
                 NativeAbility::GetInstance().ChangeSlice(VIEW_APPLIST);
                 return true;
             }
index 210259d..a111702 100644 (file)
@@ -98,6 +98,16 @@ namespace OHOS
             delete title;
             title = nullptr;
         }
+        if (title != nullptr)
+        {
+            delete title;
+            title = nullptr;
+        }
+        if (DeleteButton != nullptr)
+        {
+            delete DeleteButton;
+            DeleteButton = nullptr;
+        }
         if (MessageList != nullptr)
         {
             MessageList->RemoveAll();
@@ -204,20 +214,21 @@ namespace OHOS
 
         messageView->SetYScrollBarVisible(true); // 设置滑动滚动条
         MessageList->SetOnClickListener(static_cast<UIView::OnClickListener *>(MessagePresenter::GetInstance()));
-#if 0
-        /*删除按键*/
-        int top = (MessageModel::GetInstance().GetListNum() * 100);
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "num is %d", top);
-        InitButtonExt(DeleteButton, 43, top, 380, 100, DELETEALLDATA, STR_CLOSE, 30);
-        DeleteButton->SetOnClickListener(static_cast<UIView::OnClickListener *>(MessagePresenter::GetInstance()));
-        messageView->Add(DeleteButton);
-#endif
+
         UIView::OnDragListener *Messagedraglistener = static_cast<UIView::OnDragListener *>(MessagePresenter::GetInstance());
         if (Messagedraglistener == nullptr)
         {
             return;
         }
         messageView->SetOnDragListener(Messagedraglistener);
+
+        /*删除按键*/
+        int top = MessageList->GetWidth() + 130;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "top %d", top);
+        InitButtonExt(DeleteButton, 43, top, 380, 100, DELETEALLDATA, STR_CLEANALL, 30);
+        DeleteButton->SetOnClickListener(static_cast<UIView::OnClickListener *>(MessagePresenter::GetInstance()));
+        messageView->Add(DeleteButton);
+
         messageView->SetVisible(false); // 隐藏界面
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ShowmessageView end");
     }
index 22223b8..f4febd1 100644 (file)
@@ -1,3 +1,9 @@
+/***
+ * @Date: 2024-06-22 18:08:25
+ * @LastEditors: Caisking 3449750381@qq.com
+ * @LastEditTime: 2024-06-24 11:30:12
+ * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/themestyle/src/ThemeStyleModel.cpp
+ */
 /*
  * @Author: luozheng 1732036298@qq.com
  * @Date: 2024-06-07 09:21:47
@@ -34,6 +40,7 @@ namespace OHOS
         int ret = UtilsGetValue(THEMESTYLE_KEY, temp, STYLE_VALUE_LEN); // 从文件系统或缓存中获取与指定键匹配的值。
         if (ret < 0)
         {
+            UtilsSetValue(THEMESTYLE_KEY, THEMESTYLE_VALUE_LIST); // 设置默认值
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UtilsGetValue error,temp:%s,ret = %d", temp, ret);
             return ThemeStyle::APPLIST_STYLE;
         }
index 55bbff1..a53ba3d 100644 (file)
Binary files a/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang and b/code/sdk/build/config/target_config/brandy/mk_fs_image/fd230/fs/user/res/font/en.lang differ