From: Caisking <3449750381@qq.com> Date: Wed, 25 Sep 2024 06:38:59 +0000 (+0800) Subject: #592 APP iOS 自定义表盘不能删除 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=4129c609569dd80b66ff4dc68d10f579face4763;p=mirrors%2FFD230.git #592 APP iOS 自定义表盘不能删除 --- diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h index 533dc0a3c..e3452215d 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h @@ -37,6 +37,7 @@ namespace OHOS void PrintRegisteredDials(const std::unordered_map &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); diff --git a/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp b/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp index 365c179e1..c4008b968 100644 --- a/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp +++ b/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp @@ -1,700 +1,837 @@ -#include -#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 -#include +#include +#include +#include +#include #include #include -#include -#include +#include #include +#include #include #include -#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 registeredDials{ +// 表盘map[Id--dialname] 前5个ID固定 +std::unordered_map 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 &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 &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 &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 &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(layout.batteryDisplay)); // 第一字节:电池图标样式 - configFile.put(static_cast(layout.timeDisplay)); // 第二字节:时间label位置 - configFile.put(static_cast(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 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(settings[0]); // 电池图标样式 - layout.timeDisplay = static_cast(settings[1]); // 时间label位置 - layout.colorTypeSet = static_cast(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(layout.batteryDisplay)); // 第一字节:电池图标样式 + configFile.put( + static_cast(layout.timeDisplay)); // 第二字节:时间label位置 + configFile.put(static_cast(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 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(settings[0]); // 电池图标样式 + layout.timeDisplay = + static_cast(settings[1]); // 时间label位置 + layout.colorTypeSet = static_cast(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 diff --git a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp index 7fe6914b1..998b38294 100644 --- a/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp +++ b/code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp @@ -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; } diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c index afa09591c..73889b02f 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c @@ -6872,8 +6872,8 @@ errcode_t decode_single_dial_info(ble_read_data *buffer_handle) uapi_dev_runtime_set_dialname(filename); //存表盘id ble_dial_uid = dialinfo.dial_uid; - if(ble_dial_uid<=4) - ble_dial_uid++; + // if(ble_dial_uid<=4) + // ble_dial_uid++;