From 8742811d85e3f368f34cd9eeb15327de7692c678 Mon Sep 17 00:00:00 2001 From: sspanak Date: Fri, 13 Jun 2025 16:40:43 +0300 Subject: [PATCH] added a hack for Facebook Messenger to prevent keyboard hiding when trying to reply to a message and the Main View is set to 'Function Keys' --- .../io/github/sspanak/tt9/hacks/AppHacks.java | 34 +++++++++++++++++++ .../github/sspanak/tt9/hacks/InputType.java | 14 ++++++++ .../github/sspanak/tt9/ime/TraditionalT9.java | 2 ++ .../preferences/settings/SettingsHacks.java | 17 ++++++++++ .../sspanak/tt9/ui/main/MainLayoutSmall.java | 7 ++++ app/src/main/res/layout/main_small.xml | 1 + app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/styles.xml | 10 ++++-- 8 files changed, 84 insertions(+), 2 deletions(-) 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 e3c337d2..ac0fc60f 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 @@ -1,6 +1,7 @@ package io.github.sspanak.tt9.hacks; import android.view.KeyEvent; +import android.view.inputmethod.EditorInfo; import androidx.annotation.NonNull; @@ -11,8 +12,13 @@ import io.github.sspanak.tt9.ime.helpers.TextField; import io.github.sspanak.tt9.ime.helpers.TextSelection; import io.github.sspanak.tt9.ime.modes.InputMode; import io.github.sspanak.tt9.preferences.settings.SettingsStore; +import io.github.sspanak.tt9.util.Timer; public class AppHacks { + private final static String TYPING_SESSION_TIMER = "TYPING_SESSION_TIMER"; + private static boolean previousWasMessengerChat = false; + + private final InputType inputType; private final TextField textField; private final TextSelection textSelection; @@ -137,4 +143,32 @@ public class AppHacks { // As per the docs, we must return "false", to indicate that we have not "seen" the key press. return false; } + + + public static void onStart(@NonNull SettingsStore settings, @NonNull EditorInfo field) { + // currently, onStart() only adjusts the padding of MainSmall, so save some resources by not + // doing anything if another layout is used. + if (!settings.isMainLayoutSmall()) { + settings.setMessengerReplyExtraPadding(false); + return; + } + + final InputType newInputType = new InputType(null, field); + if (newInputType.notMessenger()) { + settings.setMessengerReplyExtraPadding(false); + return; + } + + final long previousSessionTime = Timer.stop(TYPING_SESSION_TIMER); + final boolean currentIsMessengerNonText = newInputType.isMessengerNonText(); + + if (previousSessionTime < 1000 && previousWasMessengerChat && currentIsMessengerNonText) { + settings.setMessengerReplyExtraPadding(true); + } else if (previousSessionTime > 1000 && previousWasMessengerChat) { + settings.setMessengerReplyExtraPadding(false); + } + + Timer.start(TYPING_SESSION_TIMER); + previousWasMessengerChat = newInputType.isMessengerChat(); + } } 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 5e16e485..f49b9c1b 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 @@ -106,6 +106,20 @@ public class InputType extends StandardInputType { } + public boolean notMessenger() { + return field == null || !field.packageName.equals("com.facebook.orca"); + } + + public boolean isMessengerChat() { + return isAppInput("com.facebook.orca", 147457); + } + + + public boolean isMessengerNonText() { + return isAppInput("com.facebook.orca", EditorInfo.TYPE_NULL); + } + + /** * Third-party apps are usually designed for a touch screen, so the least we can do is convert * DPAD_CENTER to ENTER for typing new lines, regardless of the implementation of the OK key. diff --git a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java index 15e2b66b..6723683d 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java +++ b/app/src/main/java/io/github/sspanak/tt9/ime/TraditionalT9.java @@ -11,6 +11,7 @@ import androidx.annotation.NonNull; import io.github.sspanak.tt9.db.DataStore; import io.github.sspanak.tt9.db.words.DictionaryLoader; +import io.github.sspanak.tt9.hacks.AppHacks; import io.github.sspanak.tt9.hacks.InputType; import io.github.sspanak.tt9.ime.modes.InputModeKind; import io.github.sspanak.tt9.languages.LanguageCollection; @@ -130,6 +131,7 @@ public class TraditionalT9 extends MainViewHandler { @Override protected boolean onStart(EditorInfo field) { + AppHacks.onStart(settings, field); if (zombieChecks == 0 && !SystemSettings.isTT9Selected(this)) { startZombieCheck(); return false; diff --git a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHacks.java b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHacks.java index ba3c4f7c..de5593ac 100644 --- a/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHacks.java +++ b/app/src/main/java/io/github/sspanak/tt9/preferences/settings/SettingsHacks.java @@ -83,4 +83,21 @@ class SettingsHacks extends BaseSettings { public boolean getPrecalculateNavbarHeight() { return prefs.getBoolean("hack_precalculate_navbar_height_v3", !DeviceInfo.IS_SAMSUNG); } + + + /** + * Facebook Messenger has a bug where when trying to reply to a message, and when the keyboard + * has certain height, it somehow switches the focus outside of the text field. The problematic + * height is exactly the height when the Main View is Small or when the Command Palette is shown. + * With this hack, we tell the Main View to become taller and mitigate the issue. + * More info: Issue 815. Note that the + * bug happens on every phone, not only on Freetel. + */ + public boolean getMessengerReplyExtraPadding() { + return prefs.getBoolean("hack_messenger_reply_extra_padding", false); + } + + public void setMessengerReplyExtraPadding(boolean enabled) { + prefsEditor.putBoolean("hack_messenger_reply_extra_padding", enabled).apply(); + } } diff --git a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutSmall.java b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutSmall.java index d06b157c..ad15bd5d 100644 --- a/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutSmall.java +++ b/app/src/main/java/io/github/sspanak/tt9/ui/main/MainLayoutSmall.java @@ -24,6 +24,10 @@ class MainLayoutSmall extends MainLayoutTray { if (!isCommandPaletteShown() && !isTextEditingPaletteShown()) { height += tt9.getResources().getDimensionPixelSize(R.dimen.main_small_main_key_wrapper_height); } + + if (tt9.getSettings().getMessengerReplyExtraPadding()) { + height += tt9.getResources().getDimensionPixelSize(R.dimen.main_small_main_key_wrapper_extra_height_for_messenger); + } } return height; @@ -33,6 +37,9 @@ class MainLayoutSmall extends MainLayoutTray { protected void setSoftKeysVisibility() { if (view != null) { view.findViewById(R.id.main_soft_keys).setVisibility(LinearLayout.VISIBLE); + view.findViewById(R.id.main_small_messenger_padding_hack).setVisibility( + tt9.getSettings().getMessengerReplyExtraPadding() ? LinearLayout.VISIBLE : LinearLayout.GONE + ); } } diff --git a/app/src/main/res/layout/main_small.xml b/app/src/main/res/layout/main_small.xml index 9d0ae0c3..9d44c498 100644 --- a/app/src/main/res/layout/main_small.xml +++ b/app/src/main/res/layout/main_small.xml @@ -10,6 +10,7 @@ + 18sp 46dp + 50dp 66dp 18dp diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index a7ee848c..ce411af2 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -142,10 +142,16 @@ Small Keys *******************************************--> + + +