#1057手表,表盘排序
authorCaisking <3449750381@qq.com>
Tue, 22 Oct 2024 03:03:37 +0000 (11:03 +0800)
committerCaisking <3449750381@qq.com>
Tue, 22 Oct 2024 03:03:37 +0000 (11:03 +0800)
code/sdk/application/wearable/fd230app/nativeui/set_dial/src/SetDialModel.cpp

index 850dfff..825b108 100644 (file)
@@ -22,6 +22,7 @@
 #include <string>
 #include <sys/stat.h>
 #include <unistd.h>
+#include <unordered_set>
 
 extern "C" {
 void check_dial_space() { OHOS::SetDialModel::GetInstance().CheckDialSpace(); }
@@ -445,19 +446,19 @@ void SetDialModel::UpdateDialSetting(uint16_t ID) {
 /*加载所有表盘*/
 void SetDialModel::LoadAllDial() {
   dialInfoList.clear();
-  // 加载自定义表盘
-  LoadAllDialFromRam();
   size_t dialSize = dialInfoList.size();
   // 加载默认表盘
   LoadAllDialFromDefult();
+  // 加载自定义表盘
+  LoadAllDialFromRam();
   // 加载离线表盘
   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, 128);
@@ -484,26 +485,56 @@ void SetDialModel::LoadAllDialFromFs() {
   closedir(dirp);
   return;
 }
-/*加载默认表盘*/
+/*
+  加载默认表盘
+*/
+const std::vector<std::string> defaultDials = {
+    "obsidianrhythm", "mirrorvoyager", "satellite", "dawninsight", "birdie"};
+
 void SetDialModel::LoadAllDialFromDefult(void) {
-  int ret;
+  DIR *dirp = opendir(APP_DEFAULT_DIAL_PATH);
+  if (dirp == nullptr) {
+    perror("Failed to open directory");
+    return;
+  }
+
   struct dirent *direntp;
+  std::unordered_set<std::string> availableDials;
+
+  // 收集可用的表盘名称
+  while ((direntp = readdir(dirp)) != nullptr) {
+    if (direntp->d_name[0] != '.') {
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                    "LoadAllDialFromDefult: Found dial %s", direntp->d_name);
+      availableDials.insert(direntp->d_name);
+    }
+  }
 
-  // 打开目录
-  DIR *dirp = opendir(APP_DEFAULT_DIAL_PATH);
-  // 遍历文件
-  if (dirp != nullptr) {
-    while ((direntp = readdir(dirp)) != nullptr) {
+  closedir(dirp);
+
+  // 按照指定顺序加载表盘
+  for (const auto &dialName : defaultDials) {
+    std::string fullDialName = dialName + ".bin";
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Checking for dial: %s",
+                  fullDialName.c_str()); 
+
+    if (availableDials.count(fullDialName)) {
       SetDialInfo dialInfo{0};
-      int ret = ParseDialHeader(DEFULTDIAL, direntp->d_name, dialInfo);
+      int ret = ParseDialHeader(DEFULTDIAL, fullDialName,
+                                dialInfo); 
       if (ret == 0) {
         dialInfoList.push_back(dialInfo);
+      } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "ParseDialHeader is error for file %s",
+                      fullDialName.c_str());
       }
+    } else {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "LoadAllDialFromDefult: Cannot find dial %s",
+                    fullDialName.c_str()); // 记录找不到文件的详细信息
     }
   }
-  // 关闭目录
-  closedir(dirp);
-  return;
 }
 /*通过表盘名称解析表盘 [离线表盘]*/
 int32_t SetDialModel::ParseDialHeader(int type, const std::string &dialFileName,
@@ -909,7 +940,8 @@ bool SetDialModel::CheckDialDownload(uint16_t ID, uint32_t dial_size) {
   download_DialID = ID;
   download_dialSize = dial_size;
 
-  // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CHECK_DIAL_SPACE, nullptr,0);
+  // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_CHECK_DIAL_SPACE,
+  // nullptr,0);
   CheckDialSpace();
 
   WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "CheckDialDownload: %d",