优化表盘切换
authorCaisking <Casiking@zhihuishixun.com>
Sat, 14 Mar 2026 08:03:01 +0000 (16:03 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Mon, 16 Mar 2026 03:50:31 +0000 (11:50 +0800)
code/sdk/application/wearable/n9/nativeapp/nativeui/set_dial/src/SetDialModel.cpp

index d2f5595..eab6997 100644 (file)
@@ -36,9 +36,12 @@ namespace OHOS {
 
 // 表盘map[Id--dialname] 前5个ID固定
 std::unordered_map<uint16_t, std::string> registeredDials{
-    {DEFAULT_DIAL_ID_0, "N9"},         {DEFAULT_DIAL_ID, "lake"},
-    {DEFAULT_DIAL_ID_1, "eagle"},      {DEFAULT_DIAL_ID_2, "vibrantnumber"},
-    {DEFAULT_DIAL_ID_3, "distortion"}, {MAX_DEFAULT_DIAL_ID, "science"},
+  {DEFAULT_DIAL_ID_0, "N9"},
+  {DEFAULT_DIAL_ID_1, "eagle"},
+  {DEFAULT_DIAL_ID, "lake"},
+  {DEFAULT_DIAL_ID_2, "vibrant_number"},
+  {DEFAULT_DIAL_ID_3, "distortion"},
+  {DEFAULT_DIAL_ID_MAX, "science"},
 };
 // 表盘市场UID 对应表盘name
 // 存储表盘到文件
@@ -347,79 +350,199 @@ bool SetDialModel::UninstallDial(uint16_t ID) {
 }
 /*更新表盘*/
 void SetDialModel::UpdateDialSetting(uint16_t ID) {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                "UpdateDialSetting: ========== Start ==========");
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                "UpdateDialSetting: Input ID = %d, currentDialID = %d", 
+                ID, currentDialID);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                "UpdateDialSetting: registeredDials.size() = %zu, dialInfoList.size() = %zu",
+                registeredDials.size(), dialInfoList.size());
+  
+  uint16_t originalID = ID;
   if (ID <= 4) {
     ID++;
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                  "UpdateDialSetting: ID adjusted from %d to %d (ID <= 4)", 
+                  originalID, ID);
+  } else {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                  "UpdateDialSetting: ID unchanged = %d (ID > 4)", ID);
   }
 
   /*判断是否为当前表盘 如果是自定义表盘 需要更新*/
   if (currentDialID == ID && ID >= 5) {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                  "UpdateDialSetting: Current dial %d cannot be updated %d",
+                  "UpdateDialSetting: FAILED - Current dial %d cannot be updated (same as target %d, ID >= 5)",
                   currentDialID, ID);
 #ifdef SUPPORT_BLE_SERVICE
     reply_app_send_switchDialCmd(false);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                  "UpdateDialSetting: Sent switchDialCmd(false) to app");
 #endif
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                  "UpdateDialSetting: ========== End (Same dial) ==========");
     return;
   }
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UpdateDialSetting: ID %d", ID);
+  
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                "UpdateDialSetting: Searching for ID %d in registeredDials", ID);
+  
+  // 打印 registeredDials 的内容用于调试
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                "UpdateDialSetting: registeredDials contents:");
+  for (const auto &pair : registeredDials) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                  "  ID=%d -> Name=%s", pair.first, pair.second.c_str());
+  }
+  
   if (registeredDials.find(ID) != registeredDials.end()) {
     std::string dialname = registeredDials[ID]; // 根据ID找到对应的表盘名称
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
-                  "UpdateDialSetting: Dial %s is already registered",
-                  dialname.c_str());
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UpdateDialSetting: Found dial in registeredDials: ID=%d -> Name=%s",
+                  ID, dialname.c_str());
+    
     // 在dialInfoList中查找同名表盘
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UpdateDialSetting: Searching for dial name '%s' in dialInfoList (size=%zu)",
+                  dialname.c_str(), dialInfoList.size());
+    
+    bool foundInList = false;
     for (size_t i = 0; i < dialInfoList.size(); i++) {
       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
-                    "dialInfoList name %s is already registered",
-                    (dialInfoList[i].dialName).c_str());
+                    "UpdateDialSetting: Checking dialInfoList[%zu]: name='%s', id=%d, flag=%d",
+                    i, dialInfoList[i].dialName.c_str(), dialInfoList[i].id, dialInfoList[i].dialFlag);
+      
+      // 匹配逻辑:完全匹配 或 dialName 以 dialname 开头(处理文件头中的名称包含额外描述的情况)
+      // 例如:registeredDials 中是 "classic_elegance",dialInfoList 中是 "classic_elegance鎏金简约"
+      bool nameMatches = false;
       if (dialInfoList[i].dialName == dialname) {
+        nameMatches = true;
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Exact match found");
+      } else if (dialInfoList[i].dialName.length() >= dialname.length() && 
+                 dialInfoList[i].dialName.substr(0, dialname.length()) == dialname) {
+        nameMatches = true;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Prefix match found: dialName='%s' starts with '%s'",
+                      dialInfoList[i].dialName.c_str(), dialname.c_str());
+      }
+      
+      if (nameMatches) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: MATCH FOUND at index %zu: name='%s', id=%d, flag=%d",
+                      i, dialInfoList[i].dialName.c_str(), dialInfoList[i].id, dialInfoList[i].dialFlag);
+        foundInList = true;
+        
         DialSetting diagSetting;
         SetDialInfo &info = dialInfoList[i];
         diagSetting.dialFlag = info.dialFlag;
         diagSetting.dialId = info.id;
         diagSetting.dialFullName = info.dialFullName;
+        
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Setting dial - dialFlag=%d, dialId=%d, dialFullName=%s",
+                      diagSetting.dialFlag, diagSetting.dialId, diagSetting.dialFullName.c_str());
+        
+        uint16_t oldDialID = currentDialID;
         currentDialID = ID;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Updated currentDialID from %d to %d",
+                      oldDialID, currentDialID);
+        
         uapi_set_screen_on_api(); // 更新当前表盘Id
-        MainModel::GetInstance().AddDialSetting(diagSetting,
-                                                currentDialID); // 更新表盘设置
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Called uapi_set_screen_on_api()");
+        
+        MainModel::GetInstance().AddDialSetting(diagSetting, currentDialID); // 更新表盘设置
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Called AddDialSetting(dialId=%d, currentDialID=%d)",
+                      diagSetting.dialId, currentDialID);
+        
         //运动状态下不进行页面切换
-        if (uapi_dev_runtime_get_train_status() != 1) {
-          NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);
+        int trainStatus = uapi_dev_runtime_get_train_status();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Train status = %d", trainStatus);
+        if (trainStatus != 1) {
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                        "UpdateDialSetting: Changing slice to VIEW_MAIN");
+          NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN);// 目前切换到主界面,按键监听有问题
+        } else {
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                        "UpdateDialSetting: Skipping slice change (training in progress)");
         }
+        
 #ifdef SUPPORT_BLE_SERVICE
         svr_ble_read_data_value_updata_noyify(); // app切换表盘增加id更新
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Called svr_ble_read_data_value_updata_noyify()");
         reply_app_send_switchDialCmd(true);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: Sent switchDialCmd(true) to app - SUCCESS");
 #endif
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                      "UpdateDialSetting: ========== End (SUCCESS) ==========");
         return; // 更新成功后直接返回
       }
     }
-//没有在列表找到名称
+    
+    //没有在列表找到名称
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UpdateDialSetting: FAILED - Dial name '%s' found in registeredDials but NOT in dialInfoList",
+                  dialname.c_str());
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UpdateDialSetting: dialInfoList contents:");
+    for (size_t i = 0; i < dialInfoList.size(); i++) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                    "  [%zu] name='%s', id=%d, flag=%d",
+                    i, dialInfoList[i].dialName.c_str(), dialInfoList[i].id, dialInfoList[i].dialFlag);
+    }
 #ifdef SUPPORT_BLE_SERVICE
     reply_app_send_switchDialCmd(false);
-#endif
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                  "dialInfoList name %s is already registered",
-                  dialname.c_str());
+                  "UpdateDialSetting: Sent switchDialCmd(false) to app");
+#endif
   } else {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UpdateDialSetting: FAILED - Cannot find dial ID %d in registeredDials",
+                  ID);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                  "UpdateDialSetting: Available IDs in registeredDials:");
+    for (const auto &pair : registeredDials) {
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "  ID=%d", pair.first);
+    }
 #ifdef SUPPORT_BLE_SERVICE
     reply_app_send_switchDialCmd(false);
-#endif
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
-                  "SetDialModel UpdateDialSetting: Cannot find dial %d", ID);
+                  "UpdateDialSetting: Sent switchDialCmd(false) to app");
+#endif
   }
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+                "UpdateDialSetting: ========== End (FAILED) ==========");
 }
 
 /*加载所有表盘*/
 void SetDialModel::LoadAllDial() {
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Start loading dials");
   dialInfoList.clear();
   size_t dialSize = dialInfoList.size();
   size_t aodSize = aodDialInfoList.size();
+  
   // 加载默认表盘
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Loading default dials");
   LoadAllDialFromDefult();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: After default dials, count = %d", dialInfoList.size());
+  
   // 加载自定义表盘
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Loading RAM dials");
   LoadAllDialFromRam();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: After RAM dials, count = %d", dialInfoList.size());
+  
   // 加载离线表盘
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Loading FS dials");
   LoadAllDialFromFs();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: After FS dials, count = %d", dialInfoList.size());
+  
   /* 排序离线表盘
   std::sort(dialInfoList.begin() + dialSize, dialInfoList.end(),
             [](const SetDialInfo &f, const SetDialInfo &n) {
@@ -435,6 +558,8 @@ void SetDialModel::LoadAllDial() {
             [](const SetDialInfo &f, const SetDialInfo &n) {
               return f.dialName < n.dialName;
             });
+  
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "LoadAllDial: Finished loading, total dial count = %d", dialInfoList.size());
 }
 /*加载离线表盘*/
 void SetDialModel::LoadAllDialFromFs() {
@@ -472,15 +597,11 @@ void SetDialModel::LoadAllDialFromFs() {
   加载默认表盘
 */
 const std::vector<std::string> defaultDials = {
-    "lake", "eagle", "vibrantnumber", "distortion", "science",
+  "lake", "eagle", "vibrant_number", "distortion", "science",
 };
 
 void SetDialModel::LoadAllDialFromDefult(void) {
 
-#ifdef BOARD_W9
-  return; // w9暂时没有默认表盘
-#endif
-
   DIR *dirp = opendir(APP_DEFAULT_DIAL_PATH);
   if (dirp == nullptr) {
     perror("Failed to open directory");
@@ -583,8 +704,23 @@ int32_t SetDialModel::ParseDialHeader(int type, const std::string &dialFileName,
   dialInfo.id = 0;
   dialInfo.resId = preInfo.imgId;
   dialInfo.dialFullName = dialFullName;
-  dialInfo.dialName = preInfo.dialName;
-  dialInfo.description = preInfo.description;
+  
+  // 使用文件名(去掉 .bin 后缀)作为 dialName,而不是文件头中的 dialName
+  // 这样可以保证与 registeredDials 中的名称一致(registeredDials 使用文件名)
+  // 文件头中的 dialName 可能包含额外描述(如 "classic_elegance鎏金简约"),
+  // 而文件名是 "classic_elegance.bin",去掉后缀后是 "classic_elegance"
+  std::string fileName = dialFileName;
+  size_t dotPos = fileName.find_last_of('.');
+  if (dotPos != std::string::npos) {
+    fileName = fileName.substr(0, dotPos); // 去掉 .bin 后缀
+  }
+  dialInfo.dialName = fileName; // 使用文件名作为 dialName,确保与 registeredDials 一致
+  dialInfo.description = preInfo.description; // 保留文件头中的 description 用于显示
+  
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+                "ParseDialHeader: Using filename as dialName: '%s' (file header dialName was '%s')",
+                dialInfo.dialName.c_str(), preInfo.dialName);
+  
   dialInfo.preImageInfo = info;
   dialInfo.capability = preInfo.capability;
 
@@ -629,8 +765,18 @@ void SetDialModel::SaveDialSetting(uint8_t pageIndex) {
 
 /*获取表盘的总数*/
 size_t SetDialModel::GetDialCount(void) {
-  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " %d ", dialInfoList.size());
-  return dialInfoList.size();
+  size_t count = dialInfoList.size();
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: dialInfoList.size() = %d", count);
+  
+  // 如果表盘列表为空,尝试重新加载
+  if (count == 0) {
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: dialInfoList is empty, try to reload");
+    LoadAllDial();
+    count = dialInfoList.size();
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GetDialCount: After reload, dialInfoList.size() = %d", count);
+  }
+  
+  return count;
 }
 
 /*获取表盘列表*/
@@ -990,8 +1136,7 @@ bool check_dial_freespace_(uint16_t id, uint32_t dial_size) {
 }
 
 void ble_get_dial_path_(char *buf, uint16_t id) {
-  char *path =
-      (char *)OHOS::SetDialModel::GetInstance().GetSaveDir(id, 0).c_str();
+  char *path =(char *)OHOS::SetDialModel::GetInstance().GetSaveDir(id, 0).c_str();
   memcpy(buf, path, strlen(path) + 1);
   // printf("ble_get_dial_path_ %s\n", path);
   return;
@@ -1007,13 +1152,15 @@ void ble_save_dial_custom_(msg_recv_custom_dial_info_t *data) {
 }
 
 void ble_set_dial_by_id__(uint16_t id) {
-  printf("ble_set_dial_by_id_ %d\n", id);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_set_dial_by_id__: Called with id=%d", id);
   OHOS::SetDialModel::GetInstance().UpdateDialSetting(id);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_set_dial_by_id__: UpdateDialSetting returned");
 }
 void ble_set_dial_by_id_(uint16_t id) {
-  printf("ble_set_dial_by_id %d\n", id);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_set_dial_by_id_: Called with id=%d, posting to graphic event", id);
   GraphicService::GetInstance()->PostGraphicEvent(
       std::bind(ble_set_dial_by_id__, id));
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_set_dial_by_id_: Graphic event posted");
 }
 
 void ble_get_custom_dial_(uint16_t id, char *buf) {
@@ -1053,6 +1200,7 @@ bool ble_delete_dial_(uint16_t id) {
     case OHOS::DEFAULT_DIAL_ID_1:
     case OHOS::DEFAULT_DIAL_ID_2:
     case OHOS::DEFAULT_DIAL_ID_3:
+    case OHOS::DEFAULT_DIAL_ID_MAX:
       WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
                     "UninstallDial: Default dial %d cannot be uninstalled", id);
       return false;