修复设备解绑已经解绑但是不重启的问题
authorxue <2144439972@qq.com>
Thu, 22 Jan 2026 01:52:19 +0000 (09:52 +0800)
committerxue <2144439972@qq.com>
Thu, 22 Jan 2026 01:52:19 +0000 (09:52 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp

index 0bb0f00..4d181f9 100644 (file)
@@ -40,6 +40,8 @@ namespace OHOS
         void StopOtaCountdown(void);
         void StartCountUpTimer(uint32_t targetSeconds);
         void StopCountUpTimer(void);
+        void StartFactoryResetTimer(uint32_t delaySeconds);
+        void StopFactoryResetTimer(void);
         int GetCountUpValue() const;
         
         // 常亮屏刷新定时器(用于压测模式,每50分钟刷新一次,避免1小时超时)
@@ -452,9 +454,13 @@ namespace OHOS
         bool m_firstStoryAudioPlayed = false; // 故事模式第一句音频是否已播放完成
         void* m_storyModeTimeoutTimer;        // 故事模式超时定时器(1分钟无文本切换则退出)
         void* m_storyAudioPlaybackTimeoutTimer;  // 故事模式音频播放超时定时器(5秒内无音频播放则退出)
+        void* m_factoryResetTimer;              // 恢复出厂设置定时器
         
         // 对话模式相关标志
         bool m_dialogueModeFinished = false; // 对话模式是否已finished(收到finished=true)
+
+        // 解绑恢复出厂设置相关标志
+        bool m_pending_factory_reset = false; // 待执行恢复出厂设置标志
         
         // 屏保关闭标志(用于记录在进入对话/哄睡时是否关闭了屏保)
         bool m_screenImageClosedForDialogue = false; // 进入对话模式时是否关闭了屏保
index 3d9b234..86e5966 100644 (file)
@@ -120,6 +120,7 @@ extern "C" {
                                            m_otaCountdownActive(false), m_otaCountdownValue(0),
                                            m_countUpActive(false), m_countUpValue(0), m_countUpTarget(0),
                                            m_alwaysOnRefreshActive(false), m_alwaysOnRefreshTime(0),
+                                           m_pending_factory_reset(false), m_factoryResetTimer(nullptr),
                                            m_currentFps(60), 
                                            m_simStatus(0), m_cat1PowerStatus(0), m_signalStrength(0),
                                           m_networkStatus(0), m_networkType(0),
@@ -389,15 +390,60 @@ extern "C" {
          }
      }
      
-     void ThunderBirdModel::StopStoryModeTimeoutTimer(void)
-     {
-         if (m_storyModeTimeoutTimer != nullptr) {
-             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopStoryModeTimeoutTimer: 停止故事模式超时定时器");
-             osTimerStop(m_storyModeTimeoutTimer);
-             osTimerDelete(m_storyModeTimeoutTimer);
-             m_storyModeTimeoutTimer = nullptr;
-         }
-     }
+    void ThunderBirdModel::StopStoryModeTimeoutTimer(void)
+    {
+        if (m_storyModeTimeoutTimer != nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopStoryModeTimeoutTimer: 停止故事模式超时定时器");
+            osTimerStop(m_storyModeTimeoutTimer);
+            osTimerDelete(m_storyModeTimeoutTimer);
+            m_storyModeTimeoutTimer = nullptr;
+        }
+    }
+
+    /**
+     * @brief 启动恢复出厂设置定时器
+     * @param delaySeconds 延迟秒数
+     */
+    void ThunderBirdModel::StartFactoryResetTimer(uint32_t delaySeconds)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StartFactoryResetTimer: delaySeconds=%u", delaySeconds);
+
+        // 如果定时器已存在,先停止
+        if (m_factoryResetTimer != nullptr) {
+            StopFactoryResetTimer();
+        }
+
+        // 创建一次性定时器
+        m_factoryResetTimer = osTimerNew((osTimerFunc_t)FactoryResetTimerCallback, osTimerOnce, nullptr, nullptr);
+        if (m_factoryResetTimer == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to create factory reset timer");
+            return;
+        }
+
+        // 启动定时器
+        osStatus_t ret = osTimerStart(m_factoryResetTimer, delaySeconds * 1000);
+        if (ret != osOK) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to start factory reset timer, ret=%d", ret);
+            osTimerDelete(m_factoryResetTimer);
+            m_factoryResetTimer = nullptr;
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Factory reset timer started: %u seconds", delaySeconds);
+        }
+    }
+
+    /**
+     * @brief 停止恢复出厂设置定时器
+     */
+    void ThunderBirdModel::StopFactoryResetTimer(void)
+    {
+        if (m_factoryResetTimer != nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "StopFactoryResetTimer: 停止恢复出厂设置定时器");
+            osTimerStop(m_factoryResetTimer);
+            osTimerDelete(m_factoryResetTimer);
+            m_factoryResetTimer = nullptr;
+            m_pending_factory_reset = false;
+        }
+    }
      
      // 故事模式超时处理函数
      void ThunderBirdModel::HandleStoryModeTimeout(void)
@@ -498,6 +544,22 @@ extern "C" {
              }
          }
      }
+
+     /**
+      * @brief 处理恢复出厂设置
+      */
+     void ThunderBirdModel::HandleFactoryReset(void)
+     {
+         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleFactoryReset: 执行恢复出厂设置");
+
+         if (m_pending_factory_reset) {
+             m_pending_factory_reset = false;
+             restore_factory_settings();
+         }
+
+         // 停止定时器
+         StopFactoryResetTimer();
+     }
      
      // 故事模式音频播放超时定时器回调函数
      static void StoryAudioPlaybackTimeoutTimerCallback(uint8_t data)
@@ -1533,6 +1595,14 @@ extern "C" {
                  ThunderBirdModel::GetInstance()->HandleStoryModeTimeout();
              }));
      }
+
+     static void FactoryResetTimerCallback(uint8_t data)
+     {
+         GraphicService::GetInstance()->PostGraphicEvent(
+             std::bind([]() {
+                 ThunderBirdModel::GetInstance()->HandleFactoryReset();
+             }));
+     }
      
     /**
      * @brief 启动时间显示定时器
@@ -1988,15 +2058,18 @@ extern "C" {
                         }
                     }
                     // 检查是否是绑定成功界面,需要跳转到对话界面
-                    else if (currentView == THUNDERBIRD_ADJUSTVIEW && 
+                     else if (currentView == THUNDERBIRD_ADJUSTVIEW &&
                              currentSubView == ThunderBirdAdjustView::THUNDERBIRD_ADJUSTVIEW_BIND_SUCCESS) {
                             if (bind_status == false) {
-                                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "解绑警告界面超时,恢复出厂设置");
-                                // AI_ForceInterrupt();
-                                ln_ws_send_voice_chat_interrupt("恢复出厂设置");
-                                do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
-                                restore_factory_settings();
-                            } 
+                                // 解绑状态,检查是否有待处理的工厂重置
+                                if (m_pending_factory_reset) {
+                                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "解绑警告界面超时,恢复出厂设置");
+                                    // AI_ForceInterrupt();
+                                    ln_ws_send_voice_chat_interrupt("恢复出厂设置");
+                                    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
+                                    HandleFactoryReset();
+                                }
+                            }
                             else {
                             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "绑定成功界面超时,跳转到对话界面");
                             ThunderBirdModel::GetInstance()->ota_update_boot(); // 绑定成功后获取ota升级任务
@@ -3368,12 +3441,16 @@ extern "C" {
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleBindAndUnbind: 设备已解绑,显示解绑警告");
                 uapi_set_screen_on_api();
                 bind_status = false;//解绑标志值位,用于界面跳转真正解绑放到出厂设置里面
+
+                // 直接启动恢复出厂设置的定时器,不依赖界面状态
+                m_pending_factory_reset = true;
+                ThunderBirdModel::GetInstance()->StartFactoryResetTimer(1); // 2秒后恢复出厂设置
+
                 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_ADJUSTVIEW, ThunderBirdAdjustView::THUNDERBIRD_ADJUSTVIEW_BIND_SUCCESS);
                 if(ThunderBirdAdjustView::GetInstance())
                 {
                     ThunderBirdAdjustView::GetInstance()->ShowUnbindWarning();
                 }
-                ThunderBirdModel::GetInstance()->StartCountUpTimer(1); // 2秒后恢复出厂设置
                 return;
             }
         }