优化对话过程中表情切换
authorxue <2144439972@qq.com>
Tue, 23 Dec 2025 06:26:22 +0000 (14:26 +0800)
committerxue <2144439972@qq.com>
Tue, 23 Dec 2025 06:26:22 +0000 (14:26 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp

index 165e64d..4292f75 100644 (file)
@@ -643,6 +643,28 @@ namespace OHOS
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Failed to start video play, ret=%d", ret);
             delete newPlayer;
+            newPlayer = nullptr;
+            
+            // 如果启动失败,保持lastFrameView可见,避免黑屏
+            if (lastFrameView_ != nullptr && lastFrameView_->IsVisible()) {
+                WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: New player failed to start, keeping last frame view visible to avoid black screen");
+            } else {
+                // 如果没有lastFrameView,尝试切换到默认表情,避免黑屏
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: New player failed to start and no last frame view, attempting to switch to default winking");
+                if (ThunderBirdModel::GetInstance()) {
+                    std::string defaultPath = "/user/res/video/CloseEyes/round-eyes/amber.mp4";
+                    if (access(defaultPath.c_str(), F_OK) == 0) {
+                        // 延迟切换,避免递归调用
+                        GraphicService::GetInstance()->PostGraphicEvent(
+                            [defaultPath]() {
+                                if (ThunderBirdMainView::GetInstance()) {
+                                    ThunderBirdMainView::GetInstance()->SwitchVideo(defaultPath.c_str());
+                                }
+                            });
+                    }
+                }
+            }
+            
             g_isSwitchingVideo = false;
             return false;
         }
@@ -998,6 +1020,12 @@ namespace OHOS
             }
             else if(hideView == THUNDERBIRD_DIALOGUEVIEW && (currentSubView_ == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING || currentSubView_ == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING))
             {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::ChangeView: 退出对话模式,清理资源");
+                // 等待视频切换完成,避免资源冲突
+                if (IsSwitchingVideo()) {
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::ChangeView: 等待视频切换完成");
+                    WaitForVideoSwitchComplete(2000);
+                }
                 ThunderBirdModel::GetInstance()->StopCountUpTimer();
                 ThunderBirdPresenter::GetInstance()->SetDialogueing(false);
                 ln_ws_end_audio_chat();//结束对话
index a2e3dc5..d2d978d 100644 (file)
@@ -3339,8 +3339,16 @@ extern "C" {
          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 记录时间线表情: %s", m_currentExpression.c_str());
         // 重置对话模式finished标志
         m_dialogueModeFinished = false;
+        
+        // 等待视频切换完成,避免在视频切换过程中切换表情导致冲突
+        if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::IsSwitchingVideo()) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 等待视频切换完成");
+            ThunderBirdMainView::WaitForVideoSwitchComplete(2000);
+        }
+        
         //如果本来就是眨眼的表情直接返回
         if (m_currentExpression == "winking" || m_currentExpression.empty() == true) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 已经是眨眼表情,无需切换");
             return;
         }
        
@@ -3371,6 +3379,8 @@ extern "C" {
     // 退出对话模式时恢复表情
     void ThunderBirdModel::OnExitDialogueMode()
     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 开始退出对话模式");
+        
         // 隐藏小绿点
         if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::GetInstance()->listenIcon) {
             ThunderBirdMainView::GetInstance()->listenIcon->SetVisible(false);
@@ -3378,6 +3388,12 @@ extern "C" {
         // 重置对话模式finished标志
         m_dialogueModeFinished = false;
         
+        // 等待视频切换完成,避免在视频切换过程中恢复表情导致冲突
+        if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::IsSwitchingVideo()) {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 等待视频切换完成");
+            ThunderBirdMainView::WaitForVideoSwitchComplete(2000);
+        }
+        
         // 恢复到进入对话模式前记录的时间线表情
         if (!m_currentExpression.empty()) {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 恢复时间线表情: %s", m_dialogueExpression.c_str());