#592 APP iOS 自定义表盘不能删除
authorCaisking <3449750381@qq.com>
Wed, 25 Sep 2024 06:38:59 +0000 (14:38 +0800)
committerCaisking <3449750381@qq.com>
Wed, 25 Sep 2024 06:38:59 +0000 (14:38 +0800)
code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h
code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c

index 533dc0a..e345221 100644 (file)
@@ -37,6 +37,7 @@ namespace OHOS
         void PrintRegisteredDials(const std::unordered_map<uint16_t, std::string> &dials);
         int GetAllDialIDs(char *allidStr);
 
+
         /*表盘map文件*/
         bool readDialfile();
         bool saveDialfile();
@@ -51,7 +52,10 @@ namespace OHOS
         bool CheckFileExists(const std::string &filePath);
         /*获取自定义表盘名*/
         std::string GetCustomName(int Id);
+        /*删除自定义表盘*/
+        bool DeleteCustomDial(uint16_t Id);
         void TestDialConfig(void);
+        std::string GetSaveDir(int Id,uint8_t type);
 
     private:
         void LoadAllDialFromRam(void);
index 365c179..c4008b9 100644 (file)
 
-#include <algorithm>
-#include "MainModel.h"
 #include "SetDialModel.h"
-#include "kv_store.h"
-#include "securec.h"
-#include "dirent.h"
 #include "DialBinParser.h"
+#include "MainModel.h"
+#include "NativeAbility.h"
+#include "clock/include/MainClockView.h"
 #include "custom_utils.h"
+#include "dirent.h"
+#include "kv_store.h"
+#include "securec.h"
 #include "wearable_log.h"
-#include <string>
-#include <sstream>
+#include <algorithm>
+#include <array>
+#include <cstdbool>
+#include <fstream>
 #include <iomanip>
 #include <iostream>
-#include <fstream>
-#include <array>   
+#include <sstream>
 #include <stdio.h>
+#include <string>
 #include <sys/stat.h>
 #include <unistd.h>
-#include "NativeAbility.h"
-#include "clock/include/MainClockView.h"
-namespace OHOS
-{
-    // 定义特殊Id
-    constexpr uint16_t DEFAULT_DIAL_ID_1 = 1028;
-    constexpr uint16_t DEFAULT_DIAL_ID_2 = 1052;
-    constexpr uint16_t DEFAULT_DIAL_ID_3 = 101;
-    constexpr uint16_t DEFAULT_DIAL_ID_4 = 106;
-    constexpr uint16_t MAX_DEFAULT_DIAL_ID = 111;
+namespace OHOS {
+// 定义特殊Id
+constexpr uint16_t DEFAULT_DIAL_ID_1 = 1028;
+constexpr uint16_t DEFAULT_DIAL_ID_2 = 1052;
+constexpr uint16_t DEFAULT_DIAL_ID_3 = 101;
+constexpr uint16_t DEFAULT_DIAL_ID_4 = 106;
+constexpr uint16_t MAX_DEFAULT_DIAL_ID = 111;
+constexpr uint16_t CUSTOM_DIAL_ID_1 = 1;
+constexpr uint16_t CUSTOM_DIAL_ID_2 = 2;
+constexpr uint16_t CUSTOM_DIAL_ID_3 = 3;
+constexpr uint16_t CUSTOM_DIAL_ID_4 = 4;
+constexpr uint16_t CUSTOM_DIAL_ID_5 = 5;
 
 #define DIAL_ID_LENGTH 2
 #define DIAL_NAME_LENGTH 50
 #define DIAL_ID_PATH "user/userdata/dial_id.bin"
 
-    // 表盘map[Id--dialname] 前5个ID固定
-    std::unordered_map<uint16_t, std::string> registeredDials{
+// 表盘map[Id--dialname] 前5个ID固定
+std::unordered_map<uint16_t, std::string> registeredDials{
 #ifdef CUSTOM_Z1
-        {DEFAULT_DIAL_ID_1, "Z1"},
+    {DEFAULT_DIAL_ID_1, "Z1"},
 #else
-        {DEFAULT_DIAL_ID_1, "KUMI"},
+    {DEFAULT_DIAL_ID_1, "KUMI"},
 #endif
-        {DEFAULT_DIAL_ID_2, "classic"},     // 经典表盘
-        {DEFAULT_DIAL_ID_3, "sport"},       // 运动表盘
-        {DEFAULT_DIAL_ID_4, "galaxy"},      // 星空表盘
-        {MAX_DEFAULT_DIAL_ID, "satellite"}, // 卫星表盘
-    };
-    // 表盘市场UID 对应表盘name
-    bool SetDialModel::saveDialfile()
-    {
-        FILE *fp = fopen(DIAL_ID_PATH, "wb+");
-
-        for (const auto &entry : registeredDials)
-        {
-            char buf[DIAL_ID_LENGTH + DIAL_NAME_LENGTH] = {0};
-            memcpy_s(buf, DIAL_ID_LENGTH + DIAL_NAME_LENGTH, &entry.first, 2);
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uid  %d", entry.first);
-            memcpy_s(buf + DIAL_ID_LENGTH, DIAL_ID_LENGTH + DIAL_NAME_LENGTH, entry.second.c_str(), entry.second.length());
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uid  %s", entry.second.c_str());
-            int size = fwrite(buf, 1, DIAL_ID_LENGTH + DIAL_NAME_LENGTH, fp);
-            if (DIAL_ID_LENGTH + DIAL_NAME_LENGTH != size)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " fwrite is fail! %d", size);
-                return false;
-            }
-            else
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " fwrite is succ  %d !", entry.first);
-            }
-        }
-        fclose(fp);
-        return true;
+    {DEFAULT_DIAL_ID_2, "classic"},     // 经典表盘
+    {DEFAULT_DIAL_ID_3, "sport"},       // 运动表盘
+    {DEFAULT_DIAL_ID_4, "galaxy"},      // 星空表盘
+    {MAX_DEFAULT_DIAL_ID, "satellite"}, // 卫星表盘
+};
+// 表盘市场UID 对应表盘name
+bool SetDialModel::saveDialfile() {
+  FILE *fp = fopen(DIAL_ID_PATH, "wb+");
+
+  for (const auto &entry : registeredDials) {
+    char buf[DIAL_ID_LENGTH + DIAL_NAME_LENGTH] = {0};
+    memcpy_s(buf, DIAL_ID_LENGTH + DIAL_NAME_LENGTH, &entry.first, 2);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uid  %d", entry.first);
+    memcpy_s(buf + DIAL_ID_LENGTH, DIAL_ID_LENGTH + DIAL_NAME_LENGTH,
+             entry.second.c_str(), entry.second.length());
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uid  %s", entry.second.c_str());
+    int size = fwrite(buf, 1, DIAL_ID_LENGTH + DIAL_NAME_LENGTH, fp);
+    if (DIAL_ID_LENGTH + DIAL_NAME_LENGTH != size) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " fwrite is fail! %d", size);
+      return false;
+    } else {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " fwrite is succ  %d !",
+                    entry.first);
     }
