From 12d15f36011a787b86209283b1d12eefd5da4a2e Mon Sep 17 00:00:00 2001 From: Caisking <3449750381@qq.com> Date: Wed, 12 Jun 2024 15:40:01 +0800 Subject: [PATCH] =?utf8?q?=E8=A1=A8=E7=9B=98=E6=9B=B4=E6=8D=A2=E5=A2=9E?= =?utf8?q?=E5=8A=A0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/set_dial/include/SetDialModel.h | 17 +- .../nativeui/set_dial/src/SetDialModel.cpp | 221 +++++++++++++++--- 2 files changed, 205 insertions(+), 33 deletions(-) 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 6125415a8..07dfc62cd 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 @@ -11,15 +11,25 @@ #include "UiConfig.h" #include "SetDialInfo.h" -namespace OHOS { - class SetDialModel { +namespace OHOS +{ + class SetDialModel + { public: static SetDialModel &GetInstance(void); void LoadAllDial(void); size_t GetDialCount(void); - std::vector& GetDialInfo(void); + std::vector &GetDialInfo(void); void SaveDialSetting(uint8_t pageIndex); uint8_t GetPageIndex(void); + void RegisterDial(uint16_t ID, const char *dialname); + uint16_t GetCurrentDialID(); + bool IsDialInstalled(uint16_t ID); + bool UninstallDial(uint16_t ID); + void UpdateDialSetting(uint16_t ID); + uint16_t GetDialIdFromName(const std::string &dialName); + void PrintRegisteredDials(const std::unordered_map &dials); + private: void LoadAllDialFromRam(void); void LoadAllDialFromFs(void); @@ -29,6 +39,7 @@ namespace OHOS { virtual ~SetDialModel(); int32_t ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo); std::vector dialInfoList; + uint16_t currentDialID; }; } 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 93f3e8355..215fefa4b 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,3 +1,9 @@ +/*** + * @Date: 2024-05-30 15:59:37 + * @LastEditors: Caisking 3449750381@qq.com + * @LastEditTime: 2024-06-12 10:26:15 + * @FilePath: /XTS_FD230/FD230/code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp + */ /* * Copyright (c) CompanyNameMagicTag 2021-2021. All rights reserved. * Description: SetDialModel.cpp @@ -11,9 +17,25 @@ #include "securec.h" #include "dirent.h" #include "DialBinParser.h" +#include "custom_utils.h" #include "wearable_log.h" -namespace OHOS { +namespace OHOS +{ + // 在头文件中定义常量 + constexpr uint16_t MAX_DEFAULT_DIAL_ID = 103; + constexpr uint16_t DEFAULT_DIAL_ID_1 = 1028; + constexpr uint16_t DEFAULT_DIAL_ID_2 = 1052; + + // 表盘map[Id--dialname] 前5个ID固定 + std::unordered_map registeredDials{ + {DEFAULT_DIAL_ID_1, "KUMI"}, + {DEFAULT_DIAL_ID_2, "classic"}, // 经典表盘 + {101, "motiondial"}, // 运动表盘 + {102, "kaleidoscope"}, // 万花筒表盘 + {MAX_DEFAULT_DIAL_ID, "jellyfish"}, // 水母表盘 + }; + SetDialModel::SetDialModel() {} SetDialModel::~SetDialModel() {} @@ -23,6 +45,107 @@ namespace OHOS { static SetDialModel instance; return instance; } + + /* 注册表盘map */ + void SetDialModel::RegisterDial(uint16_t ID, const char *dialname) + { + registeredDials[ID] = dialname; // 唯一性 + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "RegisterDial %s is ok!", dialname); + } + /* 打印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::GetCurrentDialID() + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "currentDialID is %d,name is %s", currentDialID, registeredDials[currentDialID].c_str()); + return currentDialID; + } + /* 判断表盘是否存在*/ + bool SetDialModel::IsDialInstalled(uint16_t 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::UninstallDial(uint16_t ID) + { + if (registeredDials.find(ID) != registeredDials.end()) + { + // 默认表盘不删除 + if (ID <= MAX_DEFAULT_DIAL_ID || ID == DEFAULT_DIAL_ID_1 || ID == DEFAULT_DIAL_ID_2) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial default dial %d fail", ID); + return false; + } + registeredDials.erase(ID); + /*删除文件操作*/ + std::string dialFullName = APP_DIAL_PATH; + dialFullName += "/"; + dialFullName += registeredDials[ID]; + dialFullName += ".bin"; + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial %s", dialFullName.c_str()); + if (uapi_delete_files(dialFullName)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UninstallDial the dial %d is ok", ID); + 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; + } + /*更新表盘*/ + void SetDialModel::UpdateDialSetting(uint16_t ID) + { + 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; + MainModel::GetInstance().AddDialSetting(diagSetting); // 更新表盘设置 + currentDialID = ID; // 更新当前表盘Id + return; // 更新成功后直接返回 + } + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialModel UpdateDialSetting: Cannot find dial with name %s", dialname.c_str()); + } + + /*加载所有表盘*/ void SetDialModel::LoadAllDial() { dialInfoList.clear(); @@ -30,23 +153,26 @@ namespace OHOS { size_t dialSize = dialInfoList.size(); LoadAllDialFromFs(); /* 只排序离线表盘 */ - std::sort(dialInfoList.begin() + dialSize, dialInfoList.end(), [](const SetDialInfo& f, const SetDialInfo& n) { - return f.dialName < n.dialName; - }); + std::sort(dialInfoList.begin() + dialSize, dialInfoList.end(), [](const SetDialInfo &f, const SetDialInfo &n) + { return f.dialName < n.dialName; }); + PrintRegisteredDials(registeredDials); } - + /*加载自定义表盘*/ void SetDialModel::LoadAllDialFromRam() { - for (uint8_t i = DIAL_CLOCK; i < DIAL_MAX; i++) { + for (uint8_t i = DIAL_CLOCK; i < DIAL_MAX; i++) + { const DialInfo *info = MainModel::GetInstance().GetDialInfo((DialId)i); - if (info != nullptr) { + if (info != nullptr) + { SetDialInfo dialInfo{0}; dialInfo.dialFlag = 0; dialInfo.id = i; dialInfo.dialName = info->dialName; dialInfo.imageFullName = info->dialImg; - ImageInfo* imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false); - if (info == nullptr) { + ImageInfo *imageInfo = ImageCacheManager::GetInstance().LoadSingleRes(info->dialImg, false); + if (info == nullptr) + { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "LoadAllDialFromRam loadimage %s fail", info->dialImg); continue; @@ -56,7 +182,7 @@ namespace OHOS { } } } - + /*加载离线表盘*/ void SetDialModel::LoadAllDialFromFs() { int ret; @@ -65,11 +191,14 @@ namespace OHOS { // 打开目录 DIR *dirp = opendir(APP_DIAL_PATH); // 遍历文件 - if (dirp != nullptr) { - while ((direntp = readdir(dirp)) != nullptr) { + if (dirp != nullptr) + { + while ((direntp = readdir(dirp)) != nullptr) + { SetDialInfo dialInfo{0}; int ret = ParseDialHeader(direntp->d_name, dialInfo); - if (ret == 0) { + if (ret == 0) + { dialInfoList.push_back(dialInfo); } } @@ -78,39 +207,42 @@ namespace OHOS { closedir(dirp); return; } - + /*通过表盘名称解析表盘*/ int32_t SetDialModel::ParseDialHeader(const std::string &dialFileName, SetDialInfo &dialInfo) { std::string dialFullName = APP_DIAL_PATH; dialFullName += "/"; dialFullName += dialFileName; FILE *fp = fopen(dialFullName.c_str(), "rb"); - if (fp == nullptr) { + if (fp == nullptr) + { WEARABLE_LOGD(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) { + if (!ret) + { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetDialPreviewInfo %s fail", dialFullName.c_str()); return -1; } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialFullName: %s", dialFullName.c_str()); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader dialName: %s", preInfo.dialName); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader description: %s", preInfo.description); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u", + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader previewImgId: %u", preInfo.imgId); - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader imageOffset: %u", + WEARABLE_LOGE(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_LOGD(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail"); + if (info == nullptr) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ParseDialHeader loadimage fail"); return -1; } @@ -121,13 +253,33 @@ namespace OHOS { dialInfo.description = preInfo.description; dialInfo.preImageInfo = info; + // 需要判断表盘是否存在 不存在->新表盘注册 + if (GetDialIdFromName(dialInfo.dialName) == 0) + { + // 找到已注册表盘中最大的ID + uint16_t maxDialId = 103; + for (auto it = registeredDials.begin(); it != registeredDials.end(); ++it) + { + if (it->first >= maxDialId && it->first != DEFAULT_DIAL_ID_1 && it->first != DEFAULT_DIAL_ID_2) + { + maxDialId = it->first; + } + } + // 分配新的表盘ID为最大ID加1 + uint16_t newDialId = maxDialId + 1; + // 注册表盘,将表盘ID和表盘文件名添加到 registeredDials 中 + RegisterDial(newDialId, (dialInfo.dialName).c_str()); + } + fclose(fp); return 0; } + /*设置表盘*/ void SetDialModel::SaveDialSetting(uint8_t pageIndex) { - if (pageIndex >= dialInfoList.size()) { + if (pageIndex >= dialInfoList.size()) + { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetDialModel SaveDialSetting [%u %u]", pageIndex, dialInfoList.size()); return; @@ -138,14 +290,17 @@ namespace OHOS { diagSetting.dialId = info.id; diagSetting.dialFullName = info.dialFullName; MainModel::GetInstance().AddDialSetting(diagSetting); + currentDialID = GetDialIdFromName(info.dialName); // 更新表盘Id } + /*获取表盘的总数*/ size_t SetDialModel::GetDialCount(void) { return dialInfoList.size(); } - std::vector& SetDialModel::GetDialInfo(void) + /*获取表盘列表*/ + std::vector &SetDialModel::GetDialInfo(void) { return dialInfoList; } @@ -154,13 +309,19 @@ namespace OHOS { { 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) { + 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)) { + } + else + { + if ((!iter.dialFlag) && (iter.id == dialSetting.dialId)) + { return index; } } -- 2.17.1