修复对话表情黑屏Bug
authorxue <2144439972@qq.com>
Fri, 17 Oct 2025 11:48:13 +0000 (19:48 +0800)
committerxue <2144439972@qq.com>
Fri, 17 Oct 2025 11:48:13 +0000 (19:48 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp

index 0f55d87..cf779e3 100644 (file)
@@ -37,6 +37,7 @@
 #include "font/ui_font.h"
 #include "ln_api.h"
 #include <unistd.h>
+#include <sys/stat.h>
 #include "vibrator_service.h"
 #include "ai_media.h"
  #define JUHEPINGTAI 0
         ThunderBirdMainView *view = ThunderBirdMainView::GetInstance();
         if (view) {
             std::string currentTime = GetCurrentTimeStr();
-            // 检查夜间更新状态(每天凌晨2点检查)
-            if(currentTime == "2:00")
-            {
-                // 从KV存储中读取夜间更新状态
-                char temp[10] = { 0 };
-                (void)UtilsGetValue("night_update_enabled", temp, 10);
-                if(strcmp(temp, "1") == 0)
-                {
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测到夜间更新已启用,切换到OTA slice");
-                    // 切换到OTA slice
-                    //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_ENTER_SLEEP, NULL, 0);
-                    AI_ForceInterrupt();
-                    ln_ws_send_voice_chat_interrupt("切换slice");
-                    NativeAbility::GetInstance().ChangeSlice(VIEW_OTA);
-                }
-            }
             view->UpdateTimeText(currentTime.c_str());
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "TimeDisplayCallback: %s", currentTime.c_str());
         }
             return false;
         }
         
+        // 检查文件大小,确保文件不为空
+        struct stat fileStat;
+        if (stat(videoPath, &fileStat) != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: cannot get file stat: %s", videoPath);
+            return false;
+        }
+        
+        if (fileStat.st_size == 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: file is empty: %s", videoPath);
+            return false;
+        }
+        
         // 预处理文件路径,确保realpath能够成功
         std::string normalizedPath = videoPath;
         
         
         // 通过图形服务调用 ThunderBirdMainView 的 SwitchVideo 函数
         // 注意:PostGraphicEvent 是异步的,这里直接返回 true 表示调用已提交
-        GraphicService::GetInstance()->PostGraphicEvent(
-            [normalizedPath]() {
+        //GraphicService::GetInstance()->PostGraphicEvent(
+        //    [normalizedPath]() {
                 if (ThunderBirdMainView::GetInstance()) {
                     ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str());
                 }
-            });
+            //});
         
         return true; // 异步调用,返回 true 表示调用已提交
     }
         if (ThunderBirdMainView::GetInstance()) {
             int currentView = ThunderBirdMainView::GetInstance()->GetCurrentView(); //获取当前视图
             ln_ws_audio_deinit();//功耗优化
-            ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_5);
+            //直接退出到状态显示界面
+            AI_ForceInterrupt();
+            ln_ws_send_voice_chat_interrupt("退出哄睡");
+            ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
         } else {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView instance is null, cannot end sleep mode");
         }
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleDownloadFile");
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Download type: %d", type);
+        //跳转到OTA下载界
+        downloadFileType = type;
         if(ThunderBirdModel::GetOtaStatus() != 0)
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleDownloadFile: OTA正在升级,跳过下载");
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleDownloadFile: Unknown download type: %d", type);
                 break;
         }
-        //跳转到OTA下载界
-        downloadFileType = type;
         //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_ENTER_SLEEP, NULL, 0);
         AI_ForceInterrupt();
         ln_ws_send_voice_chat_interrupt("开始下载");
         if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
         {
             // 检查传入的表情是否与当前对话界面表情不同
-            if (m_dialogueExpression != emotion) {
+            if (m_dialogueExpression != emotion && emotion != m_currentExpression) {
                 // 记录新的对话界面表情
                 m_dialogueExpression = emotion;
                 
                 // 切换表情
+                //if(emotion == "winking")
                 std::string expressionPath = "/user/userdata/leiniao/emoji/" + eyesShape_ + "/" + eyesColor_ + "/" + "thinking" + ".mp4";
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情: %s", expressionPath.c_str());
                 //判断表情文件是否存在
                 }
                 else
                 {
-
                     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情不存在: %s", expressionPath.c_str());
                 }
-            } else {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情未变化,跳过更新: %s", emotion);
+            } 
+            else
+            {
+             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情未变化,跳过更新: %s", emotion);
             }
         }