+  }
+  fclose(fp);
+  return true;
+}
 
-    bool SetDialModel::readDialfile()
-    {
-        FILE *fp = fopen(DIAL_ID_PATH, "rb+");
-        if (fp == NULL)
-            return false;
-        fseek(fp, 0, SEEK_END);
-        int size = ftell(fp);
-        fseek(fp, 0, SEEK_SET);
-        // char * buf=(char *)malloc(size);
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " readDialfile  size is %d !", size);
-
-        while (size)
-        {
-            uint16_t uid = 0;
-            if (DIAL_ID_LENGTH != fread((void *)&uid, 1, DIAL_ID_LENGTH, fp))
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " fread is fail!");
-            }
-
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uid  %d", uid);
-
-            char name_buf[DIAL_NAME_LENGTH] = {0};
-            if (DIAL_NAME_LENGTH != fread((void *)name_buf, 1, DIAL_NAME_LENGTH, fp))
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " fread is fail!");
-            }
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "name_buf %s", name_buf);
-
-            if (uid != 0)
-            {
-                if (!IsDialInstalled(uid))
-                {
-                    RegisterDial(uid, name_buf);
-                }
-            }
-            size -= (DIAL_ID_LENGTH + DIAL_NAME_LENGTH);
-        }
-
-        fclose(fp);
-        return true;
+bool SetDialModel::readDialfile() {
+  FILE *fp = fopen(DIAL_ID_PATH, "rb+");
+  if (fp == NULL)
+    return false;
+  fseek(fp, 0, SEEK_END);
+  int size = ftell(fp);
+  fseek(fp, 0, SEEK_SET);
+  // char * buf=(char *)malloc(size);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " readDialfile  size is %d !", size);
+
+  while (size) {
+    uint16_t uid = 0;
+    if (DIAL_ID_LENGTH != fread((void *)&uid, 1, DIAL_ID_LENGTH, fp)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " fread is fail!");
     }
 
-    SetDialModel::SetDialModel()
-    {
-        readDialfile();    // 读取表盘map配置文件
-        LoadAllDial();     // 更新表盘个数 当前表盘
-        char idBuffer[10]; // 读取表盘Id配置文件
-        int len = UtilsGetValue("dial_id", idBuffer, sizeof(idBuffer));
-        if (len >= 0)
-        {
-            currentDialID = std::stoi(idBuffer); // 将字符串转换为整数
-        }
-    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uid  %d", uid);
 
-    SetDialModel::~SetDialModel() {}
+    char name_buf[DIAL_NAME_LENGTH] = {0};
+    if (DIAL_NAME_LENGTH != fread((void *)name_buf, 1, DIAL_NAME_LENGTH, fp)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " fread is fail!");
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "name_buf %s", name_buf);
 
-    SetDialModel &SetDialModel::GetInstance()
-    {
-        static SetDialModel instance;
-        return instance;
+    if (uid != 0) {
+      if (!IsDialInstalled(uid)) {
+        RegisterDial(uid, name_buf);
+      }
     }
+    size -= (DIAL_ID_LENGTH + DIAL_NAME_LENGTH);
+  }
 
-    /* 注册表盘map */
-    void SetDialModel::RegisterDial(uint16_t ID, const char *dialname)
-    {
-        if (ID == 0 || strlen(dialname) == 0)
-            return;
+  fclose(fp);
+  return true;
+}
 
-        registeredDials[ID] = std::string(dialname); // 唯一性
+SetDialModel::SetDialModel() {
+  readDialfile();    // 读取表盘map配置文件
+  LoadAllDial();     // 更新表盘个数 当前表盘
+  char idBuffer[10]; // 读取表盘Id配置文件
+  int len = UtilsGetValue("dial_id", idBuffer, sizeof(idBuffer));
+  if (len >= 0) {
+    currentDialID = std::stoi(idBuffer); // 将字符串转换为整数
+  }
+}
 
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RegisterDial %d %s is ok!", ID, dialname);
+SetDialModel::~SetDialModel() {}
 
-        LoadAllDial();
+SetDialModel &SetDialModel::GetInstance() {
+  static SetDialModel instance;
+  return instance;
+}
 
-        saveDialfile();
-    }
+/* 注册表盘map */
+void SetDialModel::RegisterDial(uint16_t ID, const char *dialname) {
+  // 增加 ID 对应
+  if (ID <= 4) {
+    ID++;
+  }
+
+  if (ID == 0 || strlen(dialname) == 0)
+    return;
+
+  registeredDials[ID] = std::string(dialname); // 唯一性
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RegisterDial %d %s is ok!", ID,
+                dialname);
+
+  LoadAllDial();
 
-    /* 打印map */
-    void SetDialModel::PrintRegisteredDials(const std::unordered_map<uint16_t, std::string> &dials)
-    {
-        printf("Registered Dials:\n");
-        for (const auto &entry : dials)
-        {
-            printf("ID: %u | Name: %s\n", entry.first, entry.second.c_str());
-        }
+  saveDialfile();
+}
+
+/* 打印map */
+void SetDialModel::PrintRegisteredDials(
+    const std::unordered_map<uint16_t, std::string> &dials) {
+  printf("Registered Dials:\n");
+  for (const auto &entry : dials) {
+    printf("ID: %u | Name: %s\n", entry.first, entry.second.c_str());
+  }
+}
+
+/* 通过名字查询Id */
+uint16_t SetDialModel::GetDialIdFromName(const std::string &dialName) {
+  for (const auto &entry : registeredDials) {
+    if (entry.second == dialName) {
+      return entry.first; // 找到对应的表盘名称,返回对应ID
     }
+  }
+  return 0; // 如果未找到对应的表盘名称,返回0或者其他适当的默认值
+}
 
