diff --git a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionData.kt b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionData.kt index eb24dd579a..e3903bd094 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionData.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionData.kt @@ -833,6 +833,11 @@ sealed class ActionData : Comparable { override val id = ActionId.SHOW_KEYBOARD_PICKER } + @Serializable + data object PerformImeAction : ActionData() { + override val id = ActionId.PERFORM_IME_ACTION + } + @Serializable data object CopyText : ActionData() { override val id = ActionId.TEXT_COPY diff --git a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionDataEntityMapper.kt b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionDataEntityMapper.kt index a4485f9813..a8fc7a24d0 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionDataEntityMapper.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionDataEntityMapper.kt @@ -545,6 +545,7 @@ object ActionDataEntityMapper { ActionId.SHOW_KEYBOARD -> ActionData.ShowKeyboard ActionId.HIDE_KEYBOARD -> ActionData.HideKeyboard ActionId.SHOW_KEYBOARD_PICKER -> ActionData.ShowKeyboardPicker + ActionId.PERFORM_IME_ACTION -> ActionData.PerformImeAction ActionId.TEXT_CUT -> ActionData.CutText ActionId.TEXT_COPY -> ActionData.CopyText ActionId.TEXT_PASTE -> ActionData.PasteText @@ -1322,6 +1323,7 @@ object ActionDataEntityMapper { ActionId.SHOW_KEYBOARD to "show_keyboard", ActionId.HIDE_KEYBOARD to "hide_keyboard", ActionId.SHOW_KEYBOARD_PICKER to "show_keyboard_picker", + ActionId.PERFORM_IME_ACTION to "perform_ime_action", ActionId.TEXT_CUT to "text_cut", ActionId.TEXT_COPY to "text_copy", ActionId.TEXT_PASTE to "text_paste", diff --git a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionId.kt b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionId.kt index 70cbf87a59..2ce2fd0eb3 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionId.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionId.kt @@ -125,6 +125,7 @@ enum class ActionId { SHOW_KEYBOARD, HIDE_KEYBOARD, SHOW_KEYBOARD_PICKER, + PERFORM_IME_ACTION, SWITCH_KEYBOARD, diff --git a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionUiHelper.kt b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionUiHelper.kt index 98b53064b4..b97425adf2 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionUiHelper.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionUiHelper.kt @@ -595,6 +595,7 @@ class ActionUiHelper( ActionData.SelectWordAtCursor -> getString(R.string.action_select_word_at_cursor) ActionData.ShowKeyboard -> getString(R.string.action_show_keyboard) ActionData.ShowKeyboardPicker -> getString(R.string.action_show_keyboard_picker) + ActionData.PerformImeAction -> getString(R.string.action_perform_ime_action) ActionData.ShowPowerMenu -> getString(R.string.action_show_power_menu) ActionData.StatusBar.Collapse -> getString(R.string.action_collapse_status_bar) diff --git a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionUtils.kt b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionUtils.kt index a5bfaa6454..85586fe539 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionUtils.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/actions/ActionUtils.kt @@ -225,6 +225,7 @@ object ActionUtils { ActionId.HIDE_KEYBOARD -> ActionCategory.KEYBOARD ActionId.SHOW_KEYBOARD_PICKER -> ActionCategory.KEYBOARD ActionId.SELECT_WORD_AT_CURSOR -> ActionCategory.KEYBOARD + ActionId.PERFORM_IME_ACTION -> ActionCategory.KEYBOARD ActionId.SWITCH_KEYBOARD -> ActionCategory.KEYBOARD ActionId.LOCK_DEVICE -> ActionCategory.INTERFACE ActionId.POWER_ON_OFF_DEVICE -> ActionCategory.INTERFACE @@ -424,6 +425,8 @@ object ActionUtils { ActionId.SELECT_WORD_AT_CURSOR -> R.string.action_select_word_at_cursor + ActionId.PERFORM_IME_ACTION -> R.string.action_perform_ime_action + ActionId.SWITCH_KEYBOARD -> R.string.action_switch_keyboard ActionId.TOGGLE_AIRPLANE_MODE -> R.string.action_toggle_airplane_mode @@ -599,6 +602,7 @@ object ActionUtils { ActionId.TEXT_COPY -> R.drawable.ic_content_copy ActionId.TEXT_PASTE -> R.drawable.ic_content_paste ActionId.SELECT_WORD_AT_CURSOR -> null + ActionId.PERFORM_IME_ACTION -> null ActionId.SWITCH_KEYBOARD -> R.drawable.ic_outline_keyboard_24 ActionId.TOGGLE_AIRPLANE_MODE -> R.drawable.ic_outline_airplanemode_active_24 ActionId.ENABLE_AIRPLANE_MODE -> R.drawable.ic_outline_airplanemode_active_24 @@ -677,6 +681,8 @@ object ActionUtils { ActionId.SELECT_WORD_AT_CURSOR, -> Build.VERSION_CODES.JELLY_BEAN_MR2 + ActionId.PERFORM_IME_ACTION -> Build.VERSION_CODES.TIRAMISU + ActionId.SHOW_POWER_MENU -> Build.VERSION_CODES.LOLLIPOP ActionId.DEVICE_CONTROLS -> Build.VERSION_CODES.S @@ -1029,6 +1035,7 @@ object ActionUtils { ActionId.TEXT_COPY -> Icons.Rounded.ContentCopy ActionId.TEXT_PASTE -> Icons.Rounded.ContentPaste ActionId.SELECT_WORD_AT_CURSOR -> KeyMapperIcons.MatchWord + ActionId.PERFORM_IME_ACTION -> Icons.Outlined.Keyboard ActionId.SWITCH_KEYBOARD -> Icons.Outlined.Keyboard ActionId.TOGGLE_AIRPLANE_MODE -> Icons.Outlined.AirplanemodeActive ActionId.ENABLE_AIRPLANE_MODE -> Icons.Outlined.AirplanemodeActive diff --git a/base/src/main/java/io/github/sds100/keymapper/base/actions/CreateActionDelegate.kt b/base/src/main/java/io/github/sds100/keymapper/base/actions/CreateActionDelegate.kt index 3525167f70..e1d2124db5 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/actions/CreateActionDelegate.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/actions/CreateActionDelegate.kt @@ -1066,6 +1066,8 @@ class CreateActionDelegate( ActionId.SHOW_KEYBOARD_PICKER -> return ActionData.ShowKeyboardPicker + ActionId.PERFORM_IME_ACTION -> return ActionData.PerformImeAction + ActionId.TEXT_CUT -> return ActionData.CutText ActionId.TEXT_COPY -> return ActionData.CopyText diff --git a/base/src/main/java/io/github/sds100/keymapper/base/actions/PerformActionsUseCase.kt b/base/src/main/java/io/github/sds100/keymapper/base/actions/PerformActionsUseCase.kt index dc4d735993..e2dd348dde 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/actions/PerformActionsUseCase.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/actions/PerformActionsUseCase.kt @@ -764,6 +764,15 @@ class PerformActionsUseCaseImpl @AssistedInject constructor( result = inputMethodAdapter.showImePicker(fromForeground = false) } + is ActionData.PerformImeAction -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + service.performImeAction() + result = Success(Unit) + } else { + result = SdkVersionTooLow(minSdk = Build.VERSION_CODES.TIRAMISU) + } + } + is ActionData.CutText -> { result = service.performActionOnNode({ it.isFocused }) { AccessibilityNodeAction(AccessibilityNodeInfo.ACTION_CUT) diff --git a/base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/BaseAccessibilityService.kt b/base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/BaseAccessibilityService.kt index ccb7d38ff1..c1d5991a29 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/BaseAccessibilityService.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/BaseAccessibilityService.kt @@ -569,4 +569,8 @@ abstract class BaseAccessibilityService : null, ) } + + override fun performImeAction() { + inputMethod?.currentInputConnection?.performEditorAction(EditorInfo.IME_ACTION_UNSPECIFIED) + } } diff --git a/base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/IAccessibilityService.kt b/base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/IAccessibilityService.kt index 3eaa73ca40..7ae1761d8c 100644 --- a/base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/IAccessibilityService.kt +++ b/base/src/main/java/io/github/sds100/keymapper/base/system/accessibility/IAccessibilityService.kt @@ -66,4 +66,7 @@ interface IAccessibilityService : SwitchImeInterface { @RequiresApi(Build.VERSION_CODES.TIRAMISU) fun injectText(text: String) + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + fun performImeAction() } diff --git a/base/src/main/res/values/strings.xml b/base/src/main/res/values/strings.xml index 9bb7dc5d2f..e0f3dcac5e 100644 --- a/base/src/main/res/values/strings.xml +++ b/base/src/main/res/values/strings.xml @@ -1074,6 +1074,8 @@ Show keyboard picker + Keyboard enter/send + Switch keyboard Switch to %s