From 2df59328966fcfefc53dc865bd71484e9fb200f7 Mon Sep 17 00:00:00 2001 From: sspanak Date: Fri, 17 Mar 2023 08:45:31 +0200 Subject: [PATCH] Improved OK handling * OK key now attempts to send DPAD_CENTER or ENTER (if needed), in attempt to make it work consistently accross all devices * OK is no longer ignored in numeric mode --- .../github/sspanak/tt9/ime/KeyPadHandler.java | 15 +++++++++------ .../github/sspanak/tt9/ime/TraditionalT9.java | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/io/github/sspanak/tt9/ime/KeyPadHandler.java b/src/io/github/sspanak/tt9/ime/KeyPadHandler.java index 3d1b1e7d..8e34d38f 100644 --- a/src/io/github/sspanak/tt9/ime/KeyPadHandler.java +++ b/src/io/github/sspanak/tt9/ime/KeyPadHandler.java @@ -144,6 +144,10 @@ abstract class KeyPadHandler extends InputMethodService { isBackspaceHandled = false; } + if (Key.isOK(keyCode)) { + return true; + } + // In numeric fields, we do not want to handle anything, but "backspace" if (mEditing == EDITING_STRICT_NUMERIC) { return false; @@ -171,8 +175,7 @@ abstract class KeyPadHandler extends InputMethodService { || keyCode == KeyEvent.KEYCODE_POUND || (Key.isNumber(keyCode) && shouldTrackNumPress()) || ((keyCode == KeyEvent.KEYCODE_DPAD_UP || keyCode == KeyEvent.KEYCODE_DPAD_DOWN) && shouldTrackUpDown()) - || ((keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) && shouldTrackLeftRight()) - || (mEditing != EDITING_NOSHOW && Key.isOK(keyCode)); + || ((keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) && shouldTrackLeftRight()); } @@ -235,6 +238,10 @@ abstract class KeyPadHandler extends InputMethodService { return true; } + if (Key.isOK(keyCode)) { + return onOK(); + } + // in numeric fields, we just handle backspace and let the rest go as-is. if (mEditing == EDITING_STRICT_NUMERIC) { return false; @@ -254,10 +261,6 @@ abstract class KeyPadHandler extends InputMethodService { return true; } - if (Key.isOK(keyCode)) { - return onOK(); - } - if (Key.isNumber(keyCode)) { return onNumber(Key.codeToNumber(settings, keyCode), false, numKeyRepeatCounter); } diff --git a/src/io/github/sspanak/tt9/ime/TraditionalT9.java b/src/io/github/sspanak/tt9/ime/TraditionalT9.java index e93a4712..69e4d885 100644 --- a/src/io/github/sspanak/tt9/ime/TraditionalT9.java +++ b/src/io/github/sspanak/tt9/ime/TraditionalT9.java @@ -616,7 +616,24 @@ public class TraditionalT9 extends KeyPadHandler { case EditorInfo.IME_ACTION_NONE: return false; case TextField.IME_ACTION_ENTER: - sendDownUpKeyEvents(KeyEvent.KEYCODE_ENTER); + String oldText = textField.getTextBeforeCursor() + textField.getTextAfterCursor(); + + sendDownUpKeyEvents(KeyEvent.KEYCODE_DPAD_CENTER); + + try { + // In Android there is no strictly defined confirmation key, hence DPAD_CENTER may have done nothing. + // If so, send an alternative key code as a final resort. + Thread.sleep(80); + String newText = textField.getTextBeforeCursor() + textField.getTextAfterCursor(); + if (newText.equals(oldText)) { + sendDownUpKeyEvents(KeyEvent.KEYCODE_ENTER); + } + } catch (InterruptedException e) { + // This thread got interrupted. Assume it's because the connected application has taken an action + // after receiving DPAD_CENTER, so we don't need to do anything else. + return true; + } + return true; default: return currentInputConnection.performEditorAction(action);