-    /* 通过名字查询Id */
-    uint16_t SetDialModel::GetDialIdFromName(const std::string &dialName)
-    {
-        for (const auto &entry : registeredDials)
-        {
-            if (entry.second == dialName)
-            {
-                return entry.first; // 找到对应的表盘名称,返回对应ID
-            }
-        }
-        return 0; // 如果未找到对应的表盘名称,返回0或者其他适当的默认值
+/* 获取当前表盘Id */
+uint16_t SetDialModel::GetCurrentDialID() {
+  if (registeredDials.find(currentDialID) != registeredDials.end()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentDialID is %d,name is %s",
+                  currentDialID, registeredDials[currentDialID].c_str());
+  }
+  uint16_t id = currentDialID;
+  if (currentDialID <= 5) {
+    id--;
+  }
+  return id;
+}
+/* 获取所有表盘Id 每个表盘Id 2个字节 拼接为字符串 */
+int SetDialModel::GetAllDialIDs(char *allidStr) {
+  std::string allIDs;
+  int length = 0;
+  for (const auto &entry : registeredDials) {
+    uint16_t id = entry.first;
+    if (id <= 5) {
+      id--;
     }
+    memcpy_s(allidStr + length, 512, &id, 2);
+    length += 2;
+  }
 
-    /* 获取当前表盘Id */
-    uint16_t SetDialModel::GetCurrentDialID()
-    {
-        if (registeredDials.find(currentDialID) != registeredDials.end())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentDialID is %d,name is %s", currentDialID, registeredDials[currentDialID].c_str());
-        }
-        uint16_t id=currentDialID;
-        if(currentDialID<=5)
-        {
-            id--;
-        }
-        return id;
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "allidStr is %s %d", allIDs.c_str(),
+                length);
+  return length;
+}
+/* 判断表盘是否存在*/
+bool SetDialModel::IsDialInstalled(uint16_t ID) {
+  if (ID <= 4) {
+    ID++;
+  }
+
+  if (registeredDials.find(ID) != registeredDials.end()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dial %d is install!", ID);
+    return true;
+  } else {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dial %d is not install!", ID);
+    return false;
+  }
+}
+/*删除自定义表盘*/
+bool SetDialModel::DeleteCustomDial(uint16_t Id) {
+  // 删除配置文件
+  std::string filename = GetSaveDir(Id) + "/" + std::to_string(Id) + ".bin";
+  if (!uapi_delete_files(filename.c_str())) {
+    WEARABLE_LOGE(
+        WEARABLE_LOG_MODULE_APP,
+        "DeleteCustomDial: Failed to delete the dial configuration file: %s",
+        filename.c_str());
+    return false;
+  }
+
+  // 删除资源文件
+  switch (Id) {
+  case CUSTOM_DIAL_ID_1:
+    if (!uapi_delete_files(CUSTOM_CLOCK1_DIALPER_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial percentage file "
+                    "for ID 1: %s",
+                    CUSTOM_CLOCK1_DIALPER_PATH);
+      return false;
     }
-    /* 获取所有表盘Id 每个表盘Id 2个字节 拼接为字符串 */
-    int SetDialModel::GetAllDialIDs(char *allidStr)
-    {
-        std::string allIDs;
-        int length = 0;
-        for (const auto &entry : registeredDials)
-        {
-            uint16_t id = entry.first;
-            if (id <= 5)
-            {
-                id--;
-            }
-            memcpy_s(allidStr + length, 512, &id, 2);
-            length += 2;
-        }
-
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "allidStr is %s %d", allIDs.c_str(), length);
-        return length;
+    if (!uapi_delete_files(CUSTOM_CLOCK1_DIALBACK_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial background file "
+                    "for ID 1: %s",
+                    CUSTOM_CLOCK1_DIALBACK_PATH);
+      return false;
     }
-    /* 判断表盘是否存在*/
-    bool SetDialModel::IsDialInstalled(uint16_t ID)
-    {
-        if(ID<=4)
-        {
-            ID++;
-        }
-
-        if (registeredDials.find(ID) != registeredDials.end())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dial %d is install!", ID);
-            return true;
-        }
-        else
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "dial %d is not install!", ID);
-            return false;
-        }
+    break;
+
+  case CUSTOM_DIAL_ID_2:
+    if (!uapi_delete_files(CUSTOM_CLOCK2_DIALPER_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial percentage file "
+                    "for ID 2: %s",
+                    CUSTOM_CLOCK2_DIALPER_PATH);
+      return false;
     }
-    /* 删除表盘 */
-    bool SetDialModel::UninstallDial(uint16_t ID)
-    {
-        if(ID<=4)
-        {
-            ID++;
-        }
-        if (registeredDials.find(ID) != registeredDials.end())
-        {
-            // 默认表盘不删除[日志提醒]
-            switch (ID)
-            {
-            case MAX_DEFAULT_DIAL_ID:
-            case DEFAULT_DIAL_ID_1:
-            case DEFAULT_DIAL_ID_2:
-            case DEFAULT_DIAL_ID_3:
-            case DEFAULT_DIAL_ID_4:
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial default dial %d fail", ID);
-                return false;
-            default:
-                break;
-            }
-
-            /*删除文件操作 目前只删除下载表盘*/
-            std::string dialFullName = APP_DOWNLOAD_DIAL_PATH;
-            dialFullName += "/";
-            dialFullName += registeredDials[ID];
-            dialFullName += ".bin";
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial %s", dialFullName.c_str());
-            if (uapi_delete_files(dialFullName.c_str()))
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial the dial %d is ok", ID);
-
-                registeredDials.erase(ID);
-                LoadAllDial();
-                return true;
-            }
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_delete_files the dial %d is false", ID);
-            return false;
-        }
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Couldn't find the dial %d", ID);
-        return false;
+    if (!uapi_delete_files(CUSTOM_CLOCK2_DIALBACK_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial background file "
+                    "for ID 2: %s",
+                    CUSTOM_CLOCK2_DIALBACK_PATH);
+      return false;
     }
