From ee51ec888c3ec09384c13bad8eac607d9f3fb75c Mon Sep 17 00:00:00 2001 From: sspanak Date: Mon, 14 Apr 2025 17:17:47 +0300 Subject: [PATCH] fixed the compatibility issue with MS Teams on Android 11 or higher, that completely prevented starting up (actually, hacked it) --- .../io/github/sspanak/tt9/hacks/InputType.java | 14 ++++++++++++++ .../io/github/sspanak/tt9/ime/TypingHandler.java | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) 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 da620583..3fcb5641 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 @@ -158,6 +158,20 @@ public class InputType extends StandardInputType { } + /** + * isTeams + * M$ Teams seems to control the keyboard visibility on its own. Initially, it always reports + * the input fields as TYPE_NULL, but once the keyboard accepts the show request, it switches to + * TYPE_CLASS_TEXT. This method used to enforce us to stay active at all times in Teams. + * The problem does not occur on all Android versions. I was able to reproduce it only on Unihertz + * Atom L (Android 11), but not on Energizer H620S (Android 10). The bug report also suggests it + * occurs on newer versions. See: #749. + */ + public boolean isTeams() { + return isAppField("com.microsoft.teams", EditorInfo.TYPE_NULL); + } + + public boolean isUs() { return isUs; } 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 ed466928..5b467fa9 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 @@ -289,7 +289,7 @@ public abstract class TypingHandler extends KeyPadHandler { * We do not want to handle any of these, hence we pass through all input to the system. */ protected int determineInputModeId() { - if (!inputType.isValid() || (inputType.isLimited() && !inputType.isTermux())) { + if (!inputType.isValid() || (inputType.isLimited() && !inputType.isTeams() && !inputType.isTermux())) { return InputMode.MODE_PASSTHROUGH; }