diff --git a/app/src/main/java/com/osfans/trime/data/prefs/AppPrefs.kt b/app/src/main/java/com/osfans/trime/data/prefs/AppPrefs.kt index bc694bbbb3..807a9919cb 100644 --- a/app/src/main/java/com/osfans/trime/data/prefs/AppPrefs.kt +++ b/app/src/main/java/com/osfans/trime/data/prefs/AppPrefs.kt @@ -125,6 +125,10 @@ class AppPrefs( const val USE_SOFT_CURSOR = "use_soft_cursor" const val HIDE_INPUT_BAR = "hide_input_bar" + // Distinct key (not "hide_virtual_keyboard") to avoid a type clash with the + // String value some experimental builds stored under that key. + const val HIDE_VIRTUAL_KEYBOARD = "hide_virtual_keyboard_keep_toolbar" + const val SOUND_ON_KEYPRESS = "sound_on_keypress" const val KEY_SOUND_VOLUME = "sound_volume" const val USE_CUSTOM_SOUND_EFFECT = "custom_sound_effect_enabled" @@ -180,6 +184,8 @@ class AppPrefs( val hideInputBar = switch(R.string.hide_input_bar, HIDE_INPUT_BAR, false) + val hideVirtualKeyboard = switch(R.string.hide_virtual_keyboard, HIDE_VIRTUAL_KEYBOARD, false) + val soundOnKeyPress = switch(R.string.sound_on_keypress, SOUND_ON_KEYPRESS, false) val soundVolume = int( R.string.sound_volume, diff --git a/app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt b/app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt index c27149e89e..29dd5e839b 100644 --- a/app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt +++ b/app/src/main/java/com/osfans/trime/ime/core/TrimeInputMethodService.kt @@ -94,7 +94,10 @@ open class TrimeInputMethodService : LifecycleInputMethodService() { private var cursorUpdateIndex = 0 private val recreateInputViewPrefs: Array> = - arrayOf(prefs.keyboard.hideInputBar) + arrayOf( + prefs.keyboard.hideInputBar, + prefs.keyboard.hideVirtualKeyboard, + ) @Keep private val recreateInputViewListener = diff --git a/app/src/main/java/com/osfans/trime/ime/keyboard/KeyboardWindow.kt b/app/src/main/java/com/osfans/trime/ime/keyboard/KeyboardWindow.kt index 000f76b18e..6adcd3cd51 100644 --- a/app/src/main/java/com/osfans/trime/ime/keyboard/KeyboardWindow.kt +++ b/app/src/main/java/com/osfans/trime/ime/keyboard/KeyboardWindow.kt @@ -71,6 +71,8 @@ class KeyboardWindow : override val key: ResidentWindow.Key get() = KeyboardWindow + override val isKeyboardArea: Boolean = true + private val presetKeyboardIds = theme.presetKeyboards.keys.toList() private var currentKeyboardId = "" private var lastKeyboardId = "" diff --git a/app/src/main/java/com/osfans/trime/ime/window/BoardWindow.kt b/app/src/main/java/com/osfans/trime/ime/window/BoardWindow.kt index 3aefa9f11b..3774df926c 100644 --- a/app/src/main/java/com/osfans/trime/ime/window/BoardWindow.kt +++ b/app/src/main/java/com/osfans/trime/ime/window/BoardWindow.kt @@ -18,6 +18,14 @@ sealed class BoardWindow { protected val context: Context by di.instance() + /** + * Whether this window represents the virtual keyboard area. When the user enables + * "hide virtual keyboard", only windows for which this is `true` are hidden, so that + * non-keyboard panels (option switcher, unrolled candidates, liquid keyboard, ...) + * remain visible when opened from the toolbar. + */ + open val isKeyboardArea: Boolean = false + /** * Animation when the window is added to the layout */ diff --git a/app/src/main/java/com/osfans/trime/ime/window/BoardWindowManager.kt b/app/src/main/java/com/osfans/trime/ime/window/BoardWindowManager.kt index 0a959fc4f6..725fb0e8b6 100644 --- a/app/src/main/java/com/osfans/trime/ime/window/BoardWindowManager.kt +++ b/app/src/main/java/com/osfans/trime/ime/window/BoardWindowManager.kt @@ -11,6 +11,7 @@ import androidx.transition.Transition import androidx.transition.TransitionManager import androidx.transition.TransitionSet import com.osfans.trime.R +import com.osfans.trime.data.prefs.AppPrefs import com.osfans.trime.ime.broadcast.InputBroadcaster import com.osfans.trime.ime.dependency.InputDependencyManager import org.kodein.di.instance @@ -29,6 +30,8 @@ class BoardWindowManager { private var currentWindow: BoardWindow? = null private var currentView: View? = null + private val hideVirtualKeyboard by AppPrefs.defaultInstance().keyboard.hideVirtualKeyboard + private fun prepareAnimation( exitAnimation: Transition?, enterAnimation: Transition?, @@ -108,6 +111,10 @@ class BoardWindowManager { Timber.d("Attach $window") window.onAttached() currentWindow = window + // Toolbar-only mode: hide the window host only while the keyboard area is shown, so that + // non-keyboard panels (option switcher, unrolled candidates, liquid keyboard, ...) opened + // from the toolbar remain visible. Returning to the keyboard hides the host again. + view.visibility = if (hideVirtualKeyboard && window.isKeyboardArea) View.GONE else View.VISIBLE broadcaster.onWindowAttached(window) } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index de6e7c2111..5d67c7c62e 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -172,6 +172,7 @@ 部署失败 部署失败。点此查看错误日志。 隐藏输入工具栏 + 隐藏虚拟键盘(保留工具栏) 无背景 跟随键盘背景色 键盘背景图片 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 3903a6d220..1d1898ba09 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -173,6 +173,7 @@ 部署失敗 部署失敗。點此檢視錯誤日誌。 隱藏輸入工具欄 + 隱藏虛擬鍵盤(保留工具欄) 無背景 跟隨鍵盤背景色 鍵盤背景圖片 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 83e18bcc05..07bd480054 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -173,6 +173,7 @@ Deploy failure Deploy failure. Click here to view error log. Hide input bar + Hide virtual keyboard (keep toolbar) No background Follow keyboard color Keyboard background image