-    /*更新表盘*/
-    void SetDialModel::UpdateDialSetting(uint16_t ID)
-    {
-        if(ID<=4)
-        {
-            ID++;
-        }
-
-        if (registeredDials.find(ID) != registeredDials.end())
-        {
-            std::string dialname = registeredDials[ID]; // 根据ID找到对应的表盘名称
-            // 在dialInfoList中查找同名表盘
-            for (size_t i = 0; i < dialInfoList.size(); i++)
-            {
-                if (dialInfoList[i].dialName == dialname)
-                {
-                    DialSetting diagSetting;
-                    SetDialInfo &info = dialInfoList[i];
-                    diagSetting.dialFlag = info.dialFlag;
-                    diagSetting.dialId = info.id;
-                    diagSetting.dialFullName = info.dialFullName;
-                    currentDialID = ID;                                                  // 更新当前表盘Id
-                    MainModel::GetInstance().AddDialSetting(diagSetting, currentDialID); // 更新表盘设置
-                    NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
-                    return; // 更新成功后直接返回
-                }
-            }
-            NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialModel UpdateDialSetting: Cannot find dial with name %s", dialname.c_str());
-        }
+    break;
+
+  case CUSTOM_DIAL_ID_3:
+    if (!uapi_delete_files(CUSTOM_CLOCK3_DIALPER_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial percentage file "
+                    "for ID 3: %s",
+                    CUSTOM_CLOCK3_DIALPER_PATH);
+      return false;
     }
-
-    /*加载所有表盘*/
-    void SetDialModel::LoadAllDial()
-    {
-        dialInfoList.clear();
-        // 加载自定义表盘
-        LoadAllDialFromRam();
-        size_t dialSize = dialInfoList.size();
-        // 加载默认表盘
-        LoadAllDialFromDefult();
-        // 加载离线表盘
-        LoadAllDialFromFs();
-        /* 排序离线表盘 */
-        std::sort(dialInfoList.begin() + dialSize, dialInfoList.end(), [](const SetDialInfo &f, const SetDialInfo &n)
-                  { return f.dialName < n.dialName; });
-
-        // 表盘Id以及表盘map打印
-        char dialId[128];
-        GetAllDialIDs(dialId);
-        PrintRegisteredDials(registeredDials);
+    if (!uapi_delete_files(CUSTOM_CLOCK3_DIALBACK_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial background file "
+                    "for ID 3: %s",
+                    CUSTOM_CLOCK3_DIALBACK_PATH);
+      return false;
+    }
+    break;
+
+  case CUSTOM_DIAL_ID_4:
+    if (!uapi_delete_files(CUSTOM_CLOCK4_DIALPER_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial percentage file "
+                    "for ID 4: %s",
+                    CUSTOM_CLOCK4_DIALPER_PATH);
+      return false;
     }
-    /*加载离线表盘*/
-    void SetDialModel::LoadAllDialFromFs()
-    {
-        int ret;
-        struct dirent *direntp;
-
-        // 打开目录
-        DIR *dirp = opendir(APP_DOWNLOAD_DIAL_PATH);
-        // 遍历文件
-        if (dirp != nullptr)
-        {
-            while ((direntp = readdir(dirp)) != nullptr)
-            {
-                SetDialInfo dialInfo{0};
-                int ret = ParseDialHeader(DOWNLOADDIAL, direntp->d_name, dialInfo);
-                if (ret == 0)
-                {
-                    dialInfoList.push_back(dialInfo);
-                }
-            }
-        }
-        // 关闭目录
-        closedir(dirp);
-        return;
+    if (!uapi_delete_files(CUSTOM_CLOCK4_DIALBACK_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial background file "
+                    "for ID 4: %s",
+                    CUSTOM_CLOCK4_DIALBACK_PATH);
+      return false;
     }
-    /*加载默认表盘*/
-    void SetDialModel::LoadAllDialFromDefult(void)
-    {
-        int ret;
-        struct dirent *direntp;
-
-        // 打开目录
-        DIR *dirp = opendir(APP_DEFAULT_DIAL_PATH);
-        // 遍历文件
-        if (dirp != nullptr)
-        {
-            while ((direntp = readdir(dirp)) != nullptr)
-            {
-                SetDialInfo dialInfo{0};
-                int ret = ParseDialHeader(DEFULTDIAL, direntp->d_name, dialInfo);
-                if (ret == 0)
-                {
-                    dialInfoList.push_back(dialInfo);
-                }
-            }
-        }
-        // 关闭目录
-        closedir(dirp);
-        return;
+    break;
+
+  case CUSTOM_DIAL_ID_5:
+    if (!uapi_delete_files(CUSTOM_CLOCK5_DIALPER_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial percentage file "
+                    "for ID 5: %s",
+                    CUSTOM_CLOCK5_DIALPER_PATH);
+      return false;
     }
-    /*通过表盘名称解析表盘 [离线表盘]*/
-    int32_t SetDialModel::ParseDialHeader(int type, const std::string &dialFileName, SetDialInfo &dialInfo)
-    {
-        std::string dialFullName;
-        if (type == DEFULTDIAL)
-        {
-            dialFullName = APP_DEFAULT_DIAL_PATH;
-        }
-        else if (type == DOWNLOADDIAL)
-        {
-            dialFullName = APP_DOWNLOAD_DIAL_PATH;
-        }
-        dialFullName += "/";
-        dialFullName += dialFileName;
-        FILE *fp = fopen(dialFullName.c_str(), "rb");
-        if (fp == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader cannot open file: %s",
-                          dialFullName.c_str());
-            return -1;
-        }
-        DialPreviewInfo preInfo{0};
-        bool ret = DialBinParser::GetInstance()->GetDialPreviewInfo(fp, &preInfo);
-        if (!ret)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialPreviewInfo %s fail",
-                          dialFullName.c_str());
-            fclose(fp);
-            return -1;
-        }
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s",
-                      dialFullName.c_str());
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s",
-                      preInfo.dialName);
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s",
-                      preInfo.description);
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u",
-                      preInfo.imgId);
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader imageOffset: %u",
-                      preInfo.offset);
-        ImageInfo *info = ImageCacheManager::GetInstance().LoadOneInMultiRes(
-            preInfo.imgId, dialFullName, fp, false, preInfo.offset);
-        if (info == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail");
-            fclose(fp);
-            return -1;
-        }
-
-        dialInfo.dialFlag = 1;
-        dialInfo.id = 0;
-        dialInfo.dialFullName = dialFullName;
-        dialInfo.dialName = preInfo.dialName;
-        dialInfo.description = preInfo.description;
-        dialInfo.preImageInfo = info;
-
-        fclose(fp);
-        return 0;
+    if (!uapi_delete_files(CUSTOM_CLOCK5_DIALBACK_PATH)) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "DeleteCustomDial: Failed to delete dial background file "
+                    "for ID 5: %s",
+                    CUSTOM_CLOCK5_DIALBACK_PATH);
+      return false;
+    }
+    break;
+
+  default:
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "DeleteCustomDial: Invalid dial ID: %d", Id);
+    return false; // ID 不合法
+  }
+
+  // 所有操作成功  重新加载list
+  registeredDials.erase(Id);
+  LoadAllDial();
+  WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,
+                "DeleteCustomDial: Successfully deleted custom dial with ID %d",
+                Id);
+  return true;
+}
+
+/* 删除表盘 */
+bool SetDialModel::UninstallDial(uint16_t ID) {
+  // 增加 ID 对应
+  if (ID <= 4) {
+    ID++;
+  }
+
+  if (registeredDials.find(ID) != registeredDials.end()) {
+    // 默认表盘不删除
+    switch (ID) {
+    case MAX_DEFAULT_DIAL_ID:
+    case DEFAULT_DIAL_ID_1:
+    case DEFAULT_DIAL_ID_2:
+    case DEFAULT_DIAL_ID_3:
+    case DEFAULT_DIAL_ID_4:
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "UninstallDial: Default dial %d cannot be uninstalled", ID);
+      return false;
+
+    // 删除自定义表盘
+    case CUSTOM_DIAL_ID_1:
+    case CUSTOM_DIAL_ID_2:
+    case CUSTOM_DIAL_ID_3:
+    case CUSTOM_DIAL_ID_4:
+    case CUSTOM_DIAL_ID_5:
+      if (DeleteCustomDial(ID)) {
+        return true;
+      }
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "UninstallDial: Failed to uninstall custom dial %d", ID);
+      return false;
+
+    default:
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "UninstallDial: dial ID %d is offline dial", ID);
+      break;
+    }
+
+    // 删除文件操作
+    std::string dialFullName = APP_DOWNLOAD_DIAL_PATH;
+    dialFullName += "/";
+    dialFullName += registeredDials[ID];
+    dialFullName += ".bin";
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,
+                  "UninstallDial: Attempting to delete %s",
+                  dialFullName.c_str());
+
+    if (uapi_delete_files(dialFullName.c_str())) {
+      WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,
+                    "UninstallDial: Successfully deleted dial %d", ID);
+      registeredDials.erase(ID);
+      LoadAllDial();
+      return true;
     }
 
