完善对话时切换变化操作
authorxue <2144439972@qq.com>
Wed, 15 Oct 2025 07:00:51 +0000 (15:00 +0800)
committerxue <2144439972@qq.com>
Wed, 15 Oct 2025 07:00:51 +0000 (15:00 +0800)
13 files changed:
code/sdk/application/brandy/brandy_recovery/recovery_display.c
code/sdk/application/wearable/ln/nativeapp/nativeui/ota/src/OtaPresenter.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/rebootdevice/src/ShutdownDeviceView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdMainView.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdAdjustView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdLullabyView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdReminderView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/uiservice/src/ui_service.cpp
code/sdk/zhihui/leiniao/imsl_ln/ln_api_websocket.c

index fd917a6..f49f1d8 100644 (file)
@@ -111,13 +111,17 @@ static errcode_t recovery_dispay_layer_and_surface_init(ext_dpu_surface *surface
 
 void recovery_display_sample(void)
  {
+    
      errcode_t ret;
      td_handle dpu_handle;
      ext_dpu_surface surface = {0};
      ext_dpu_layer_info layer_info = {0};
-     ext_rect update_rect = {0, 0, 466, 466}; // 定义一个局部区域
+#ifdef LEINIAO
+     ext_rect update_rect = {0, 0, 360, 360}; // 定义一个局部区域
+ #else
+     ext_rect update_rect = {0, 0, 450, 450}; // 定义一个局部区域
      // ext_rect update_rect = {223, 223, 20, 20}; // 定义一个局部区域
- 
+ #endif
      recovery_dispay_layer_and_surface_init(&surface, &layer_info, &update_rect);
      // 设置layer全白色, 也可以使用接口 recovery_dispay_read_image_and_savein_surface 实现从文件系统读图片
      /* image_tool 图片压缩参数如下:
@@ -129,6 +133,8 @@ void recovery_display_sample(void)
      // memset_s((void *)surface.phy_addr, surface.size, 0xFF, surface.size);
  #ifdef SINGLE_USER_PARTITION
      recovery_dispay_read_image_and_savein_surface("/user/system/OTAUpdataRecover.bin",&surface);
+ #elif defined LEINIAO
+     recovery_dispay_read_image_and_savein_surface("/user/system/SystemUpdateing.bin",&surface);
  #else
      recovery_dispay_read_image_and_savein_surface("/system/OTAUpdataRecover.bin",&surface);
  #endif
index 6c89f37..92575aa 100644 (file)
@@ -146,6 +146,7 @@ namespace OHOS
                         if(currentView == OtaView::OTA_VIEW_UPDATE_SUCCESS)
                         OtaModel::GetInstance()->ClearNightUpdateStatus();
                         ThunderBirdModel::GetInstance()->ResetOtaStatus();
+                       // do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_EXIT_SLEEP, NULL, 0);
                         NativeAbility::GetInstance().SwitchSlice(VIEW_THUNDER_BIRD);
                     }
                     //倒计时界面确认,开始升级,定时器停止,进入升级中界面
@@ -173,11 +174,13 @@ namespace OHOS
                 else if (currentView == OtaView::OTA_VIEW_NIGHT_UPDATE_SUCCESS || currentView == OtaView::OTA_VIEW_NIGHT_UPDATE || currentView == OtaView::OTA_VIEW_COUNTDOWN) {
                     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "夜间升级界面跳转普通升级");
                     ThunderBirdModel::GetInstance()->ResetOtaStatus();
+                    //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_EXIT_SLEEP, NULL, 0);
                     NativeAbility::GetInstance().SwitchSlice(VIEW_THUNDER_BIRD);
                 }
                 else if (currentView == OtaView::OTA_VIEW_NETWORK_ERROR || currentView == OtaView::OTA_VIEW_LOW_BATTERY || currentView == OtaView::OTA_VIEW_MEMORY_ERROR ||currentView == OtaView::OTA_VIEW_UPDATE_FAILED) {
                     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "网络异常、电量不足、内存不足界面跳转普通升级");
                     ThunderBirdModel::GetInstance()->ResetOtaStatus();
+                    //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_EXIT_SLEEP, NULL, 0);
                     NativeAbility::GetInstance().SwitchSlice(VIEW_THUNDER_BIRD);
                 }
                        
index e11aece..585eb3e 100644 (file)
@@ -12,6 +12,7 @@
 #include "custom_runtime.h"
 #include "custom_utils.h"
 #include "vibrator_service.h"
+#include "custom_runtime.h"
 
 namespace OHOS {
 static ShutdownDeviceView *g_pShutdownDeviceView{nullptr};
@@ -41,6 +42,8 @@ static const char *RB_SD_PATHS[RB_SD_ANIM_FRAMES] = {
 
 ShutdownDeviceView::ShutdownDeviceView()
 {
+    // 关机增加震动
+    custom_VibratorFunc_int(0);
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShutdownDeviceView::ShutdownDeviceView");
     g_pShutdownDeviceView = this;
 }
index dbf8898..b270264 100644 (file)
@@ -95,6 +95,7 @@ namespace OHOS
 
         MediaVideoPlay *video_ = nullptr;
         MediaVideoPlay *videoPlay_ = nullptr;
+        std::string currentVideoPath_;  // 当前播放的视频文件路径
         UIImageView *batteryimage{nullptr};          // 电池图片
         UILabel *batteryLabel{nullptr};              // 电池电量
         UILabel *batteryLabelBlack{nullptr};         // 黑色电量组件
index 7ae09a3..0f68f45 100644 (file)
@@ -228,6 +228,15 @@ namespace OHOS
         // NPC表情变化处理函数
         void HandleNpcEmotionChange(const char* emotion);
         
+        // 时间线状态变化处理函数
+        void HandleTimelineStatusChange(const char* description, const char* emotion);
+        
+        // 进入对话模式时记录当前表情
+        void OnEnterDialogueMode();
+        
+        // 退出对话模式时恢复表情
+        void OnExitDialogueMode();
+        
         // 音频文本队列操作函数
         void EnqueueAudioText(const std::string& text);
         void DequeueAndPushAudioText();
@@ -309,6 +318,7 @@ namespace OHOS
         // 对话状态显示相关变量
         std::string m_currentExpression;    // 当前表情状态
         std::string m_currentStatusText;    // 当前状态文本
+        std::string m_dialogueExpression;   // 对话界面表情状态
 
         int downloadFileType = -1;
     };
index 98d01db..bba05ff 100644 (file)
@@ -2,6 +2,7 @@
 #include "thunderbird/include/ThunderBirdMainView.h"
 #include "wearable_log.h"
 #include "common/image_cache_manager.h"
+#include "custom_utils.h"
 
 namespace OHOS
 {
@@ -185,6 +186,7 @@ namespace OHOS
         }
         case THUNDERBIRD_ADJUSTVIEW_WARNING:
         {
+            uapi_set_screen_on_api(); // 亮屏
             if (TextLabel)
             {
                 TextLabel->SetPosition(112, 148, 248, 42);
index e6e52c9..15368ba 100644 (file)
@@ -374,7 +374,6 @@ namespace OHOS
                 TextLabel_Y->SetRollSpeed(35); 
                 TextLabel_Y->SetVisible(true);
             }
-            ThunderBirdLullabyView::UpdateLullabyText(ThunderBirdModel::GetInstance()->GetTextStr().c_str());
             break;
         }
         case THUNDERBIRD_LULLABYVIEW_5:
index 2872f59..8965e82 100644 (file)
@@ -76,6 +76,9 @@ namespace OHOS
         //ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 打开屏幕常亮
         ThunderBirdModel::GetInstance()->StartTimeDisplayTimer();
         ThunderBirdModel::GetInstance()->StartStatusTimer();
+        
+        // 初始化当前视频路径为空
+        currentVideoPath_ = "";
     }
 
     ThunderBirdMainView::~ThunderBirdMainView()
@@ -351,6 +354,13 @@ namespace OHOS
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Invalid parameters");
             return false;
         }
+        
+        // 检查是否尝试切换到同一个文件
+        if (currentVideoPath_ == std::string(uri))
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Already playing the same video, skipping: %s", uri);
+            return true; // 返回true表示"成功",因为不需要切换
+        }
         // 停止并销毁旧播放器
         if (videoPlay_ != nullptr)
         {
@@ -388,6 +398,9 @@ namespace OHOS
             return false;
         }
         
+        // 更新当前播放的视频路径
+        currentVideoPath_ = std::string(uri);
+        
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Successfully switched to video: %s", uri);
         return true;
     }
index f805823..f8b6446 100644 (file)
          printf("  screenImageAsEmoji_ = %d", screenImageAsEmoji_);
          
          // 初始化对话状态显示变量
-         m_currentExpression = " ";
+         m_currentExpression = "CloseEyes";
          m_currentStatusText = "发呆中...";
      }
      
         if(status == 1 || status == 2 || status == 3)//OTA升级
         {
             SetViewModel();
+            //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_ENTER_SLEEP, NULL, 0);
             NativeAbility::GetInstance().ChangeSlice(VIEW_OTA);
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "进入OTA");
         }
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "第一个文本直接显示在对话界面: %s", textId);
             }
             
+            // 直接推送到哄睡界面
+            if(ThunderBirdLullabyView::GetInstance() && currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4)
+            {
+                ThunderBirdLullabyView::GetInstance()->UpdateLullabyText(textId);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "第一个文本直接显示在哄睡界面: %s", textId);
+            }
+            
             // 不入队,避免重复显示
         } else {
             // 非第一个文本,加入队列等待音频开始播放时同步出队
                 {
                     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "检测到夜间更新已启用,切换到OTA slice");
                     // 切换到OTA slice
-                    NativeAbility::GetInstance().SwitchSlice(VIEW_OTA);
+                    //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_ENTER_SLEEP, NULL, 0);
+                    NativeAbility::GetInstance().ChangeSlice(VIEW_OTA);
                 }
             }
             view->UpdateTimeText(currentTime.c_str());
     {
         // 参数验证
         if (videoPath == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: videoPath is null");
             return false;
         }
         
+        // 再次验证文件是否存在(双重检查)
+        if (access(videoPath, F_OK) != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: file does not exist: %s", videoPath);
+            return false;
+        }
+        
+        // 预处理文件路径,确保realpath能够成功
+        std::string normalizedPath = videoPath;
+        
+        // 尝试使用realpath规范化路径
+        char resolvedPath[PATH_MAX];
+        if (realpath(videoPath, resolvedPath) != nullptr) {
+            normalizedPath = std::string(resolvedPath);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: normalized path: %s", normalizedPath.c_str());
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: realpath failed for %s, using original path", videoPath);
+            // 如果realpath失败,使用原始路径
+            normalizedPath = std::string(videoPath);
+        }
+        
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: switching to video: %s", normalizedPath.c_str());
+        
         // 通过图形服务调用 ThunderBirdMainView 的 SwitchVideo 函数
         // 注意:PostGraphicEvent 是异步的,这里直接返回 true 表示调用已提交
         GraphicService::GetInstance()->PostGraphicEvent(
-            [videoPath]() {
+            [normalizedPath]() {
                 if (ThunderBirdMainView::GetInstance()) {
-                    ThunderBirdMainView::GetInstance()->SwitchVideo(videoPath);
+                    ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str());
                 }
             });
         
          
          // 通过图形服务调用 ThunderBirdMainView 的 SwitchHair 函数
          // 注意:PostGraphicEvent 是异步的,这里直接返回 true 表示调用已提交
-         GraphicService::GetInstance()->PostGraphicEvent(
-             [hairPath]() {
+    
                  if (ThunderBirdMainView::GetInstance()) {
                      ThunderBirdMainView::GetInstance()->SwitchHair(hairPath.c_str());
                  } else {
                      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchHair: ThunderBirdMainView instance is null");
                  }
-             });
+            
          return true; // 异步调用,返回 true 表示调用已提交
      }
 
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleApiError");
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Error message: %s", message ? message : "null");
+        if(ThunderBirdMainView::GetInstance())
+        {
         int currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
         ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_ADJUSTVIEW, ThunderBirdAdjustView::THUNDERBIRD_ADJUSTVIEW_WARNING);
-        if (ThunderBirdAdjustView::GetInstance()) {
-            ThunderBirdAdjustView::GetInstance()->UpdateTaskReminderText(message);
+            if (ThunderBirdAdjustView::GetInstance()) {
+                ThunderBirdAdjustView::GetInstance()->UpdateTaskReminderText(message);
+            }
         }
     }
 
         }
         //跳转到OTA下载界
         downloadFileType = type;
+        //do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_WS_ENTER_SLEEP, NULL, 0);
         NativeAbility::GetInstance().ChangeSlice(VIEW_OTA);
     }
 
     void ThunderBirdModel::HandleAudioPlaybackEnd()
     {
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleAudioPlaybackEnd");
-        if(ThunderBirdDialogueView::GetInstance())
+        int currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
+        if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
         {
             ThunderBirdDialogueView::GetInstance()->AudioPlaybackEnd();
         }
             return;
         }
         
-        //判断对话界面当前表情
-        
         // 获取当前视图状态
         int16_t currentView = ThunderBirdMainView::GetInstance()->GetCurrentView();
         int16_t currentSubView = ThunderBirdMainView::GetInstance()->GetCurrentSubView();
         
-        // 如果当前在对话界面,更新表情显示
+        // 如果当前在对话界面,处理表情变化
         if(ThunderBirdDialogueView::GetInstance() && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)
         {
-            // 这里可以调用对话界面的表情更新函数
-             // 更新当前表情状态
-             //ThunderBirdMainView::SwitchVideo(emotion);
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情已更新: %s", emotion);
+            // 检查传入的表情是否与当前对话界面表情不同
+            if (m_dialogueExpression != emotion) {
+                // 记录新的对话界面表情
+                m_dialogueExpression = emotion;
+                
+                // 切换表情
+                std::string expressionPath = "/user/userdata/leiniao/emoji/" + eyesShape_ + "/" + eyesColor_ + "/" + "thinking" + ".mp4";
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NPC表情: %s", expressionPath.c_str());
+                //判断表情文件是否存在
+                if(access(expressionPath.c_str(), F_OK) != -1)
+                {
+                    SwitchExpressionVideo(expressionPath.c_str());
+                    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, "不在对话界面,记录表情: %s", emotion);
+        }
+    }
+    
+    // 时间线状态变化处理函数
+    void ThunderBirdModel::HandleTimelineStatusChange(const char* description, const char* emotion)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleTimelineStatusChange");
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Description: %s", description ? description : "NULL");
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Emotion: %s", emotion ? emotion : "NULL");
+        
+        if (description == nullptr || emotion == nullptr) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::HandleTimelineStatusChange: description or emotion is null");
+            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的处理逻辑
+        }
+    }
+    
+    // 进入对话模式时记录当前表情
+    void ThunderBirdModel::OnEnterDialogueMode()
+    {
+        // 记录进入对话模式前的表情,不改变当前表情
+        m_dialogueExpression = m_currentExpression;
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 记录进入对话模式前的表情: %s", m_currentExpression.c_str());
+    }
+    
+    // 退出对话模式时恢复表情
+    void ThunderBirdModel::OnExitDialogueMode()
+    {
+        // 恢复到进入对话模式前记录的表情
+        if (!m_currentExpression.empty()) {
+            SetCurrentExpression(m_currentExpression);
+            SetCurrentExpressionAndStatus();
         }
     }
     
         }
         //切换表情
         //不为屏保模式
+        std::string expressionPath;
         if(screenImageAsEmoji_ == false)
         {
             //获取当前角色配置
             //为默认表情
             if(eyesColor_.empty() == true || eyesShape_.empty() == true)
             {
-                std::string expressionPath = "/user/res/video/Default/"+ m_currentExpression + ".mp4";
+                expressionPath = "/user/res/video/Default/"+ m_currentExpression + ".mp4";
                 SwitchExpressionVideo(expressionPath.c_str());
             }
             else
             {
-                std::string expressionPath = "/user/userdata/leiniao/emoji/" + eyesShape_ + "/" + eyesColor_ + "/" + m_currentExpression + ".mp4";
+                if(m_currentExpression == "CloseEyes")//如果为眨眼表情,则在默认文件目录里面
+                {
+                    expressionPath = "/user/res/video/CloseEyes/" + eyesShape_ + "/" + eyesColor_ +  ".mp4";
+                }
+                else//非眨眼表情,则在下载文件目录里面
+                {
+                    expressionPath = "/user/userdata/leiniao/emoji/" + eyesShape_ + "/" + eyesColor_ + "/" + m_currentExpression + ".mp4";
+                }
                 //判断表情文件是否存在
                 if(access(expressionPath.c_str(), F_OK) != -1)
                 {
             
         }
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SetCurrentExpressionAndStatus: expression=%s, statusText=%s", 
-            m_currentExpression.c_str(), m_currentStatusText.c_str());
+            expressionPath.c_str(), m_currentStatusText.c_str());
     }
     
     // 获取当前表情状态
index d1b7856..d28cca2 100644 (file)
@@ -530,6 +530,9 @@ namespace OHOS
                 break;
             case ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_5:
                 do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_STORY_FINISH, NULL, 0);//确认结束哄睡
+                ai_media_play_stop();
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdDialogueView::AudioPlaybackEnd: Stopped audio playback");
+                ln_ws_end_audio_chat();//结束对话
                 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
                 break;
         }
@@ -562,6 +565,7 @@ namespace OHOS
             //通知界面-关闭通知
             case ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER://事项提醒界面-关闭通知
                 //回原界面
+                ThunderBirdModel::GetInstance()->HighFrequence();
                 ThunderBirdMainView::GetInstance()->GoBackToPreviousView();
                 break;
             case ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_DIALOGUE_NOT_ENOUGH://提醒界面-对话不足
@@ -652,23 +656,28 @@ namespace OHOS
             {
                 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
                 isDialogueing = true;
+                // 进入对话模式时记录当前表情
+                ThunderBirdModel::GetInstance()->OnEnterDialogueMode();
                 ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);//开始对话
             }
             else if(currentView == THUNDERBIRD_DIALOGUEVIEW)
             {
-                ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
-                if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING)
-                {
-                    ThunderBirdModel::GetInstance()->StopCountUpTimer();
-                }
+              
                 // 停止实际的音频播放
                 ai_media_play_stop();
                 WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdDialogueView::AudioPlaybackEnd: Stopped audio playback");
                 ln_ws_end_audio_chat();//结束对话
+                // 退出对话模式时恢复表情
                 isDialogueing = false;
+                ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
+                if(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING)
+                {
+                    ThunderBirdModel::GetInstance()->StopCountUpTimer();
+                }
+                ThunderBirdModel::GetInstance()->OnExitDialogueMode();
             }
             //当为故事模式
-            else if(currentView = THUNDERBIRD_LULLABYVIEW && currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4)
+            else if(currentView == THUNDERBIRD_LULLABYVIEW && currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_4)
             {
                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdPresenter::HandleFuncKeyLongPress");
                 ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_LULLABYVIEW, ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_5);
index c14ab40..59e8fcd 100644 (file)
@@ -148,6 +148,7 @@ namespace OHOS
         }
         case THUNDERBIRD_REMINDERVIEW_TASK_REMINDER:
         {
+            ThunderBirdModel::GetInstance()->LowFrequence();
             if (RemindIcon)
             {
                 // 图标位置:整体居中的左侧
index 27980e2..0449d59 100644 (file)
@@ -635,14 +635,50 @@ void HandNpcEmotionChangeNotify(Request *request)
     std::string emotion(static_cast<char*>(request->data), request->len);
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandNpcEmotionChangeNotify emotion = %s", emotion.c_str());
     GraphicService::GetInstance()->PostGraphicEvent(
-        std::bind(&OHOS::ThunderBirdModel::HandleNpcEmotionChange,OHOS::ThunderBirdModel::GetInstance(),emotion.c_str()));
+        std::bind(&OHOS::ThunderBirdModel::HandleNpcEmotionChange,OHOS::ThunderBirdModel::GetInstance(),const_cast<char*>(emotion.c_str())));
 }
 // 通知时间线状态变化
 void HandTimelineStatusChangeNotify(Request *request)
 {
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandTimelineStatusChangeNotify msg_id = %d", request->msgId);
+    
+    if (request->data == nullptr || request->len <= 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandTimelineStatusChangeNotify: invalid data");
+        return;
+    }
+    
+    // 解析接收到的数据:时间线状态变化信息(以'|'分隔)
+    // 格式: "description|emotion"
     std::string payload(static_cast<char*>(request->data), request->len);
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandTimelineStatusChangeNotify payload = %s", payload.c_str());
+    
+    // 解析各个字段
+    std::vector<std::string> fields;
+    std::stringstream ss(payload);
+    std::string field;
+    while (std::getline(ss, field, '|')) {
+        fields.push_back(field);
+    }
+    
+    if (fields.size() < 2) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandTimelineStatusChangeNotify: invalid payload format, expected at least 2 fields, got %zu", fields.size());
+        return;
+    }
+    
+    std::string description = fields[0];
+    std::string emotion = fields[1];
+    
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandTimelineStatusChangeNotify description = %s", description.c_str());
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_UI_SERVICE, "HandTimelineStatusChangeNotify emotion = %s", emotion.c_str());
+    
+    // 通过图形服务调用 ThunderBirdModel 的处理函数
+    GraphicService::GetInstance()->PostGraphicEvent(
+        [description, emotion]() {
+            if (OHOS::ThunderBirdModel::GetInstance()) {
+                OHOS::ThunderBirdModel::GetInstance()->HandleTimelineStatusChange(
+                    description.c_str(), emotion.c_str());
+            }
+        });
 }
 /* -------------------------------------------------------------------------- */
 #ifdef __cplusplus
index afd44be..a6c4ff4 100644 (file)
@@ -1498,7 +1498,6 @@ static void ln_ws_default_message_handler(const ws_data_msg_t *data_msg, ws_comm
             break;
         case WS_CMD_SENTENCE_PLAYBACK_COMPLETE:
             //推送文本到UI
-            push_audio_playback_start_notification();
             LN_WS_DEBUG("Default: Processing Sentence Playback Complete event\n");
             break;
         case WS_CMD_AUDIO_RECORDING_START: