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">
-
-