static constexpr int SCREEN_KEEPON_LEVEL_30MIN = 3;
static constexpr int SCREEN_KEEPON_LEVEL_ALWAYS = 4;
int GetScreenKeeponLevel() const { return screenKeeponLevel_; }
- /** 设置档位并写入 KV,然后应用当前档位 */
+ /** 设置档位并写入 KV,然后应用当前档位(对话聆听/说话中仅写 KV,退出对话后再 Apply) */
void SetScreenKeeponLevel(int level);
/** 仅将当前档位应用到系统(不写 KV) */
void ApplyScreenKeeponLevel();
/** 开机时从 KV 读取档位 */
void LoadScreenKeeponLevelFromKV();
- /** 服务端协议 ScreenTimeoutUpdate:单位秒,0 表示不息屏;落 KV 并立即生效 */
+ /** 服务端 ScreenTimeoutUpdate:单位秒,0=不息屏;落 KV 并应用(对话中仅落 KV,退出后再 Apply) */
void SetScreenTimeoutSeconds(uint32_t screenTimeoutSec);
// 故事模式超时定时器(1分钟无文本切换则退出)
static bool g_isRecording = false;//是否正在录音
+ /** 对话进行(聆听/说话,或 Presenter 已标记对话中):息屏档位只写入 KV,不 Apply,避免服务端/设置顶掉对话亮屏策略 */
+ static bool ThunderBirdShouldDeferScreenKeeponApply()
+ {
+ ThunderBirdPresenter *pre = ThunderBirdPresenter::GetInstance();
+ if (pre != nullptr && pre->isDialogueing) {
+ return true;
+ }
+ ThunderBirdMainView *mainView = ThunderBirdMainView::GetInstance();
+ if (mainView == nullptr) {
+ return false;
+ }
+ const int16_t cv = mainView->GetCurrentView();
+ const int16_t csv = mainView->GetCurrentSubView();
+ if (cv != THUNDERBIRD_DIALOGUEVIEW) {
+ return false;
+ }
+ return (csv == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING ||
+ csv == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING);
+ }
+
/**************************产测相关************************************/
/* AT^LN_STRESS_TEST_DIALOGUE 压测线程:产测期间定期内存拷贝,拉高 CPU 使用率(仅拷贝,不写文件) */
static osMessageQueueId_t g_stress_save_queue = nullptr;
else if (level == SCREEN_KEEPON_LEVEL_30MIN) secStr = "1800";
else if (level == SCREEN_KEEPON_LEVEL_ALWAYS) secStr = "0";
(void)UtilsSetValue("screen_timeout_sec", secStr);
+ if (ThunderBirdShouldDeferScreenKeeponApply()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ScreenKeepon] SetScreenKeeponLevel: level=%d saved to KV, apply deferred (in dialogue)", level);
+ return;
+ }
ApplyScreenKeeponLevel();
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ScreenKeepon] SetScreenKeeponLevel: level=%d, saved to KV", level);
}
(void)snprintf(buf, sizeof(buf) - 1, "%u", (unsigned)screenTimeoutSec);
(void)UtilsSetValue("screen_timeout_sec", buf);
+ if (ThunderBirdShouldDeferScreenKeeponApply()) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+ "[ScreenKeepon] SetScreenTimeoutSeconds: sec=%u => level=%d, KV saved, apply deferred (in dialogue)",
+ (unsigned)screenTimeoutSec, screenKeeponLevel_);
+ return;
+ }
ApplyScreenKeeponLevel();
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[ScreenKeepon] SetScreenTimeoutSeconds: sec=%u => level=%d", (unsigned)screenTimeoutSec, screenKeeponLevel_);
}
if (currentView == THUNDERBIRD_DIALOGUEVIEW &&
(currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING || currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "聆听/说话界面超时,自动跳转并退出对话");
- ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+ /* 退出对话勿强制关常亮:按 KV 档位恢复(用户设为常亮则继续保持) */
+ ApplyScreenKeeponLevel();
if(bind_status == true)
{
view->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_STATUS_SHOW);
// 不在这里切换表情,标志位保持为1,在发呆中界面时获取时间线表情
// m_needGetTimelineExpression 保持为 true,表示需要获取时间线表情
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 退出对话模式,标志位保持为true,将在发呆中界面获取时间线表情");
+
+ /* 对话中若仅记录了息屏档位(未 Apply),此处统一按 KV 生效(含日程提醒等所有出口) */
+ ApplyScreenKeeponLevel();
}
// 进入哄睡模式时记录当前表情(进入THUNDERBIRD_LULLABYVIEW_4时调用)