From c55a83b5d37c9b941fc3c174e0b675727093d664 Mon Sep 17 00:00:00 2001 From: sspanak Date: Sun, 7 Apr 2024 17:18:08 +0300 Subject: [PATCH] fixed OK not working in Sonim search fields --- .../github/sspanak/tt9/ime/HotkeyHandler.java | 11 ++++--- .../sspanak/tt9/ime/helpers/AppHacks.java | 30 ++++++++++++++++--- .../sspanak/tt9/ime/helpers/InputType.java | 12 ++++++++ .../sspanak/tt9/ime/helpers/TextField.java | 1 - .../github/sspanak/tt9/util/DeviceInfo.java | 4 +++ 5 files changed, 49 insertions(+), 9 deletions(-) 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 d5946b68..5f5e2662 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 @@ -49,13 +49,16 @@ public abstract class HotkeyHandler extends TypingHandler { } int action = textField.getAction(); - boolean actionPerformed = action == TextField.IME_ACTION_ENTER ? appHacks.onEnter() : textField.performAction(action); - if (actionPerformed && action == TextField.IME_ACTION_ENTER) { - forceShowWindowIfHidden(); + if (action == TextField.IME_ACTION_ENTER) { + boolean actionPerformed = appHacks.onEnter(); + if (actionPerformed) { + forceShowWindowIfHidden(); + } + return actionPerformed; } - return actionPerformed; + return appHacks.onAction(action) || textField.performAction(action); } 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 f68f54a2..777f8326 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 @@ -8,12 +8,14 @@ import androidx.annotation.NonNull; import io.github.sspanak.tt9.ime.modes.InputMode; import io.github.sspanak.tt9.preferences.settings.SettingsStore; +import io.github.sspanak.tt9.util.DeviceInfo; public class AppHacks { private final EditorInfo editorInfo; private final InputConnection inputConnection; private final SettingsStore settings; private final TextField textField; + private final InputType inputType; public AppHacks(SettingsStore settings, InputConnection inputConnection, EditorInfo inputField, TextField textField) { @@ -21,6 +23,7 @@ public class AppHacks { this.inputConnection = inputConnection; this.settings = settings; this.textField = textField; + this.inputType = new InputType(inputConnection, inputField); } @@ -70,10 +73,7 @@ public class AppHacks { private boolean isMultilineTextInNonSystemApp() { - return - editorInfo != null - && !editorInfo.packageName.contains("android") - && (editorInfo.inputType & TextField.TYPE_MULTILINE_TEXT) == TextField.TYPE_MULTILINE_TEXT; + return editorInfo != null && !editorInfo.packageName.contains("android") && inputType.isMultilineText(); } @@ -85,6 +85,19 @@ public class AppHacks { } + private boolean isSonimSearchField(int action) { + return + DeviceInfo.isSonim() && + editorInfo != null && (editorInfo.packageName.startsWith("com.android") || editorInfo.packageName.startsWith("com.sonim")) + && (editorInfo.imeOptions & EditorInfo.IME_MASK_ACTION) == action + && ( + inputType.isText() + // in some apps, they forgot to set the TEXT type, but fortunately, they did set the multiline flag. + || ((editorInfo.inputType & EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) == EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS) + ); + } + + /** * isAppField * Detects a particular input field of a particular application. @@ -126,6 +139,15 @@ public class AppHacks { } + public boolean onAction(int action) { + if (isSonimSearchField(action)) { + return sendDownUpKeyEvents(KeyEvent.KEYCODE_ENTER); + } + + return false; + } + + /** * onEnter * Tries to guess and send the correct confirmation key code or sequence of key codes, diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/InputType.java b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/InputType.java index 9f564518..a3a1970b 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/helpers/InputType.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/helpers/InputType.java @@ -9,6 +9,8 @@ import io.github.sspanak.tt9.ime.modes.InputMode; public class InputType { + private static final int TYPE_MULTILINE_TEXT = EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE; + private final InputConnection connection; private final EditorInfo field; @@ -118,6 +120,16 @@ public class InputType { } + public boolean isText() { + return field != null && (field.inputType & android.text.InputType.TYPE_MASK_CLASS) == android.text.InputType.TYPE_CLASS_TEXT; + } + + + public boolean isMultilineText() { + return field != null && (field.inputType & TYPE_MULTILINE_TEXT) == TYPE_MULTILINE_TEXT; + } + + private boolean isUri() { return field != null && (field.inputType & android.text.InputType.TYPE_MASK_VARIATION) == android.text.InputType.TYPE_TEXT_VARIATION_URI; } 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 d3f70675..cf6e2f76 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 @@ -19,7 +19,6 @@ import io.github.sspanak.tt9.util.Logger; import io.github.sspanak.tt9.util.Text; public class TextField { - public static final int TYPE_MULTILINE_TEXT = EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE; public static final int IME_ACTION_ENTER = EditorInfo.IME_MASK_ACTION + 1; private final InputConnection connection; diff --git a/app/src/main/java/io/github/sspanak/tt9/util/DeviceInfo.java b/app/src/main/java/io/github/sspanak/tt9/util/DeviceInfo.java index 393a3eab..5653b9c3 100644 --- a/app/src/main/java/io/github/sspanak/tt9/util/DeviceInfo.java +++ b/app/src/main/java/io/github/sspanak/tt9/util/DeviceInfo.java @@ -9,6 +9,10 @@ public class DeviceInfo { return Build.MANUFACTURER.equals("DuoQin") && Build.MODEL.contains("F21"); } + public static boolean isSonim() { + return Build.MANUFACTURER.equals("Sonimtech"); + } + @NonNull @Override public String toString() {