diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f4bbc78d1..a0f6a9c4e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ## Added +- #2067 add action to select all text in the focused field. - #2045 add action to input on-screen keyboard enter/send button. - #2106 disable the keyboard auto-switching setting when manually switching the keyboard in the Key Mapper homescreen menu. - #1029 add action to show a toast message. 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 4c3bb89e50..3c608e7277 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 @@ -858,6 +858,11 @@ sealed class ActionData : Comparable { override val id = ActionId.SELECT_WORD_AT_CURSOR } + @Serializable + data object SelectAllText : ActionData() { + override val id = ActionId.SELECT_ALL_TEXT + } + @Serializable data object VoiceAssistant : ActionData() { override val id = ActionId.OPEN_VOICE_ASSISTANT 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 75c7d48fa6..b8caede87b 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 @@ -625,6 +625,8 @@ object ActionDataEntityMapper { ActionId.SELECT_WORD_AT_CURSOR -> ActionData.SelectWordAtCursor + ActionId.SELECT_ALL_TEXT -> ActionData.SelectAllText + ActionId.TOGGLE_AIRPLANE_MODE -> ActionData.AirplaneMode.Toggle ActionId.ENABLE_AIRPLANE_MODE -> ActionData.AirplaneMode.Enable @@ -1478,6 +1480,7 @@ object ActionDataEntityMapper { ActionId.TEXT_COPY to "text_copy", ActionId.TEXT_PASTE to "text_paste", ActionId.SELECT_WORD_AT_CURSOR to "select_word_at_cursor", + ActionId.SELECT_ALL_TEXT to "select_all_text", ActionId.SWITCH_KEYBOARD to "switch_keyboard", 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 d42bb721ed..63f4e62f07 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 @@ -121,6 +121,7 @@ enum class ActionId { TEXT_PASTE, MOVE_CURSOR, SELECT_WORD_AT_CURSOR, + SELECT_ALL_TEXT, TOGGLE_KEYBOARD, SHOW_KEYBOARD, HIDE_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 9d1f277883..fe8323f74d 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 @@ -593,6 +593,7 @@ class ActionUiHelper( ActionData.Screenshot -> getString(R.string.action_screenshot) ActionData.SecureLock -> getString(R.string.action_secure_lock_device) ActionData.SelectWordAtCursor -> getString(R.string.action_select_word_at_cursor) + ActionData.SelectAllText -> getString(R.string.action_select_all_text) 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) 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 846e2e3aba..8707fa2c9a 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 @@ -54,6 +54,7 @@ import androidx.compose.material.icons.outlined.PowerSettingsNew import androidx.compose.material.icons.outlined.Replay30 import androidx.compose.material.icons.outlined.ScreenLockRotation import androidx.compose.material.icons.outlined.ScreenRotation +import androidx.compose.material.icons.outlined.SelectAll import androidx.compose.material.icons.outlined.Settings import androidx.compose.material.icons.outlined.SignalCellular4Bar import androidx.compose.material.icons.outlined.SignalCellularOff @@ -225,6 +226,7 @@ object ActionUtils { ActionId.HIDE_KEYBOARD -> ActionCategory.KEYBOARD ActionId.SHOW_KEYBOARD_PICKER -> ActionCategory.KEYBOARD ActionId.SELECT_WORD_AT_CURSOR -> ActionCategory.KEYBOARD + ActionId.SELECT_ALL_TEXT -> ActionCategory.KEYBOARD ActionId.PERFORM_IME_ACTION -> ActionCategory.KEYBOARD ActionId.SWITCH_KEYBOARD -> ActionCategory.KEYBOARD ActionId.LOCK_DEVICE -> ActionCategory.INTERFACE @@ -426,6 +428,8 @@ object ActionUtils { ActionId.SELECT_WORD_AT_CURSOR -> R.string.action_select_word_at_cursor + ActionId.SELECT_ALL_TEXT -> R.string.action_select_all_text + ActionId.PERFORM_IME_ACTION -> R.string.action_perform_ime_action ActionId.SWITCH_KEYBOARD -> R.string.action_switch_keyboard @@ -604,6 +608,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.SELECT_ALL_TEXT -> 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 @@ -682,6 +687,7 @@ object ActionUtils { ActionId.TEXT_COPY, ActionId.TEXT_PASTE, ActionId.SELECT_WORD_AT_CURSOR, + ActionId.SELECT_ALL_TEXT, -> Build.VERSION_CODES.JELLY_BEAN_MR2 ActionId.PERFORM_IME_ACTION -> Build.VERSION_CODES.TIRAMISU @@ -1038,6 +1044,7 @@ object ActionUtils { ActionId.TEXT_COPY -> Icons.Rounded.ContentCopy ActionId.TEXT_PASTE -> Icons.Rounded.ContentPaste ActionId.SELECT_WORD_AT_CURSOR -> KeyMapperIcons.MatchWord + ActionId.SELECT_ALL_TEXT -> Icons.Outlined.SelectAll ActionId.PERFORM_IME_ACTION -> Icons.Outlined.Keyboard ActionId.SWITCH_KEYBOARD -> Icons.Outlined.Keyboard ActionId.TOGGLE_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 76fa4b1068..0f125641dc 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 @@ -1097,6 +1097,8 @@ class CreateActionDelegate( ActionId.SELECT_WORD_AT_CURSOR -> return ActionData.SelectWordAtCursor + ActionId.SELECT_ALL_TEXT -> return ActionData.SelectAllText + ActionId.TOGGLE_AIRPLANE_MODE -> return ActionData.AirplaneMode.Toggle ActionId.ENABLE_AIRPLANE_MODE -> return ActionData.AirplaneMode.Enable 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 dccaeee822..d193ee28fe 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 @@ -820,6 +820,23 @@ class PerformActionsUseCaseImpl @AssistedInject constructor( } } + is ActionData.SelectAllText -> { + result = service.performActionOnNode({ it.isFocused }) { node -> + val text = node.text?.toString().orEmpty() + if (text.isEmpty()) return@performActionOnNode null + + val extras = mapOf( + AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_START_INT to 0, + AccessibilityNodeInfo.ACTION_ARGUMENT_SELECTION_END_INT to text.length, + ) + + AccessibilityNodeAction( + AccessibilityNodeInfo.ACTION_SET_SELECTION, + extras, + ) + } + } + is ActionData.AirplaneMode.Toggle -> { result = if (airplaneModeAdapter.isEnabled()) { airplaneModeAdapter.disable() diff --git a/base/src/main/res/values/strings.xml b/base/src/main/res/values/strings.xml index e091747cbf..b607624d26 100644 --- a/base/src/main/res/values/strings.xml +++ b/base/src/main/res/values/strings.xml @@ -1098,6 +1098,7 @@ Copy Paste Select word at cursor + Select all text Open settings Show power menu