-        else
+        else//其他界面,则为时间线的状态表情变化
         {
-            // 不在对话界面时,记录传入的表情但不切换
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "不在对话界面,记录表情: %s", emotion);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "不在对话界面,不处理NPC表情变化");
         }
+        return;
     }
     
     // 时间线状态变化处理函数
         }
         
         // 处理时间线状态变化
-        // 这里可以根据description和emotion进行相应的处理
-        // 例如:更新UI显示、记录状态变化等
-        
-        // 如果emotion不为空,可以调用表情变化处理
-        if (strlen(emotion) > 0) {
-            HandleNpcEmotionChange(emotion);
-        }
-        
-        // 可以根据description进行其他处理
-        // 例如:更新状态文本、记录日志等
-        if (strlen(description) > 0) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "时间线状态描述: %s", description);
-            // 这里可以添加更多基于description的处理逻辑
+        if(strlen(description) > 0 && strlen(emotion) > 0)
+        {
+            SetCurrentStatusText(description);
+            SetCurrentExpression(emotion);
+            SetCurrentExpressionAndStatus(); //更新当前表情和状态文本
         }
     }
     
                 expressionPath = "/user/res/video/Default/"+ m_currentExpression + ".mp4";
                 SwitchExpressionVideo(expressionPath.c_str());
             }
-            else
+            else//非默认表情
             {
                 if(m_currentExpression == "CloseEyes")//如果为眨眼表情,则在默认文件目录里面
                 {
         return m_currentStatusText;
     }
 
+    //获取下载文件类型
     int ThunderBirdModel::GetDownloadFile()
     {
         return downloadFileType;
     }
 
+    //清空下载文件类型
+    void ThunderBirdModel::ClearDownloadFile()
+    {
+        downloadFileType = -1;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::ClearDownloadFile: 下载文件类型已清空");
+    }
+
     //减低视频帧率 开启对话调用开启
    void ThunderBirdModel::LowFrequence()
    {
        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::ClearAudioTextQueue: 音频文本队列已清空");
    }
 
+   //夜间更新处理
+   void ThunderBirdModel::HandleNightUpdate()
+   {
+      // 从KV存储中读取夜间更新状态
+      char temp[10] = { 0 };
+      (void)UtilsGetValue("night_update_enabled", temp, 10);
+      if(strcmp(temp, "1") == 0)
+      {
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测到夜间更新已启用,切换到OTA slice");
+          AI_ForceInterrupt();
+          ln_ws_send_voice_chat_interrupt("切换slice");
+          NativeAbility::GetInstance().ChangeSlice(VIEW_OTA);
+      }
+   }
 
 }
  
\ No newline at end of file
index 7157c30..1edbc4e 100644 (file)
@@ -660,8 +660,10 @@ namespace OHOS
                 isDialogueing = true;
                 // 进入对话模式时记录当前表情
                 ThunderBirdModel::GetInstance()->OnEnterDialogueMode();
-                ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);//开始对话
                 ln_ws_audio_init();//功耗优化
+                //do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_INIT, NULL, 0);
+                ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);//开始对话
+                
             }
             else if(currentView == THUNDERBIRD_DIALOGUEVIEW)
             {
@@ -670,10 +672,12 @@ namespace OHOS
                 // ai_media_play_stop();
                 // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdDialogueView::AudioPlaybackEnd: Stopped audio playback");
                 ln_ws_end_audio_chat();//结束对话
-                ln_ws_audio_deinit();//功耗优化
+                
                 // 退出对话模式时恢复表情
                 AI_ForceInterrupt();
                 ln_ws_send_voice_chat_interrupt("退出对话");
+                ln_ws_audio_deinit();//功耗优化
+                //do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_AUDIO_DEINIT, NULL, 0);
                 isDialogueing = false;
                 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
                 if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING)