From 6fdce633594945f40a26e319ff2a3ee5fc173e3d Mon Sep 17 00:00:00 2001 From: mcfans Date: Mon, 30 Oct 2023 15:34:01 +0800 Subject: [PATCH] fix: unified keyboard check logic in common.rs --- src/client.rs | 4 ++-- src/common.rs | 14 +++++++++---- src/flutter_ffi.rs | 4 +--- src/ui_session_interface.rs | 41 ++++++++++++++++++++++++------------- 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/src/client.rs b/src/client.rs index 5a3c35467..f59ffe049 100644 --- a/src/client.rs +++ b/src/client.rs @@ -1718,14 +1718,14 @@ impl LoginConfigHandler { crate::flutter::push_global_event(crate::flutter::APP_TYPE_MAIN, evt); } if config.keyboard_mode.is_empty() { - if is_keyboard_mode_supported(&KeyboardMode::Map, get_version_number(&pi.version)) { + if is_keyboard_mode_supported(&KeyboardMode::Map, get_version_number(&pi.version), &pi.platform) { config.keyboard_mode = KeyboardMode::Map.to_string(); } else { config.keyboard_mode = KeyboardMode::Legacy.to_string(); } } else { let keyboard_modes = - crate::get_supported_keyboard_modes(get_version_number(&pi.version)); + crate::get_supported_keyboard_modes(get_version_number(&pi.version), &pi.platform); let current_mode = &KeyboardMode::from_str(&config.keyboard_mode).unwrap_or_default(); if !keyboard_modes.contains(current_mode) { config.keyboard_mode = KeyboardMode::Legacy.to_string(); diff --git a/src/common.rs b/src/common.rs index cf75fab1b..1833d858b 100644 --- a/src/common.rs +++ b/src/common.rs @@ -977,18 +977,24 @@ pub fn make_privacy_mode_msg(state: back_notification::PrivacyModeState) -> Mess make_privacy_mode_msg_with_details(state, "".to_owned()) } -pub fn is_keyboard_mode_supported(keyboard_mode: &KeyboardMode, version_number: i64) -> bool { +pub fn is_keyboard_mode_supported(keyboard_mode: &KeyboardMode, version_number: i64, peer_platform: &str) -> bool { match keyboard_mode { KeyboardMode::Legacy => true, - KeyboardMode::Map => version_number >= hbb_common::get_version_number("1.2.0"), + KeyboardMode::Map => { + if peer_platform.to_lowercase() == crate::PLATFORM_ANDROID.to_lowercase() { + false + } else { + version_number >= hbb_common::get_version_number("1.2.0") + } + } KeyboardMode::Translate => version_number >= hbb_common::get_version_number("1.2.0"), KeyboardMode::Auto => version_number >= hbb_common::get_version_number("1.2.0"), } } -pub fn get_supported_keyboard_modes(version: i64) -> Vec { +pub fn get_supported_keyboard_modes(version: i64, peer_platform: &str) -> Vec { KeyboardMode::iter() - .filter(|&mode| is_keyboard_mode_supported(mode, version)) + .filter(|&mode| is_keyboard_mode_supported(mode, version, peer_platform)) .map(|&mode| mode) .collect::>() } diff --git a/src/flutter_ffi.rs b/src/flutter_ffi.rs index 0f692ee53..753848cc0 100644 --- a/src/flutter_ffi.rs +++ b/src/flutter_ffi.rs @@ -392,12 +392,10 @@ pub fn session_get_custom_image_quality(session_id: SessionID) -> Option SyncReturn { if let Some(session) = sessions::get_session_by_session_id(&session_id) { if let Ok(mode) = KeyboardMode::from_str(&mode[..]) { - if session.peer_platform() == "Android" && mode == KeyboardMode::Map { - return SyncReturn(false); - } SyncReturn(is_keyboard_mode_supported( &mode, session.get_peer_version(), + &session.peer_platform() )) } else { SyncReturn(false) diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index b9f30b0ef..fc765131e 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -1,4 +1,4 @@ -use crate::input::{MOUSE_BUTTON_LEFT, MOUSE_TYPE_DOWN, MOUSE_TYPE_UP, MOUSE_TYPE_WHEEL}; +use crate::{input::{MOUSE_BUTTON_LEFT, MOUSE_TYPE_DOWN, MOUSE_TYPE_UP, MOUSE_TYPE_WHEEL}, common::{is_keyboard_mode_supported, get_supported_keyboard_modes}}; use async_trait::async_trait; use bytes::Bytes; use rdev::{Event, EventType::*, KeyCode}; @@ -214,23 +214,36 @@ impl Session { self.lc.read().unwrap().version.clone() } + pub fn fallback_keyboard_mode(&self) -> String { + let peer_version = self.get_peer_version(); + let platform = self.peer_platform(); + + let supported_modes = get_supported_keyboard_modes(peer_version, &platform); + if let Some(mode) = supported_modes.first() { + return mode.to_string(); + } else { + if self.get_peer_version() >= get_version_number("1.2.0") { + return KeyboardMode::Map.to_string(); + } else { + return KeyboardMode::Legacy.to_string(); + } + } + } + pub fn get_keyboard_mode(&self) -> String { let mode = self.lc.read().unwrap().keyboard_mode.clone(); - if self.peer_platform() == crate::PLATFORM_ANDROID { - if mode == "map" { - return "translate".to_string(); + let keyboard_mode = KeyboardMode::from_str(&mode); + + let peer_version = self.get_peer_version(); + let platform = self.peer_platform(); + + // Saved keyboard mode still exists in this version. + if let Ok(mode) = keyboard_mode { + if is_keyboard_mode_supported(&mode, peer_version, &platform) { + return mode.to_string(); } } - if ["map", "translate", "legacy"].contains(&(&mode as &str)) { - mode - } else { - if self.get_peer_version() > hbb_common::get_version_number("1.2.0") { - "map" - } else { - "legacy" - } - .to_string() - } + self.fallback_keyboard_mode() } pub fn save_keyboard_mode(&self, value: String) {