-#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_0 = 1028;
+constexpr uint16_t DEFAULT_DIAL_ID_1 = 111;
+constexpr uint16_t DEFAULT_DIAL_ID_2 = 112;
+constexpr uint16_t DEFAULT_DIAL_ID_3 = 113;
+constexpr uint16_t DEFAULT_DIAL_ID_4 = 114;
+constexpr uint16_t MAX_DEFAULT_DIAL_ID = 115;
+// 定义自定义表盘
+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_0, "Z1"},
#else
- {DEFAULT_DIAL_ID_1, "KUMI"},
+ {DEFAULT_DIAL_ID_0, "KUMI"}, // 为了预防显示
+ {DEFAULT_DIAL_ID_4, "obsidianrhythm"}, //默认表盘修改为 黑耀律动 TODO:ID需要更改 DEFAULT_DIAL_ID_3
#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_1, "satellite"}, // 卫星表盘
+ {DEFAULT_DIAL_ID_2, "birdie"}, // 飞鸟表盘
- 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;
+ /*
+ TODO:增加表盘
+ {DEFAULT_DIAL_ID_4, "smart_payment"}, // 智能支付表盘
+ {MAX_DEFAULT_DIAL_ID, "kumi_point"}, // kumi指针表盘
+ */
+
+};
+// 表盘市场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;
+}
- SetDialModel::SetDialModel()
- {
- readDialfile(); // 读取表盘map配置文件
- LoadAllDial(); // 更新表盘个数 当前表盘
- char idBuffer[10]; // 读取表盘Id配置文件
- int len = UtilsGetValue("dial_id", idBuffer, sizeof(idBuffer));
- if (len >= 0)
- {
- currentDialID = std::stoi(idBuffer); // 将字符串转换为整数
- }
+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() {}
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uid %d", uid);
- SetDialModel &SetDialModel::GetInstance()
- {
- static SetDialModel instance;
- return instance;
+ 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);
- /* 注册表盘map */
- void SetDialModel::RegisterDial(uint16_t ID, const char *dialname)
- {
- if (ID == 0 || strlen(dialname) == 0)
- return;
+ if (uid != 0) {
+ if (!IsDialInstalled(uid)) {
+ RegisterDial(uid, name_buf);
+ }
+ }
+ size -= (DIAL_ID_LENGTH + DIAL_NAME_LENGTH);
+ }
- registeredDials[ID] = std::string(dialname); // 唯一性
+ fclose(fp);
+ return true;
+}
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RegisterDial %d %s is ok!", ID, 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); // 将字符串转换为整数
+ }
+}
- LoadAllDial();
+SetDialModel::~SetDialModel() {}
- saveDialfile();
- }
+SetDialModel &SetDialModel::GetInstance() {
+ static SetDialModel instance;
+ return instance;
+}
+
+/* 注册表盘map */
+void SetDialModel::RegisterDial(uint16_t ID, const char *dialname) {
+
+ 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();
+ saveDialfile();
+}
+
+/* 注册表盘map_ble*/
+void SetDialModel::RegisterDial(uint16_t ID, const char *dialname,
+ uint8_t type) {
+ // 增加 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();
+ 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());
+ }
+}
- /* 打印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;
+ }
+ 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::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;
+ 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;
}
- /*加载默认表盘*/
- 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;
+ 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;
}
- /*通过表盘名称解析表盘 [离线表盘]*/
- 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;
+ 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:
+ case DEFAULT_DIAL_ID_0: // TODO: 后续修改
+ 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;
}
- /*设置当前表盘*/
- void SetDialModel::SaveDialSetting(uint8_t pageIndex)
- {
- if (pageIndex >= dialInfoList.size())
- {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialModel SaveDialSetting [%u %u]",
- pageIndex, dialInfoList.size());
- return;
- }
+ // 删除文件操作
+ 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;
+ }
+
+ 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);
+ WEARABLE_LOGE(
+ WEARABLE_LOG_MODULE_APP,
+ "SetDialModel UpdateDialSetting: Cannot find dial with name %s",
+ dialname.c_str());
+ return; // 更新成功后直接返回
+ }
}
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "UpdateDialSetting: dial ID %d is offline dial", ID);
+ }
+}
- /*获取表盘的总数*/
- 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_LOGE(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