From c9d52e809006972f4db69c395c56338225c94c59 Mon Sep 17 00:00:00 2001 From: Helium314 Date: Thu, 18 Jan 2024 10:18:22 +0100 Subject: [PATCH] add home, end and select word toolbar keys, fixes #409 --- .../keyboard/clipboard/ClipboardHistoryView.kt | 2 +- .../inputmethod/latin/RichInputConnection.java | 10 +++++++++- .../inputmethod/latin/common/Constants.java | 4 +++- .../inputmethod/latin/inputlogic/InputLogic.java | 9 +++++++++ .../inputmethod/latin/utils/ToolbarUtils.kt | 12 +++++++++--- app/src/main/res/drawable/ic_select.xml | 12 ++++++++++++ app/src/main/res/drawable/ic_to_end.xml | 12 ++++++++++++ app/src/main/res/drawable/ic_to_start.xml | 4 ++++ app/src/main/res/values/attrs.xml | 3 +++ app/src/main/res/values/keyboard-icons-holo.xml | 3 +++ app/src/main/res/values/keyboard-icons-lxx-light.xml | 3 +++ app/src/main/res/values/keyboard-icons-rounded.xml | 3 +++ app/src/main/res/values/strings.xml | 3 +++ 13 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 app/src/main/res/drawable/ic_select.xml create mode 100644 app/src/main/res/drawable/ic_to_end.xml create mode 100644 app/src/main/res/drawable/ic_to_start.xml diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardHistoryView.kt b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardHistoryView.kt index 49456f7e4..dc55a638d 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardHistoryView.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/keyboard/clipboard/ClipboardHistoryView.kt @@ -68,7 +68,7 @@ class ClipboardHistoryView @JvmOverloads constructor( // even when state is activated, the not activated color is set // in suggestionStripView the same thing works correctly, wtf? // need to properly fix it (and maybe undo the inverted isActivated) when adding a toggle key - listOf(ToolbarKey.LEFT, ToolbarKey.RIGHT, ToolbarKey.COPY, ToolbarKey.SELECT_ALL, ToolbarKey.CLEAR_CLIPBOARD, ToolbarKey.ONE_HANDED) + listOf(ToolbarKey.LEFT, ToolbarKey.RIGHT, ToolbarKey.COPY, ToolbarKey.SELECT_WORD, ToolbarKey.SELECT_ALL, ToolbarKey.CLEAR_CLIPBOARD, ToolbarKey.ONE_HANDED) .forEach { toolbarKeys.add(createToolbarKey(context, keyboardAttr, it)) } keyboardAttr.recycle() } diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java index c5cd0f7a7..57d4a0a2f 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/RichInputConnection.java @@ -641,8 +641,16 @@ public final class RichInputConnection implements PrivateCommandPerformer { } public void selectAll() { + if (!isConnected()) return; mIC.performContextMenuAction(android.R.id.selectAll); - // the rest is done via LatinIME.onUpdateSelection + } + + public void selectWord(final SpacingAndPunctuations spacingAndPunctuations, final int scriptId) { + if (!isConnected()) return; + if (mExpectedSelStart != mExpectedSelEnd) return; // already something selected + final TextRange range = getWordRangeAtCursor(spacingAndPunctuations, scriptId, false); + if (range == null) return; + mIC.setSelection(mExpectedSelStart - range.getNumberOfCharsInWordBeforeCursor(), mExpectedSelStart + range.getNumberOfCharsInWordAfterCursor()); } public void copyText() { diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java index d680e7d82..74f0c06cb 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/common/Constants.java @@ -8,7 +8,6 @@ package org.dslul.openboard.inputmethod.latin.common; import androidx.annotation.NonNull; -import org.dslul.openboard.inputmethod.annotations.UsedForTesting; import org.dslul.openboard.inputmethod.latin.BuildConfig; public final class Constants { @@ -229,6 +228,9 @@ public final class Constants { public static final int CODE_REDO = -30; public static final int CODE_TOGGLE_AUTOCORRECT = -31; public static final int CODE_TOGGLE_INCOGNITO = -32; + public static final int CODE_HOME = -33; + public static final int CODE_END = -34; + public static final int CODE_SELECT_WORD = -35; // Code value representing the code is not specified. public static final int CODE_UNSPECIFIED = -200; diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java b/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java index a56113755..5f24fa05a 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/inputlogic/InputLogic.java @@ -709,6 +709,9 @@ public final class InputLogic { case Constants.CODE_SELECT_ALL: mConnection.selectAll(); break; + case Constants.CODE_SELECT_WORD: + mConnection.selectWord(inputTransaction.getMSettingsValues().mSpacingAndPunctuations, currentKeyboardScriptId); + break; case Constants.CODE_COPY: mConnection.copyText(); break; @@ -730,6 +733,12 @@ public final class InputLogic { case Constants.CODE_REDO: sendDownUpKeyEventWithMetaState(KeyEvent.KEYCODE_Z, KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON); break; + case Constants.CODE_HOME: + sendDownUpKeyEvent(KeyEvent.KEYCODE_MOVE_HOME); + break; + case Constants.CODE_END: + sendDownUpKeyEvent(KeyEvent.KEYCODE_MOVE_END); + break; case Constants.CODE_SHORTCUT: // switching to shortcut IME, shift state, keyboard,... is handled by LatinIME, // {@link KeyboardSwitcher#onEvent(Event)}, or {@link #onPressKey(int,int,boolean)} and {@link #onReleaseKey(int,boolean)}. diff --git a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ToolbarUtils.kt b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ToolbarUtils.kt index 415ad3c84..29b3b016d 100644 --- a/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ToolbarUtils.kt +++ b/app/src/main/java/org/dslul/openboard/inputmethod/latin/utils/ToolbarUtils.kt @@ -11,7 +11,6 @@ import org.dslul.openboard.inputmethod.latin.R import org.dslul.openboard.inputmethod.latin.common.Constants.* import org.dslul.openboard.inputmethod.latin.settings.Settings import org.dslul.openboard.inputmethod.latin.utils.ToolbarKey.* -import java.util.EnumSet fun createToolbarKey(context: Context, keyboardAttr: TypedArray, key: ToolbarKey): ImageButton { val button = ImageButton(context, null, R.attr.suggestionWordStyle) @@ -50,6 +49,9 @@ fun getCodeForToolbarKey(key: ToolbarKey) = when (key) { REDO -> CODE_REDO INCOGNITO -> CODE_TOGGLE_INCOGNITO AUTOCORRECT -> CODE_TOGGLE_AUTOCORRECT + FULL_LEFT -> CODE_HOME + FULL_RIGHT -> CODE_END + SELECT_WORD -> CODE_SELECT_WORD CLEAR_CLIPBOARD -> null // not managed via code input } @@ -69,18 +71,22 @@ private fun getStyleableIconId(key: ToolbarKey) = when (key) { INCOGNITO -> R.styleable.Keyboard_iconIncognitoKey AUTOCORRECT -> R.styleable.Keyboard_iconLanguageSwitchKey CLEAR_CLIPBOARD -> R.styleable.Keyboard_iconClearClipboardKey + FULL_LEFT -> R.styleable.Keyboard_iconFullLeft + FULL_RIGHT -> R.styleable.Keyboard_iconFullRight + SELECT_WORD -> R.styleable.Keyboard_iconSelectWord } // names need to be aligned with resources strings (using lowercase of key.name) enum class ToolbarKey { - VOICE, CLIPBOARD, UNDO, REDO, SETTINGS, SELECT_ALL, COPY, ONE_HANDED, LEFT, RIGHT, UP, DOWN, INCOGNITO, AUTOCORRECT, CLEAR_CLIPBOARD + VOICE, CLIPBOARD, UNDO, REDO, SETTINGS, SELECT_ALL, SELECT_WORD, COPY, ONE_HANDED, LEFT, RIGHT, UP, DOWN, + FULL_LEFT, FULL_RIGHT, INCOGNITO, AUTOCORRECT, CLEAR_CLIPBOARD } fun toToolbarKeyString(keys: Collection) = keys.joinToString(";") { it.name } val defaultToolbarPref = entries.filterNot { it == CLEAR_CLIPBOARD }.joinToString(";") { when (it) { - INCOGNITO, AUTOCORRECT, UP, DOWN, ONE_HANDED -> "${it.name},false" + INCOGNITO, AUTOCORRECT, UP, DOWN, ONE_HANDED, FULL_LEFT, FULL_RIGHT -> "${it.name},false" else -> "${it.name},true" } } diff --git a/app/src/main/res/drawable/ic_select.xml b/app/src/main/res/drawable/ic_select.xml new file mode 100644 index 000000000..89eb108a8 --- /dev/null +++ b/app/src/main/res/drawable/ic_select.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_to_end.xml b/app/src/main/res/drawable/ic_to_end.xml new file mode 100644 index 000000000..3bea3fbe4 --- /dev/null +++ b/app/src/main/res/drawable/ic_to_end.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_to_start.xml b/app/src/main/res/drawable/ic_to_start.xml new file mode 100644 index 000000000..9f6443836 --- /dev/null +++ b/app/src/main/res/drawable/ic_to_start.xml @@ -0,0 +1,4 @@ + + diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 2fce236d4..333904e39 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -271,6 +271,9 @@ + + + diff --git a/app/src/main/res/values/keyboard-icons-holo.xml b/app/src/main/res/values/keyboard-icons-holo.xml index 142190eac..d21ac0302 100644 --- a/app/src/main/res/values/keyboard-icons-holo.xml +++ b/app/src/main/res/values/keyboard-icons-holo.xml @@ -43,5 +43,8 @@ @drawable/ic_delete @drawable/ic_undo @drawable/ic_redo + @drawable/ic_to_start + @drawable/ic_to_end + @drawable/ic_select diff --git a/app/src/main/res/values/keyboard-icons-lxx-light.xml b/app/src/main/res/values/keyboard-icons-lxx-light.xml index 49c9401ec..09e145ab2 100644 --- a/app/src/main/res/values/keyboard-icons-lxx-light.xml +++ b/app/src/main/res/values/keyboard-icons-lxx-light.xml @@ -48,5 +48,8 @@ @drawable/ic_delete @drawable/ic_undo @drawable/ic_redo + @drawable/ic_to_start + @drawable/ic_to_end + @drawable/ic_select diff --git a/app/src/main/res/values/keyboard-icons-rounded.xml b/app/src/main/res/values/keyboard-icons-rounded.xml index c538539da..d936abf55 100644 --- a/app/src/main/res/values/keyboard-icons-rounded.xml +++ b/app/src/main/res/values/keyboard-icons-rounded.xml @@ -47,5 +47,8 @@ @drawable/ic_delete_rounded @drawable/ic_undo_rounded @drawable/ic_redo_rounded + @drawable/ic_to_start + @drawable/ic_to_end + @drawable/ic_select \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3aebdcc13..a53d9e7ee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -242,7 +242,10 @@ Voice input Settings @android:string/selectAll + Select word One-handed mode + Full left + Full right Left Right Up