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 3e06d2bf..e8b6595d 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 @@ -43,13 +43,19 @@ public abstract class HotkeyHandler extends TypingHandler { @Override public boolean onOK() { suggestionOps.cancelDelayedAccept(); - if (suggestionOps.isEmpty()) { - int action = textField.getAction(); - return action == TextField.IME_ACTION_ENTER ? appHacks.onEnter() : textField.performAction(action); - } else { + if (!suggestionOps.isEmpty()) { onAcceptSuggestionManually(suggestionOps.acceptCurrent(), KeyEvent.KEYCODE_ENTER); return true; } + + int action = textField.getAction(); + boolean actionPerformed = action == TextField.IME_ACTION_ENTER ? appHacks.onEnter() : textField.performAction(action); + + if (actionPerformed && action == TextField.IME_ACTION_ENTER) { + forceShowWindowIfHidden(); + } + + return actionPerformed; } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/AppHacks.java b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/AppHacks.java index 3c81fb92..b3ac2255 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/AppHacks.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/AppHacks.java @@ -69,9 +69,10 @@ public class AppHacks { } - private boolean isMultilineTextField() { + private boolean isMultilineTextInNonSystemApp() { return editorInfo != null + && !editorInfo.packageName.contains("android") && (editorInfo.inputType & TextField.TYPE_MULTILINE_TEXT) == TextField.TYPE_MULTILINE_TEXT; } @@ -133,30 +134,23 @@ public class AppHacks { * it does nothing. */ public boolean onEnter() { - if (isTermux()) { - sendDownUpKeyEvents(KeyEvent.KEYCODE_ENTER); - return true; - } else if (settings.getFbMessengerHack() && isMessenger()) { + if (settings.getFbMessengerHack() && isMessenger()) { return onEnterFbMessenger(); } else if (settings.getGoogleChatHack() && isGoogleChat()) { return onEnterGoogleChat(); - } else if (isMultilineTextField()) { - return onEnterMultilineText(); + } else if (isTermux() || isMultilineTextInNonSystemApp()) { + // 1. Termux supports only ENTER, so we convert DPAD_CENTER for it. + // 2. Any extra installed apps are likely not designed for hardware keypads, so again, + // we don't want to send DPAD_CENTER to them. + return sendDownUpKeyEvents(KeyEvent.KEYCODE_ENTER); } + // The rest of the cases are probably system apps or numeric fields, which should + // now how to handle the incoming OK key code, be it ENTER or DPAD_CENTER. return false; } - /** - * In generic text fields, or when no hacks are in effect, we just type a new line, - * as one would expect when pressing ENTER. - */ - private boolean onEnterMultilineText() { - return inputConnection != null && inputConnection.commitText("\n", 1); - } - - /** * onEnterFbMessenger * Messenger responds only to ENTER, but not DPAD_CENTER, so we make sure to send the correct code, @@ -194,17 +188,18 @@ public class AppHacks { } - private void sendDownUpKeyEvents(int keyCode) { - sendDownUpKeyEvents(keyCode, false); + private boolean sendDownUpKeyEvents(int keyCode) { + return sendDownUpKeyEvents(keyCode, false); } - private void sendDownUpKeyEvents(int keyCode, boolean shift) { + private boolean sendDownUpKeyEvents(int keyCode, boolean shift) { if (inputConnection != null) { KeyEvent downEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, shift ? KeyEvent.META_SHIFT_ON : 0); KeyEvent upEvent = new KeyEvent(0, 0, KeyEvent.ACTION_UP, keyCode, 0, shift ? KeyEvent.META_SHIFT_ON : 0); - inputConnection.sendKeyEvent(downEvent); - inputConnection.sendKeyEvent(upEvent); + return inputConnection.sendKeyEvent(downEvent) && inputConnection.sendKeyEvent(upEvent); } + + 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 0f09ec2c..fb396106 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 @@ -341,8 +341,8 @@ public class TextField { int standardAction = field.imeOptions & (EditorInfo.IME_MASK_ACTION | EditorInfo.IME_FLAG_NO_ENTER_ACTION); switch (standardAction) { - case EditorInfo.IME_ACTION_GO: case EditorInfo.IME_ACTION_DONE: + case EditorInfo.IME_ACTION_GO: case EditorInfo.IME_ACTION_NEXT: case EditorInfo.IME_ACTION_PREVIOUS: case EditorInfo.IME_ACTION_SEARCH: 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 9e6420bc..f074a90a 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 @@ -148,7 +148,6 @@ public class SoftKey extends androidx.appcompat.widget.AppCompatButton implement 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_ok) return tt9.onOK(); if (keyId == R.id.soft_key_settings) return tt9.onKeyShowSettings(false); return false; diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftOkKey.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftOkKey.java new file mode 100644 index 00000000..c59b6b3c --- /dev/null +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/keys/SoftOkKey.java @@ -0,0 +1,28 @@ +package io.github.sspanak.tt9.ui.main.keys; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.KeyEvent; + +public class SoftOkKey extends SoftKey { + + public SoftOkKey(Context context) { + super(context); + } + + public SoftOkKey(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public SoftOkKey(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected boolean handleRelease() { + return + validateTT9Handler() + && tt9.onKeyDown(KeyEvent.KEYCODE_ENTER, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER)) + && tt9.onKeyUp(KeyEvent.KEYCODE_ENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_ENTER)); + } +} diff --git a/app/src/main/res/layout/main_numpad.xml b/app/src/main/res/layout/main_numpad.xml index 1cc58e01..b58ab460 100644 --- a/app/src/main/res/layout/main_numpad.xml +++ b/app/src/main/res/layout/main_numpad.xml @@ -301,7 +301,7 @@ android:id="@+id/separator_4_2" style="@style/numSeparator" /> - -