From 660d0fdff23487883bc3fb4a27f2a761c24f1cb1 Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Wed, 10 Dec 2025 15:05:19 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E5=A4=8D=E7=BB=91=E5=AE=9A=E8=A7=A3?= =?utf8?q?=E7=BB=91=E4=BC=9A=E6=89=93=E6=96=ADota=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../nativeui/uiservice/src/ui_service.cpp | 89 ++++++++++++------- 1 file changed, 59 insertions(+), 30 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/uiservice/src/ui_service.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/uiservice/src/ui_service.cpp index f1b167edc..9f22c2aae 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/uiservice/src/ui_service.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/uiservice/src/ui_service.cpp @@ -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( -- 2.17.1