-    /*设置当前表盘*/
-    void SetDialModel::SaveDialSetting(uint8_t pageIndex)
-    {
-        if (pageIndex >= dialInfoList.size())
-        {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialModel SaveDialSetting [%u %u]",
-                          pageIndex, dialInfoList.size());
-            return;
-        }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UninstallDial: Failed to delete dial file %s",
+                  dialFullName.c_str());
+    return false;
+  }
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                "UninstallDial: Couldn't find the dial %d", ID);
+  return false;
+}
+/*更新表盘*/
+void SetDialModel::UpdateDialSetting(uint16_t ID) {
+  if (ID <= 4) {
+    ID++;
+  }
+  /*判断是否为当前表盘*/
+  if (currentDialID == ID) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UpdateDialSetting: Current dial cannot be updated");
+    return;
+  }
+
+  if (registeredDials.find(ID) != registeredDials.end()) {
+    std::string dialname = registeredDials[ID]; // 根据ID找到对应的表盘名称
+    // 在dialInfoList中查找同名表盘
+    for (size_t i = 0; i < dialInfoList.size(); i++) {
+      if (dialInfoList[i].dialName == dialname) {
         DialSetting diagSetting;
-        SetDialInfo &info = dialInfoList[pageIndex];
+        SetDialInfo &info = dialInfoList[i];
         diagSetting.dialFlag = info.dialFlag;
         diagSetting.dialId = info.id;
         diagSetting.dialFullName = info.dialFullName;
-        currentDialID = GetDialIdFromName(info.dialName); // 更新表盘Id
-
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "info.dialName %s info.id %d ", info.dialName.c_str(), info.id);
-        MainModel::GetInstance().AddDialSetting(diagSetting, currentDialID);
+        currentDialID = ID;
+        uapi_set_screen_on_api(); // 更新当前表盘Id
+        MainModel::GetInstance().AddDialSetting(diagSetting,
+                                                currentDialID); // 更新表盘设置
+        NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+        return; // 更新成功后直接返回
+      }
     }
+    NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+    WEARABLE_LOGD(
+        WEARABLE_LOG_MODULE_APP,
+        "SetDialModel UpdateDialSetting: Cannot find dial with name %s",
+        dialname.c_str());
+  }
+}
 
-    /*获取表盘的总数*/
-    size_t SetDialModel::GetDialCount(void)
-    {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " %d ", dialInfoList.size());
-        return dialInfoList.size();
+/*加载所有表盘*/
+void SetDialModel::LoadAllDial() {
+  dialInfoList.clear();
+  // 加载自定义表盘
+  LoadAllDialFromRam();
+  size_t dialSize = dialInfoList.size();
+  // 加载默认表盘
+  LoadAllDialFromDefult();
+  // 加载离线表盘
+  LoadAllDialFromFs();
+  /* 排序离线表盘 */
+  std::sort(dialInfoList.begin() + dialSize, dialInfoList.end(),
+            [](const SetDialInfo &f, const SetDialInfo &n) {
+              return f.dialName < n.dialName;
+            });
+
+  // 表盘Id以及表盘map打印
+  char dialId[128];
+  GetAllDialIDs(dialId);
+  PrintRegisteredDials(registeredDials);
+}
+/*加载离线表盘*/
+void SetDialModel::LoadAllDialFromFs() {
+  int ret;
+  struct dirent *direntp;
+
+  // 打开目录
+  DIR *dirp = opendir(APP_DOWNLOAD_DIAL_PATH);
+  // 遍历文件
+  if (dirp != nullptr) {
+    while ((direntp = readdir(dirp)) != nullptr) {
+      SetDialInfo dialInfo{0};
+      int ret = ParseDialHeader(DOWNLOADDIAL, direntp->d_name, dialInfo);
+      if (ret == 0) {
+        dialInfoList.push_back(dialInfo);
+      }
     }
-
-    /*获取表盘列表*/
-    std::vector<SetDialInfo> &SetDialModel::GetDialInfo(void)
-    {
-        return dialInfoList;
+  }
+  // 关闭目录
+  closedir(dirp);
+  return;
+}
+/*加载默认表盘*/
+void SetDialModel::LoadAllDialFromDefult(void) {
+  int ret;
+  struct dirent *direntp;
+
+  // 打开目录
+  DIR *dirp = opendir(APP_DEFAULT_DIAL_PATH);
+  // 遍历文件
+  if (dirp != nullptr) {
+    while ((direntp = readdir(dirp)) != nullptr) {
+      SetDialInfo dialInfo{0};
+      int ret = ParseDialHeader(DEFULTDIAL, direntp->d_name, dialInfo);
+      if (ret == 0) {
+        dialInfoList.push_back(dialInfo);
+      }
     }
+  }
+  // 关闭目录
+  closedir(dirp);
+  return;
+}
+/*通过表盘名称解析表盘 [离线表盘]*/
+int32_t SetDialModel::ParseDialHeader(int type, const std::string &dialFileName,
+                                      SetDialInfo &dialInfo) {
+  std::string dialFullName;
+  if (type == DEFULTDIAL) {
+    dialFullName = APP_DEFAULT_DIAL_PATH;
+  } else if (type == DOWNLOADDIAL) {
+    dialFullName = APP_DOWNLOAD_DIAL_PATH;
+  }
+  dialFullName += "/";
+  dialFullName += dialFileName;
+  FILE *fp = fopen(dialFullName.c_str(), "rb");
+  if (fp == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "ParseDialHeader cannot open file: %s", dialFullName.c_str());
+    return -1;
+  }
+  DialPreviewInfo preInfo{0};
+  bool ret = DialBinParser::GetInstance()->GetDialPreviewInfo(fp, &preInfo);
+  if (!ret) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialPreviewInfo %s fail",
+                  dialFullName.c_str());
+    fclose(fp);
+    return -1;
+  }
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s",
+                dialFullName.c_str());
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s",
+                preInfo.dialName);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s",
+                preInfo.description);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u",
+                preInfo.imgId);
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader imageOffset: %u",
+                preInfo.offset);
+  ImageInfo *info = ImageCacheManager::GetInstance().LoadOneInMultiRes(
+      preInfo.imgId, dialFullName, fp, false, preInfo.offset);
+  if (info == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail");
+    fclose(fp);
+    return -1;
+  }
+
+  dialInfo.dialFlag = 1;
+  dialInfo.id = 0;
+  dialInfo.dialFullName = dialFullName;
+  dialInfo.dialName = preInfo.dialName;
+  dialInfo.description = preInfo.description;
+  dialInfo.preImageInfo = info;
+
+  fclose(fp);
+  return 0;
+}
 
