From 0a1aed88d55213f2907fe852eefe2202a029b01a Mon Sep 17 00:00:00 2001 From: sspanak Date: Wed, 19 Jun 2024 15:13:52 +0300 Subject: [PATCH] the virtual arrow keys can now move the text cursor --- .../github/sspanak/tt9/ime/HotkeyHandler.java | 5 +++ .../sspanak/tt9/ime/helpers/TextField.java | 18 +++++++++ .../sspanak/tt9/ui/main/keys/SoftKey.java | 2 - .../tt9/ui/main/keys/SoftKeyArrow.java | 38 +++++++++++++++++++ app/src/main/res/layout/main_numpad.xml | 4 +- 5 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyArrow.java diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java index 709b8c3c..c25a9fde 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/HotkeyHandler.java @@ -101,6 +101,11 @@ public abstract class HotkeyHandler extends CommandHandler { } + public boolean onKeyMoveCursor(boolean backward) { + return textField.moveCursor(backward); + } + + public boolean onKeyFilterClear(boolean validateOnly) { if (suggestionOps.isEmpty()) { return false; diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java index 61c4e346..278a0f16 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/TextField.java @@ -5,6 +5,7 @@ import android.text.Spannable; import android.text.SpannableString; import android.text.style.StyleSpan; import android.text.style.UnderlineSpan; +import android.view.KeyEvent; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; @@ -233,4 +234,21 @@ public class TextField extends InputField { return styledWord; } + + + public boolean moveCursor(boolean backward) { + if ( + connection == null + || (backward && getStringBeforeCursor(1).isEmpty()) + || (!backward && getStringAfterCursor(1).isEmpty()) + ) { + return false; + } + + int keyCode = backward ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT; + connection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, keyCode)); + connection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, keyCode)); + + return true; + } } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java index 14b3215a..869e07c3 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKey.java @@ -151,8 +151,6 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement if (keyId == R.id.soft_key_add_word) { tt9.addWord(); return true; } if (keyId == R.id.soft_key_command_palette) return tt9.onKeyCommandPalette(false); - if (keyId == R.id.soft_key_left_arrow) return tt9.onKeyScrollSuggestion(false, true); - if (keyId == R.id.soft_key_right_arrow) return tt9.onKeyScrollSuggestion(false, false); if (keyId == R.id.soft_key_language) return tt9.onKeyNextLanguage(false); if (keyId == R.id.soft_key_settings) { tt9.showSettings(); return true; } if (keyId == R.id.soft_key_voice_input) { tt9.toggleVoiceInput(); return true; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyArrow.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyArrow.java new file mode 100644 index 00000000..e514968e --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftKeyArrow.java @@ -0,0 +1,38 @@ +package io.github.sspanak.tt9.ui.main.keys; + +import android.content.Context; +import android.util.AttributeSet; + +import io.github.sspanak.tt9.R; + +public class SoftKeyArrow extends SoftKey { + public SoftKeyArrow(Context context) { super(context); } + public SoftKeyArrow(Context context, AttributeSet attrs) { super(context, attrs); } + public SoftKeyArrow(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } + + @Override + protected boolean handleRelease() { + return handleHold(); + } + + @Override + protected boolean handleHold() { + if (!validateTT9Handler()) { + return false; + } + + int keyId = getId(); + if (keyId == R.id.soft_key_left_arrow) return onLeft(); + if (keyId == R.id.soft_key_right_arrow) return onRight(); + + return false; + } + + private boolean onLeft() { + return tt9.onKeyScrollSuggestion(false, true) || tt9.onKeyMoveCursor(true); + } + + private boolean onRight() { + return tt9.onKeyScrollSuggestion(false, false) || tt9.onKeyMoveCursor(false); + } +} diff --git a/app/src/main/res/layout/main_numpad.xml b/app/src/main/res/layout/main_numpad.xml index f3512634..3190b1c3 100644 --- a/app/src/main/res/layout/main_numpad.xml +++ b/app/src/main/res/layout/main_numpad.xml @@ -15,7 +15,7 @@ android:layout_height="@dimen/numpad_candidate_height" android:layoutDirection="ltr"> - -