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
*******************************************-->
+
+
+