优化对话过程中按键操作
authorxue <2144439972@qq.com>
Fri, 6 Mar 2026 06:55:19 +0000 (14:55 +0800)
committerxue <2144439972@qq.com>
Fri, 6 Mar 2026 06:55:19 +0000 (14:55 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdPresenter.cpp

index 0d8eb92..68eec67 100644 (file)
@@ -308,50 +308,50 @@ namespace OHOS
      */
     bool ThunderBirdPresenter::HandleFuncKey(uint16_t keyState, int16_t currentView, int16_t currentSubView, int screenState)
     {
-        // 处理设备列表功能
-        if (keyState == InputDevice::STATE_RELEASE && screenState == 0 )
+        // 处理设备列表功能(仅蓝牙界面松开时在此处理并 return)
+        if (keyState == InputDevice::STATE_RELEASE && screenState == 0 && currentView == THUNDERBIRD_BLUEVIEW)
         {
-            if(currentView == THUNDERBIRD_BLUEVIEW )
+            funcKeyPressedForRelease = false;
+            if(currentSubView == ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_DEVICE_LIST)
             {
-                if(currentSubView == ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_DEVICE_LIST)
-                {
-                    // 处理设备列表功能
-                    if(ThunderBirdBlueView::GetInstance())
-                        ThunderBirdBlueView::GetInstance()->OnKeyConfirm();// 点击确认键:确认选择当前设备
-                }
-                else if(currentSubView == ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_CONNECT_SUCCESS)
-                {
-                    //跳转到断连询问界面
-                    ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_BLUEVIEW, ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_DISCONNECT_CONFIRM);
-                }
-                else if(currentSubView == ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_DISCONNECT_CONFIRM)
-                {
-                    //执行断连操作
-                    ThunderBirdBlueView::GetInstance()->ExecuteDisconnect();
-                }
+                if(ThunderBirdBlueView::GetInstance())
+                    ThunderBirdBlueView::GetInstance()->OnKeyConfirm();
+            }
+            else if(currentSubView == ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_CONNECT_SUCCESS)
+            {
+                ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_BLUEVIEW, ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_DISCONNECT_CONFIRM);
+            }
+            else if(currentSubView == ThunderBirdBlueView::THUNDERBIRD_BULEVIEW_DISCONNECT_CONFIRM)
+            {
+                ThunderBirdBlueView::GetInstance()->ExecuteDisconnect();
             }
             return true;
         }
         
-        // 短按FUNC键(息屏状态下)
-        if (keyState == InputDevice::STATE_PRESS && screenState == 0 ) {
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleFuncKey: KEY_TYPE_FUNC press");
-            
-            if(currentView == THUNDERBIRD_LULLABYVIEW && currentSubView == ThunderBirdLullabyView::THUNDERBIRD_LULLABYVIEW_3)
-            { 
-                //  HandleLullabyFunction(currentView, currentSubView);     
-                // ln_ws_start_audio_chat(LN_AUDIO_CHAT_CHOOSE_STORY_REQUEST);
-                // ThunderBirdLullabyView::GetInstance()->listenAnimator->Start();
+        // 对话模式下 FUNC 短按:按下记录,松开触发(按下然后松开才触发)
+        if (currentView == THUNDERBIRD_DIALOGUEVIEW &&
+            (currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING ||
+             currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING)) {
+            if (keyState == InputDevice::STATE_PRESS && screenState == 0) {
+                funcKeyPressedForRelease = true;
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "HandleFuncKey: KEY_TYPE_FUNC pressed in dialogue, wait release");
+                return true;
             }
-            else if(currentView == THUNDERBIRD_DIALOGUEVIEW && 
-                (currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING || currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING))
-            {
-                // 处理对话功能
+            if (keyState == InputDevice::STATE_RELEASE && screenState == 0 && funcKeyPressedForRelease) {
+                funcKeyPressedForRelease = false;
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleFuncKey: KEY_TYPE_FUNC press+release in dialogue");
                 HandleDialogueFunction(currentView, currentSubView);
+                return true;
             }
-            else
-            {
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "HandleFuncKey: KEY_TYPE_FUNC press, but not in dialogue mode");
+            if (keyState == InputDevice::STATE_RELEASE) {
+                // 其它松开场景(例如屏幕状态变化),仅清除标志
+                funcKeyPressedForRelease = false;
+                return true;
+            }
+        } else {
+            // 非对话界面,任何松开都清除标志,避免残留对对话逻辑的影响
+            if (keyState == InputDevice::STATE_RELEASE) {
+                funcKeyPressedForRelease = false;
             }
         }
         
@@ -448,6 +448,7 @@ namespace OHOS
                 mainView->listenIcon->SetVisible(false);
             }
             ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING);
+            ThunderBirdModel::GetInstance()->SetNormalEnterListening(true); // 按键从 listening -> speaking,视为“正常”speaking
         } else if(currentView == THUNDERBIRD_DIALOGUEVIEW && currentSubView == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING) {
             // 检查 WebSocket 连接状态,如果正在重连,等待重连完成
             // int wsState = ln_ws_get_connection_state();
@@ -477,9 +478,11 @@ namespace OHOS
             if (mainView && mainView->listenIcon) {
                 mainView->listenIcon->SetVisible(true);
             }
+            // 按键进入聆听界面时打开 VAD 识别
+            ln_ws_set_vad_recognition_enabled(true);
             // 开始录音
             ThunderBirdMainView::GetInstance()->ChangeView(currentView, THUNDERBIRD_DIALOGUEVIEW, ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING);
-             ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);  
+            //  ln_ws_start_audio_chat(LN_AUDIO_CHAT_VOICE_CHAT_REQUEST);  
         }
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "语音键处理完成");
     }
@@ -605,6 +608,10 @@ namespace OHOS
         }
         
         if (reminderView) {
+            // 在对话界面时,将 ReminderView 的 group 置于最上层,避免被 DialogueView 的 RemindButton 遮挡导致看起来按键无反应
+            if (currentView == THUNDERBIRD_DIALOGUEVIEW) {
+                ThunderBirdMainView::GetInstance()->BringGroupToFront(THUNDERBIRD_REMINDERVIEW);
+            }
             // 检查音量界面是否已经显示
             if (reminderView->IsVolumeViewVisible()) {
                 // 界面已经显示,只更新音量并重新启动定时器(再延时1秒),不切换界面