void Show(int16_t showView);
void HideAll();
// 音量/进度调节接口(用于 THUNDERBIRD_REMINDERVIEW_VOLUME)
- void AdjustRemindProgress(int16_t delta); // 正数增加,负数减少
- void SetRemindProgress(int16_t value);
+ void AdjustRemindProgress(int16_t delta); // 正数增加,负数减少(只更新UI,延迟应用真实音量)
+ void SetRemindProgress(int16_t value); // 立即设置真实音量
+ void ApplyPendingVolume(); // 应用待设置的音量值(在界面隐藏时调用)
+ bool IsVolumeViewVisible() const; // 检查音量界面是否正在显示
// 任务提醒文本更新接口(用于 THUNDERBIRD_REMINDERVIEW_TASK_REMINDER)
void UpdateTaskReminderText(const char* title, const char* content);
// 进度当前值(用于音量界面),0~100
int16_t remindProgressValue_{50};
+
+ // 待应用的真实音量值(延迟应用音量时使用)
+ int16_t pendingVolumeValue_{-1}; // -1表示没有待应用的值
};
}
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartReminderHideTimer: intervalMs=%u", intervalMs);
- // 如果已经有倒计时在进行,先停止并隐藏上一次的提醒
+ auto *reminder = ThunderBirdReminderView::GetInstance();
+ bool isVolumeViewVisible = (reminder != nullptr && reminder->IsVolumeViewVisible());
+
+ // 如果已经有倒计时在进行
if (m_reminderHideActive) {
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartReminderHideTimer: Previous timer active, hiding previous reminder");
- auto *reminder = ThunderBirdReminderView::GetInstance();
- if (reminder != nullptr) {
- reminder->HideAll();
+ // 如果音量界面正在显示,只重新启动定时器(再延时),不隐藏界面
+ if (isVolumeViewVisible) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartReminderHideTimer: Volume view visible, restarting timer only (extend by %u ms)", intervalMs);
+ m_reminderHideTime = intervalMs / 1000; // 重新设置倒计时时间
+ // 确保时间显示定时器正在运行
+ if (m_timeDisplayTimer == nullptr) {
+ StartTimeDisplayTimer(1000); // 1秒间隔
+ }
+ return; // 直接返回,不隐藏界面
+ } else {
+ // 音量界面未显示,隐藏上一次的提醒
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StartReminderHideTimer: Previous timer active, hiding previous reminder");
+ if (reminder != nullptr) {
+ reminder->HideAll();
+ }
+ // 重置之前的倒计时状态
+ m_reminderHideActive = false;
}
- // 重置之前的倒计时状态
- m_reminderHideActive = false;
- //close_battery_flag = false;
}
// 设置提醒隐藏定时器状态
if(m_reminderHideTime == 5)//电量过低即将关机提醒
close_battery_flag = true;
- // 隐藏全部提醒界面,准备显示新的
- auto *reminder = ThunderBirdReminderView::GetInstance();
- if (reminder != nullptr) {
- reminder->HideAll();
+ // 如果音量界面未显示,隐藏全部提醒界面,准备显示新的
+ if (!isVolumeViewVisible) {
+ if (reminder != nullptr) {
+ reminder->HideAll();
+ }
}
// 确保时间显示定时器正在运行
StartTimeDisplayTimer(1000); // 1秒间隔
}
- WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reminder hide timer started: %d seconds, close_battery_flag=%d", m_reminderHideTime, close_battery_flag);
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Reminder hide timer started: %d seconds, close_battery_flag=%d, isVolumeViewVisible=%d",
+ m_reminderHideTime, close_battery_flag, isVolumeViewVisible);
}
// ---------------------- OTA 倒计时定时器(已整合到新定时器系统) ----------------------
// 没有已绑定设备,跳转到配对准备页面
ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_BLUEVIEW, ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_ENTER);
+ //不管跳到什么界面都要先停止视频
+ ThunderBirdMainView::GetInstance()->videoPlay_->PauseVideoPlay();
}
}
*/
void ThunderBirdPresenter::ShowVolumeAdjustment(int volumeDelta)
{
- ThunderBirdMainView::GetInstance()->ChangeThunderBirdReminderView(THUNDERBIRD_REMINDERVIEW);
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "音量调节");
- if (ThunderBirdReminderView::GetInstance()) {
- ThunderBirdModel::GetInstance()->StartReminderHideTimer(1000);
- ThunderBirdReminderView::GetInstance()->Show(ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_VOLUME);
- ThunderBirdReminderView::GetInstance()->AdjustRemindProgress(volumeDelta);
+ // struct timespec startTime;
+ // clock_gettime(CLOCK_MONOTONIC, &startTime);
+
+ ThunderBirdReminderView *reminderView = ThunderBirdReminderView::GetInstance();
+ if (!reminderView) {
+ ThunderBirdMainView::GetInstance()->ChangeThunderBirdReminderView(THUNDERBIRD_REMINDERVIEW);
+ reminderView = ThunderBirdReminderView::GetInstance();
}
+
+ if (reminderView) {
+ // 检查音量界面是否已经显示
+ if (reminderView->IsVolumeViewVisible()) {
+ // 界面已经显示,只更新音量并重新启动定时器(再延时1秒)
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "音量界面已显示,只更新音量并重新启动定时器");
+ reminderView->AdjustRemindProgress(volumeDelta);
+ ThunderBirdModel::GetInstance()->StartReminderHideTimer(1000);
+ } else {
+ // 界面未显示,显示界面并启动定时器
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "音量调节:显示界面");
+ ThunderBirdMainView::GetInstance()->ChangeThunderBirdReminderView(THUNDERBIRD_REMINDERVIEW);
+ ThunderBirdModel::GetInstance()->StartReminderHideTimer(1000);
+ reminderView->Show(ThunderBirdReminderView::THUNDERBIRD_REMINDERVIEW_VOLUME);
+ reminderView->AdjustRemindProgress(volumeDelta);
+ }
+ }
+
+ // struct timespec endTime;
+ // clock_gettime(CLOCK_MONOTONIC, &endTime);
+ // long long timeCost = (endTime.tv_sec - startTime.tv_sec) * 1000000000 + endTime.tv_nsec - startTime.tv_nsec;
+ // printf("timeCost = %u ns\n", timeCost);
}
/**
}
if (VolumeProgress)
{
+ // 显示音量界面时,初始化显示值为当前真实音量
+ int16_t currentVolume = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_VOICE_ASSISTANT);
+ remindProgressValue_ = currentVolume;
+ pendingVolumeValue_ = -1; // 重置待应用的值
+ VolumeProgress->SetValue(remindProgressValue_);
VolumeProgress->SetVisible(true);
}
break;
void ThunderBirdReminderView::HideAll()
{
if (group == nullptr) { return; }
+
+ // 如果音量界面正在显示,在隐藏前应用待设置的音量值
+ if (VolumeProgress && VolumeProgress->IsVisible()) {
+ ApplyPendingVolume();
+ }
+
if (RemindButton) { RemindButton->SetVisible(false); }
if (TextLabel) { TextLabel->SetVisible(false); }
if (RemindLabel) { RemindLabel->SetVisible(false); }
{
return;
}
- int16_t newVal = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_VOICE_ASSISTANT) + delta;
- SetRemindProgress(newVal);
- // 若当前处于音量界面,确保控件可见
- if (RemindButton) { RemindButton->SetVisible(true); }
+
+ // 获取当前显示的音量值(如果有待应用的值,使用待应用的值;否则使用真实音量)
+ int16_t currentDisplayValue;
+ if (pendingVolumeValue_ >= 0) {
+ // 有待应用的值,使用待应用的值作为基准
+ currentDisplayValue = pendingVolumeValue_;
+ } else {
+ // 没有待应用的值,使用真实音量作为基准
+ currentDisplayValue = AudioManager::GetInstance().GetVolume(AUDIO_STREAM_VOICE_ASSISTANT);
+ }
+
+ // 计算新的音量值
+ int16_t newVal = currentDisplayValue + delta;
+ if (newVal < 0) { newVal = 0; }
+ if (newVal > 100) { newVal = 100; }
+
+ // 只更新UI显示,不设置真实音量
+ remindProgressValue_ = newVal;
+ pendingVolumeValue_ = newVal; // 保存待应用的值
+ VolumeProgress->SetValue(remindProgressValue_);
+ VolumeProgress->Invalidate();
+
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "AdjustRemindProgress: delta=%d, newVal=%d (UI only, pending apply)", delta, newVal);
+ }
+
+ /**
+ * @brief 应用待设置的音量值(在界面隐藏时调用)
+ */
+ void ThunderBirdReminderView::ApplyPendingVolume()
+ {
+ if (pendingVolumeValue_ >= 0) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ApplyPendingVolume: applying volume=%d", pendingVolumeValue_);
+ // 应用真实音量
+ AudioManager::GetInstance().SetVolume(AUDIO_STREAM_VOICE_ASSISTANT, pendingVolumeValue_);
+ ln_bt_earphone_set_volume(pendingVolumeValue_);
+ remindProgressValue_ = pendingVolumeValue_;
+ pendingVolumeValue_ = -1; // 清除待应用的值
+ }
+ }
+
+ bool ThunderBirdReminderView::IsVolumeViewVisible() const
+ {
+ return (VolumeProgress != nullptr && VolumeProgress->IsVisible());
}
void ThunderBirdReminderView::UpdateTaskReminderText(const char* title, const char* content)