-    uint8_t SetDialModel::GetPageIndex(void)
-    {
-        uint8_t index = 0;
-        DialSetting dialSetting = MainModel::GetInstance().GetDialSetting();
-        for (auto iter : dialInfoList)
-        {
-            if (dialSetting.dialFlag)
-            {
-                if (strcmp(iter.dialFullName.c_str(), dialSetting.dialFullName.c_str()) == 0)
-                {
-                    return index;
-                }
-            }
-            else
-            {
-                if ((!iter.dialFlag) && (iter.id == dialSetting.dialId))
-                {
-                    return index;
-                }
-            }
-            index++;
-        }
-        return 0;
-    }
-    /* --------------------------------- 自定义表盘配置 -------------------------------- */
-    /*加载自定义表盘*/
-    void SetDialModel::LoadAllDialFromRam()
-    {
-        for (uint8_t i = DIAL_CLOCK; i < DIAL_MAX; i++)
-        {
-            // 获取表盘列表 读取自定义表盘配置
-            const DialInfo *info = MainModel::GetInstance().GetDialInfo((DialId)i);
-            if (info == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam: Dial info for ID %u is nullptr", i);
-                continue;
-            }
-
-            // 处理自定义配置文件
-            if (i != DIAL_CLOCK)
-            {
-                std::string customFilePath = GetSaveDir(i) + "/" + std::to_string(i) + ".bin";
-                if (!CheckFileExists(customFilePath))
-                {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Custom config file does not exist for ID: %u, filename: %s", i, customFilePath.c_str());
-                    continue;
-                }
-            }
-
-            // 初始化表盘信息
-            SetDialInfo dialInfo;
-            dialInfo.dialFlag = 0;
-            dialInfo.id = i;
-            dialInfo.dialName = info->dialName;
-            dialInfo.imageFullName = info->dialImg;
-
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Processing Dial ID %u: Name: %s", i, dialInfo.dialName.c_str());
-
-            // 加载图像资源
-            ImageInfo *imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false);
-            if (imageInfo == nullptr)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam load image %s failed", info->dialImg);
-                continue;
-            }
-
-            // 设置图像信息
-            dialInfo.preImageInfo = imageInfo;
-
-            // 添加到表盘列表
-            dialInfoList.push_back(dialInfo);
-
-            // 注册到map
-            // RegisterDial(dialInfo.id, dialInfo.dialName.c_str());
-
-            // 日志输出
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Parsed Dial: ID: %u, Name: %s, Image: %s",
-                          dialInfo.id, dialInfo.dialName.c_str(), dialInfo.imageFullName.c_str());
-        }
-    }
+/*设置当前表盘*/
+void SetDialModel::SaveDialSetting(uint8_t pageIndex) {
+  if (pageIndex >= dialInfoList.size()) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                  "SetDialModel SaveDialSetting [%u %u]", pageIndex,
+                  dialInfoList.size());
+    return;
+  }
+  DialSetting diagSetting;
+  SetDialInfo &info = dialInfoList[pageIndex];
+  diagSetting.dialFlag = info.dialFlag;
+  diagSetting.dialId = info.id;
+  diagSetting.dialFullName = info.dialFullName;
+  currentDialID = GetDialIdFromName(info.dialName); // 更新表盘Id
+
+  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "info.dialName %s info.id %d ",
+                info.dialName.c_str(), info.id);
+  MainModel::GetInstance().AddDialSetting(diagSetting, currentDialID);
+}
 
-    // 检查文件是否存在的辅助函数
-    bool SetDialModel::CheckFileExists(const std::string &filePath)
-    {
-        std::ifstream file(filePath);
-        return file.is_open();
-    }
-    // 测试表盘配置写文件
-    void SetDialModel::TestDialConfig()
-    {
-        DialLayout dialconfig;
-
-        /*设置表盘参数*/
-        dialconfig.dialId = 1;
-        dialconfig.batteryDisplay = 1;
-        dialconfig.timeDisplay = 0;
-        dialconfig.colorTypeSet = 5;
-
-        if (!saveDialConfig(dialconfig))
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to save dial config");
-        }
+/*获取表盘的总数*/
+size_t SetDialModel::GetDialCount(void) {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " %d ", dialInfoList.size());
+  return dialInfoList.size();
+}
+
+/*获取表盘列表*/
+std::vector<SetDialInfo> &SetDialModel::GetDialInfo(void) {
+  return dialInfoList;
+}
+
+uint8_t SetDialModel::GetPageIndex(void) {
+  uint8_t index = 0;
+  DialSetting dialSetting = MainModel::GetInstance().GetDialSetting();
+  for (auto iter : dialInfoList) {
+    if (dialSetting.dialFlag) {
+      if (strcmp(iter.dialFullName.c_str(), dialSetting.dialFullName.c_str()) ==
+          0) {
+        return index;
+      }
+    } else {
+      if ((!iter.dialFlag) && (iter.id == dialSetting.dialId)) {
+        return index;
+      }
     }
-    // 保存自定义表盘配置到文件
-    bool SetDialModel::saveDialConfig(const DialLayout &layout)
-    {
-
-        std::string filename = GetSaveDir(layout.dialId) + "/" + std::to_string(layout.dialId) + ".bin";
-
-        // 创建或打开文件
-        std::ofstream configFile(filename, std::ios::binary | std::ios::out | std::ios::trunc);
-        if (!configFile.is_open())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open config file for writing: %s", filename.c_str());
-            return false; // 文件打开失败
-        }
-
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "saveDialConfig: %d %d %d", layout.batteryDisplay, layout.timeDisplay, layout.colorTypeSet);
-
-        // 将结构体的三个数据按1个字节的存储到文件
-        configFile.put(static_cast<char>(layout.batteryDisplay)); // 第一字节:电池图标样式
-        configFile.put(static_cast<char>(layout.timeDisplay));    // 第二字节:时间label位置
-        configFile.put(static_cast<char>(layout.colorTypeSet));   // 第三字节:字体颜色
-
-        // 关闭文件
-        configFile.close();
-        return true; // 成功写入配置
+    index++;
+  }
+  return 0;
+}
+/* --------------------------------- 自定义表盘配置
+ * -------------------------------- */
+/*加载自定义表盘*/
+void SetDialModel::LoadAllDialFromRam() {
+  for (uint8_t i = DIAL_CLOCK; i < DIAL_MAX; i++) {
+    // 获取表盘列表 读取自定义表盘配置
+    const DialInfo *info = MainModel::GetInstance().GetDialInfo((DialId)i);
+    if (info == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "LoadAllDialFromRam: Dial info for ID %u is nullptr", i);
+      continue;
     }
 
-    /*
-        从配置文件读取设置
-        配置文件名:表盘ID
-        第一个字节:电池图标样式
-        第二个字节:时间label位置
-        第三个字节:字体颜色
-    */
-    bool SetDialModel::loadDialConfig(int Id, DialLayout &layout)
-    {
-        std::string filename = GetSaveDir(Id) + "/" + std::to_string(Id) + ".bin";
-        // 打开文件
-        std::ifstream configFile(filename, std::ios::binary);
-        if (!configFile.is_open())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Unable to open config file for reading: %s", filename.c_str());
-            return false; // 文件打开失败
-        }
-
-        // 读取配置
-        std::array<char, 3> settings;
-        configFile.read(settings.data(), settings.size());
-
-        if (configFile.gcount() != settings.size())
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to read configuration: %s", filename.c_str());
-            return false; // 读取失败
-        }
-
-        // 为成员变量赋值
-        layout.batteryDisplay = static_cast<BatteryDisplayType>(settings[0]); // 电池图标样式
-        layout.timeDisplay = static_cast<TimeDisplayPosition>(settings[1]);   // 时间label位置
-        layout.colorTypeSet = static_cast<ColorTypeSet>(settings[2]);         // 字体颜色
-
-        // 关闭文件
-        configFile.close();
-        return true; // 成功读取配置
+    // 处理自定义配置文件
+    if (i != DIAL_CLOCK) {
+      std::string customFilePath =
+          GetSaveDir(i) + "/" + std::to_string(i) + ".bin";
+      if (!CheckFileExists(customFilePath)) {
+        WEARABLE_LOGE(
+            WEARABLE_LOG_MODULE_APP,
+            "Custom config file does not exist for ID: %u, filename: %s", i,
+            customFilePath.c_str());
+        continue;
+      }
     }
 
-    /*创建文件夹*/
-    void SetDialModel::CreateDirectoryIfNotExists(const std::string &path)
-    {
-        struct stat info;
-        if (stat(path.c_str(), &info) != 0)
-        {
-            if (mkdir(path.c_str(), 0755) != 0)
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Could not create directory %s. Errno: %d", path.c_str(), errno);
-            }
-            else
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Created directory: %s", path.c_str());
-            }
-        }
-        else if (info.st_mode & S_IFDIR)
-        {
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Directory already exists: %s", path.c_str());
-        }
+    // 初始化表盘信息
+    SetDialInfo dialInfo;
+    dialInfo.dialFlag = 0;
+    dialInfo.id = i;
+    dialInfo.dialName = info->dialName;
+    dialInfo.imageFullName = info->dialImg;
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Processing Dial ID %u: Name: %s", i,
+                  dialInfo.dialName.c_str());
+
+    // 加载图像资源
+    ImageInfo *imageInfo =
+        ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false);
+    if (imageInfo == nullptr) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "LoadAllDialFromRam load image %s failed", info->dialImg);
+      continue;
     }
 
-    /*
-        获取存储文件夹
-        Id(0~4)通过ID返回对应的文件夹路径
-        0 {已经被用}
-        1
-        2
-        3
-        4
-    */
-    std::string SetDialModel::GetSaveDir(int Id)
-    {
-        // 首先检查Id是否在0~4的范围内
-        if (Id <= 0 || Id > 4)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Id must be between 1 and 4.");
-            return ""; // 或者返回一个空字符串
-        }
-        // 检查 APP_CUSTOM_DIAL_PATH 是否存在
-        CreateDirectoryIfNotExists(APP_CUSTOM_DIAL_PATH);
-
-        std::string folderPath = std::string(APP_CUSTOM_DIAL_PATH) + "/" + std::to_string(Id);
-        CreateDirectoryIfNotExists(folderPath); // 确保目录存在
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Directory is %s", folderPath.c_str());
-
-        return folderPath; // 返回目录路径
-    }
-    /*获取自定义表盘名*/
-    std::string SetDialModel::GetCustomName(int Id)
-    {
-        // 首先检查Id是否在0~4的范围内
-        if (Id <= 0 || Id > 4)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error: Id must be between 1 and 4.");
-            return ""; // 或者返回一个空字符串
-        }
-
-        // 获取表盘列表 读取自定义表盘配置
-        const DialInfo *info = MainModel::GetInstance().GetDialInfo((DialId)Id);
-
-        if (info == nullptr)
-        {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam: Dial info for ID %u is nullptr", Id);
-            return "";
-        }
-
-        return (info->dialName);
+    // 设置图像信息
+    dialInfo.preImageInfo = imageInfo;
+
+    // 添加到表盘列表
+    dialInfoList.push_back(dialInfo);
+
+    // 注册到map
+    // RegisterDial(dialInfo.id, dialInfo.dialName.c_str());
+
+    // 日志输出
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                  "Parsed Dial: ID: %u, Name: %s, Image: %s", dialInfo.id,
+                  dialInfo.dialName.c_str(), dialInfo.imageFullName.c_str());
+  }
+}
+
+// 检查文件是否存在的辅助函数
+bool SetDialModel::CheckFileExists(const std::string &filePath) {
+  std::ifstream file(filePath);
+  return file.is_open();
+}
+// 测试表盘配置写文件
+void SetDialModel::TestDialConfig() {
+  DialLayout dialconfig;
+
+  /*设置表盘参数*/
+  dialconfig.dialId = 1;
+  dialconfig.batteryDisplay = 1;
+  dialconfig.timeDisplay = 0;
+  dialconfig.colorTypeSet = 5;
+
+  if (!saveDialConfig(dialconfig)) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to save dial config");
+  }
+}
+// 保存自定义表盘配置到文件
+bool SetDialModel::saveDialConfig(const DialLayout &layout) {
+
+  std::string filename =
+      GetSaveDir(layout.dialId) + "/" + std::to_string(layout.dialId) + ".bin";
+
+  // 创建或打开文件
+  std::ofstream configFile(filename,
+                           std::ios::binary | std::ios::out | std::ios::trunc);
+  if (!configFile.is_open()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Unable to open config file for writing: %s",
+                  filename.c_str());
+    return false; // 文件打开失败
+  }
+
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "saveDialConfig: %d %d %d",
+                layout.batteryDisplay, layout.timeDisplay, layout.colorTypeSet);
+
+  // 将结构体的三个数据按1个字节的存储到文件
+  configFile.put(
+      static_cast<char>(layout.batteryDisplay)); // 第一字节:电池图标样式
+  configFile.put(
+      static_cast<char>(layout.timeDisplay)); // 第二字节:时间label位置
+  configFile.put(static_cast<char>(layout.colorTypeSet)); // 第三字节:字体颜色
+
+  // 关闭文件
+  configFile.close();
+  return true; // 成功写入配置
+}
+
+/*
+    从配置文件读取设置
+    配置文件名:表盘ID
+    第一个字节:电池图标样式
+    第二个字节:时间label位置
+    第三个字节:字体颜色
+*/
+bool SetDialModel::loadDialConfig(int Id, DialLayout &layout) {
+  std::string filename = GetSaveDir(Id) + "/" + std::to_string(Id) + ".bin";
+  // 打开文件
+  std::ifstream configFile(filename, std::ios::binary);
+  if (!configFile.is_open()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Unable to open config file for reading: %s",
+                  filename.c_str());
+    return false; // 文件打开失败
+  }
+
+  // 读取配置
+  std::array<char, 3> settings;
+  configFile.read(settings.data(), settings.size());
+
+  if (configFile.gcount() != settings.size()) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to read configuration: %s",
+                  filename.c_str());
+    return false; // 读取失败
+  }
+
+  // 为成员变量赋值
+  layout.batteryDisplay =
+      static_cast<BatteryDisplayType>(settings[0]); // 电池图标样式
+  layout.timeDisplay =
+      static_cast<TimeDisplayPosition>(settings[1]); // 时间label位置
+  layout.colorTypeSet = static_cast<ColorTypeSet>(settings[2]); // 字体颜色
+
+  // 关闭文件
+  configFile.close();
+  return true; // 成功读取配置
+}
+
+/*创建文件夹*/
+void SetDialModel::CreateDirectoryIfNotExists(const std::string &path) {
+  struct stat info;
+  if (stat(path.c_str(), &info) != 0) {
+    if (mkdir(path.c_str(), 0755) != 0) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "Error: Could not create directory %s. Errno: %d",
+                    path.c_str(), errno);
+    } else {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Created directory: %s",
+                    path.c_str());
     }
+  } else if (info.st_mode & S_IFDIR) {
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Directory already exists: %s",
+                  path.c_str());
+  }
+}
 
+/*
+    获取存储文件夹
+    Id(0~4)通过ID返回对应的文件夹路径
+    0 {已经被用}
+    1
+    2
+    3
+    4
+*/
+std::string SetDialModel::GetSaveDir(int Id) {
+  // 首先检查Id是否在0~5的范围内
+  if (Id <= 0 || Id > 5) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Error: Id must be between 1 and 4.");
+    return ""; // 或者返回一个空字符串
+  }
+  // 检查 APP_CUSTOM_DIAL_PATH 是否存在
+  CreateDirectoryIfNotExists(APP_CUSTOM_DIAL_PATH);
+
+  std::string folderPath =
+      std::string(APP_CUSTOM_DIAL_PATH) + "/" + std::to_string(Id);
+  CreateDirectoryIfNotExists(folderPath); // 确保目录存在
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Directory is %s", folderPath.c_str());
+
+  return folderPath; // 返回目录路径
 }
+
+std::string SetDialModel::GetSaveDir(int Id, uint8_t type) {
+  // 首先检查Id是否在0~4的范围内
+  if (Id <= 4) {
+    Id++;
+  }
+
+  if (Id <= 0 || Id > 4) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Error: Id must be between 1 and 4.");
+    return ""; // 或者返回一个空字符串
+  }
+  // 检查 APP_CUSTOM_DIAL_PATH 是否存在
+  CreateDirectoryIfNotExists(APP_CUSTOM_DIAL_PATH);
+
+  std::string folderPath =
+      std::string(APP_CUSTOM_DIAL_PATH) + "/" + std::to_string(Id);
+  CreateDirectoryIfNotExists(folderPath); // 确保目录存在
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Directory is %s", folderPath.c_str());
+
+  return folderPath; // 返回目录路径
+}
+
+/*获取自定义表盘名*/
+std::string SetDialModel::GetCustomName(int Id) {
+  // 首先检查Id是否在0~4的范围内
+  if (Id <= 4) {
+    Id++;
+  }
+
+  if (Id <= 0 || Id > 4) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "Error: Id must be between 1 and 4.");
+    return ""; // 或者返回一个空字符串
+  }
+
+  // 获取表盘列表 读取自定义表盘配置
+  const DialInfo *info = MainModel::GetInstance().GetDialInfo((DialId)Id);
+
+  if (info == nullptr) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "LoadAllDialFromRam: Dial info for ID %u is nullptr", Id);
+    return "";
+  }
+
+  return (info->dialName);
+}
+
+} // namespace OHOS
index 7fe6914..998b382 100644 (file)
@@ -833,7 +833,7 @@ void get_sedent_param(  msg_sedent_set_param_info_t * data)
 
 void ble_get_dial_path(char * buf,uint16_t id)
 {
-    char *path= (char*)OHOS::SetDialModel::GetInstance().GetSaveDir(id).c_str();
+    char *path= (char*)OHOS::SetDialModel::GetInstance().GetSaveDir(id,0).c_str();
     memcpy(buf,path,strlen(path)+1);
     return;
 }
index afa0959..73889b0 100644 (file)
@@ -6872,8 +6872,8 @@ errcode_t decode_single_dial_info(ble_read_data *buffer_handle)
     uapi_dev_runtime_set_dialname(filename);\r
     //存表盘id\r
     ble_dial_uid = dialinfo.dial_uid;\r
-    if(ble_dial_uid<=4)\r
-    ble_dial_uid++;\r
+    // if(ble_dial_uid<=4)\r
+    // ble_dial_uid++;\r
     \r
 \r
 \r