表盘更换增加接口
authorCaisking <3449750381@qq.com>
Wed, 12 Jun 2024 07:40:01 +0000 (15:40 +0800)
committerCaisking <3449750381@qq.com>
Wed, 12 Jun 2024 07:40:01 +0000 (15:40 +0800)
code/sdk/application/wearable/fd230app/nativeui/set_dial/include/SetDialModel.h
code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp

index 6125415..07dfc62 100644 (file)
 #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<SetDialInfo>& GetDialInfo(void);
+        std::vector<SetDialInfo> &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<uint16_t, std::string> &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<SetDialInfo> dialInfoList;
+        uint16_t currentDialID;
     };
 }
 
index 93f3e83..215fefa 100644 (file)
@@ -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
 #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<uint16_t, std::string> 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<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::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<SetDialInfo>& SetDialModel::GetDialInfo(void)
+    /*获取表盘列表*/
+    std::vector<SetDialInfo> &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;
                 }
             }