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 图片压缩参数如下:
// 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
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);
}
//倒计时界面确认,开始升级,定时器停止,进入升级中界面
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);
}
#include "custom_runtime.h"
#include "custom_utils.h"
#include "vibrator_service.h"
+#include "custom_runtime.h"
namespace OHOS {
static ShutdownDeviceView *g_pShutdownDeviceView{nullptr};
ShutdownDeviceView::ShutdownDeviceView()
{
+ // 关机增加震动
+ custom_VibratorFunc_int(0);
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ShutdownDeviceView::ShutdownDeviceView");
g_pShutdownDeviceView = this;
}
MediaVideoPlay *video_ = nullptr;
MediaVideoPlay *videoPlay_ = nullptr;
+ std::string currentVideoPath_; // 当前播放的视频文件路径
UIImageView *batteryimage{nullptr}; // 电池图片
UILabel *batteryLabel{nullptr}; // 电池电量
UILabel *batteryLabelBlack{nullptr}; // 黑色电量组件
// 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();
// 对话状态显示相关变量
std::string m_currentExpression; // 当前表情状态
std::string m_currentStatusText; // 当前状态文本
+ std::string m_dialogueExpression; // 对话界面表情状态
int downloadFileType = -1;
};
#include "thunderbird/include/ThunderBirdMainView.h"
#include "wearable_log.h"
#include "common/image_cache_manager.h"
+#include "custom_utils.h"
namespace OHOS
{
}
case THUNDERBIRD_ADJUSTVIEW_WARNING:
{
+ uapi_set_screen_on_api(); // 亮屏
if (TextLabel)
{
TextLabel->SetPosition(112, 148, 248, 42);
TextLabel_Y->SetRollSpeed(35);
TextLabel_Y->SetVisible(true);
}
- ThunderBirdLullabyView::UpdateLullabyText(ThunderBirdModel::GetInstance()->GetTextStr().c_str());
break;
}
case THUNDERBIRD_LULLABYVIEW_5:
//ScreenAlwaysOnCtr(OPEN_SCREEN_ALWAYS_ON); // 打开屏幕常亮
ThunderBirdModel::GetInstance()->StartTimeDisplayTimer();
ThunderBirdModel::GetInstance()->StartStatusTimer();
+
+ // 初始化当前视频路径为空
+ currentVideoPath_ = "";
}
ThunderBirdMainView::~ThunderBirdMainView()
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)
{
return false;
}
+ // 更新当前播放的视频路径
+ currentVideoPath_ = std::string(uri);
+
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Successfully switched to video: %s", uri);
return true;
}
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());
}
// 获取当前表情状态
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;
}
//通知界面-关闭通知
case ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_TASK_REMINDER://事项提醒界面-关闭通知
//回原界面
+ ThunderBirdModel::GetInstance()->HighFrequence();
ThunderBirdMainView::GetInstance()->GoBackToPreviousView();
break;
case ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_DIALOGUE_NOT_ENOUGH://提醒界面-对话不足
{
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);
}
case THUNDERBIRD_REMINDERVIEW_TASK_REMINDER:
{
+ ThunderBirdModel::GetInstance()->LowFrequence();
if (RemindIcon)
{
// 图标位置:整体居中的左侧
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
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: