修复绑定解绑会打断ota的bug 2904/1
authorxue <2144439972@qq.com>
Wed, 10 Dec 2025 07:05:19 +0000 (15:05 +0800)
committerxue <2144439972@qq.com>
Wed, 10 Dec 2025 07:05:19 +0000 (15:05 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/uiservice/src/ui_service.cpp

index f1b167e..9f22c2a 100644 (file)
@@ -48,7 +48,7 @@
 #include "thunderbird/include/ThunderBirdMainView.h"
 #include "thunderbird/include/ThunderBirdDialogueView.h"
 #include "ota/include/OtaModel.h"
-#include "ln_api.h"
+#include "ln_api.h"  // ln_api.h 已经包含了 ln_api_interface.h
 
 extern "C" errcode_t uapi_pm_add_sleep_veto(pm_id_t veto_id);
 extern "C" errcode_t uapi_pm_remove_sleep_veto(pm_id_t veto_id);
@@ -591,35 +591,64 @@ void HandBindAndUnbindNotify(Request *request)
     // 检查当前是否在 OTA slice
     uint16_t currentSliceId = OHOS::NativeAbility::GetInstance().GetCurSliceId();
     if (currentSliceId == VIEW_OTA) {
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandBindAndUnbindNotify: 当前在 OTA slice,退出下载并切换回 ThunderBird");
-        
-        // 停止 OTA 倒计时定时器(如果正在倒计时)
-        OHOS::OtaModel::GetInstance()->StopCountdownTimer();
-        
-        // 重置 OTA 状态
-        OHOS::ThunderBirdModel::GetInstance()->ResetOtaStatus();
-        
-        // 清空下载文件类型,防止切换到 ThunderBird 后自动恢复下载
-        OHOS::ThunderBirdModel::GetInstance()->ClearDownloadFile();
-        
-        // 切换回 ThunderBird slice
-        OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_THUNDER_BIRD);
-        
-        // 等待 slice 切换完成后再执行解绑逻辑
-        // 使用 PostGraphicEvent 确保在下一个图形事件循环中执行解绑
-        GraphicService::GetInstance()->PostGraphicEvent([is_bind]() {
-            // 再次检查是否已经切换回 ThunderBird slice
-            uint16_t sliceId = OHOS::NativeAbility::GetInstance().GetCurSliceId();
-            if (sliceId == VIEW_THUNDER_BIRD) {
-                // 执行解绑逻辑
-                OHOS::ThunderBirdModel::GetInstance()->HandleBindAndUnbind(is_bind);
-            } else {
-                // 如果还没切换完成,延迟一下再执行
-                GraphicService::GetInstance()->PostGraphicEvent([is_bind]() {
-                    OHOS::ThunderBirdModel::GetInstance()->HandleBindAndUnbind(is_bind);
-                });
-            }
-        });
+          // 检查当前OTA状态和下载文件类型
+          int otaStatus = OHOS::OtaModel::GetInstance()->GetOtaStatus();
+          int downloadFileType = OHOS::ThunderBirdModel::GetInstance()->GetDownloadFile();
+          
+          // 判断是否是OTA升级或Cat1升级
+          bool isOtaUpgrade = (otaStatus == OTA_UI_STATUS_FORCE_START || 
+                              otaStatus == OTA_UI_STATUS_OPTIONAL_START || 
+                              otaStatus == OTA_UI_STATUS_CAT1_START);
+          
+          // 判断是否是下载表情或屏保
+          bool isFileDownload = (downloadFileType == DOWNLOAD_FILE_TYPE_SCREEN_IMAGE || 
+                                downloadFileType == DOWNLOAD_FILE_TYPE_EMOJI);
+          
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandBindAndUnbindNotify: 当前在 OTA slice, otaStatus=%d, downloadFileType=%d", 
+                       otaStatus, downloadFileType);
+          
+          // 如果是OTA升级或Cat1升级,不允许退出
+          if (isOtaUpgrade) {
+              WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandBindAndUnbindNotify: 当前正在进行OTA/Cat1升级,不允许退出");
+              return;  // 直接返回,不执行解绑逻辑
+          }
+          
+          // 如果是下载表情或屏保,允许退出
+          if (isFileDownload) {
+              WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandBindAndUnbindNotify: 当前在下载表情/屏保,退出下载并切换回 ThunderBird");
+              
+              // 停止 OTA 倒计时定时器(如果正在倒计时)
+              OHOS::OtaModel::GetInstance()->StopCountdownTimer();
+              
+              // 重置 OTA 状态
+              OHOS::ThunderBirdModel::GetInstance()->ResetOtaStatus();
+              
+              // 清空下载文件类型,防止切换到 ThunderBird 后自动恢复下载
+              OHOS::ThunderBirdModel::GetInstance()->ClearDownloadFile();
+              
+              // 切换回 ThunderBird slice
+              OHOS::NativeAbility::GetInstance().SwitchSlice(VIEW_THUNDER_BIRD);
+              
+              // 等待 slice 切换完成后再执行解绑逻辑
+              // 使用 PostGraphicEvent 确保在下一个图形事件循环中执行解绑
+              GraphicService::GetInstance()->PostGraphicEvent([is_bind]() {
+                  // 再次检查是否已经切换回 ThunderBird slice
+                  uint16_t sliceId = OHOS::NativeAbility::GetInstance().GetCurSliceId();
+                  if (sliceId == VIEW_THUNDER_BIRD) {
+                      // 执行解绑逻辑
+                      OHOS::ThunderBirdModel::GetInstance()->HandleBindAndUnbind(is_bind);
+                  } else {
+                      // 如果还没切换完成,延迟一下再执行
+                      GraphicService::GetInstance()->PostGraphicEvent([is_bind]() {
+                          OHOS::ThunderBirdModel::GetInstance()->HandleBindAndUnbind(is_bind);
+                      });
+                  }
+              });
+          } else {
+              // 既不是OTA升级,也不是文件下载,可能是其他状态,不允许退出
+              WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandBindAndUnbindNotify: 当前OTA状态未知,不允许退出");
+              return;
+          }
     } else {
         // 不在 OTA slice,正常执行解绑逻辑
         GraphicService::GetInstance()->PostGraphicEvent(