diff --git a/app/src/main/java/io/github/sspanak/tt9/hacks/AppHacks.java b/app/src/main/java/io/github/sspanak/tt9/hacks/AppHacks.java index 45c9bccf..4ca005fa 100644 --- a/app/src/main/java/io/github/sspanak/tt9/hacks/AppHacks.java +++ b/app/src/main/java/io/github/sspanak/tt9/hacks/AppHacks.java @@ -70,6 +70,19 @@ public class AppHacks { } + /** + * Handles applications that always report no text around the cursor, preventing the cursor from + * moving the usual way. + */ + public boolean onMoveCursor(boolean backward) { + if (inputType.isRustDesk() || inputType.isTermux()) { + return sendDownUpKeyEvents(backward ? KeyEvent.KEYCODE_DPAD_LEFT : KeyEvent.KEYCODE_DPAD_RIGHT); + } + + return false; + } + + /** * Performs extra operations when the cursor moves and returns "true" if the selection was handled, "false" otherwise. */ diff --git a/app/src/main/java/io/github/sspanak/tt9/hacks/InputType.java b/app/src/main/java/io/github/sspanak/tt9/hacks/InputType.java index b69f0e0e..872a8058 100644 --- a/app/src/main/java/io/github/sspanak/tt9/hacks/InputType.java +++ b/app/src/main/java/io/github/sspanak/tt9/hacks/InputType.java @@ -65,6 +65,21 @@ public class InputType extends StandardInputType { } + /** + * RustDesk does not support composing text when connected to a remote computer. This detects the + * "remote input field", so that we can prevent inserting any composing text, but still perform + * the composing operation behind the scenes. + */ + public boolean isRustDesk() { + final int OPTIONS_MASK = EditorInfo.IME_ACTION_NONE | EditorInfo.IME_FLAG_NO_FULLSCREEN; + + return isAppField( + "com.carriez.flutter_hbb", + EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_FLAG_MULTI_LINE | EditorInfo.TYPE_TEXT_FLAG_NO_SUGGESTIONS + ) && (field.imeOptions & OPTIONS_MASK) == OPTIONS_MASK; + } + + /** * Simulate the behavior of the Sonim native keyboard. In search fields with integrated lists, * ENTER is used to select an item from the list. But some of them have actionId = NEXT, instead of NONE, 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 c25a9fde..c88ccbf7 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 @@ -102,7 +102,7 @@ public abstract class HotkeyHandler extends CommandHandler { public boolean onKeyMoveCursor(boolean backward) { - return textField.moveCursor(backward); + return appHacks.onMoveCursor(backward) || textField.moveCursor(backward); } diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java b/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java index 94a9f726..990cfa79 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TypingHandler.java @@ -77,6 +77,10 @@ public abstract class TypingHandler extends KeyPadHandler { protected void setInputField(InputConnection connection, EditorInfo field) { + if (textField.equals(connection, field)) { + return; + } + currentInputConnection = connection; inputType = new InputType(currentInputConnection, field); textField = new TextField(currentInputConnection, field); @@ -198,7 +202,7 @@ public abstract class TypingHandler extends KeyPadHandler { private void autoCorrectSpace(String currentWord, boolean isWordAcceptedManually, int nextKey) { - if (mInputMode.shouldDeletePrecedingSpace(inputType)) { + if (!inputType.isRustDesk() && mInputMode.shouldDeletePrecedingSpace(inputType)) { textField.deletePrecedingSpace(currentWord); } 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 278a0f16..eb7c2b65 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 @@ -27,7 +27,7 @@ public class TextField extends InputField { super(inputConnection, inputField); InputType inputType = new InputType(inputConnection, inputField); - isComposingSupported = !inputType.isNumeric() && !inputType.isLimited(); + isComposingSupported = !inputType.isNumeric() && !inputType.isLimited() && !inputType.isRustDesk(); }