From 1363f55f777fcab486cefafc8d1e82755fad2b46 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Fri, 23 Oct 2020 12:43:29 -0400 Subject: [PATCH] Fix back button behavior on OnePlus phones. Couple things happened: - Core issue: The device always thought the keyboard was open, so it was always trying to dismiss the keyboard when you pressed back (instead of actually going back) - Big fix: Increase the tolerance of our view height differentialt that detects if the keyboard is open - Other fix: the getViewInset() method is always missing on Q, so as a temp fix we fall back to the status bar height. Gets the calculation to be closer, even if not truly correct. --- .../components/KeyboardAwareLinearLayout.java | 20 +++++++++++-------- .../conversation/ConversationActivity.java | 10 +++++++--- app/src/main/res/values/dimens.xml | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java index f7fb35fdf6..2f8d312f93 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/KeyboardAwareLinearLayout.java @@ -23,6 +23,7 @@ import android.os.Build; import android.os.Build.VERSION_CODES; import android.preference.PreferenceManager; import androidx.appcompat.widget.LinearLayoutCompat; + import android.util.AttributeSet; import org.thoughtcrime.securesms.logging.Log; import android.view.Surface; @@ -31,6 +32,7 @@ import android.view.View; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.Util; +import org.thoughtcrime.securesms.util.ViewUtil; import java.lang.reflect.Field; import java.util.HashSet; @@ -69,17 +71,17 @@ public class KeyboardAwareLinearLayout extends LinearLayoutCompat { public KeyboardAwareLinearLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); - final int statusBarRes = getResources().getIdentifier("status_bar_height", "dimen", "android"); minKeyboardSize = getResources().getDimensionPixelSize(R.dimen.min_keyboard_size); minCustomKeyboardSize = getResources().getDimensionPixelSize(R.dimen.min_custom_keyboard_size); defaultCustomKeyboardSize = getResources().getDimensionPixelSize(R.dimen.default_custom_keyboard_size); minCustomKeyboardTopMarginPortrait = getResources().getDimensionPixelSize(R.dimen.min_custom_keyboard_top_margin_portrait); minCustomKeyboardTopMarginLandscape = getResources().getDimensionPixelSize(R.dimen.min_custom_keyboard_top_margin_portrait); - statusBarHeight = statusBarRes > 0 ? getResources().getDimensionPixelSize(statusBarRes) : 0; + statusBarHeight = ViewUtil.getStatusBarHeight(this); viewInset = getViewInset(); } - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { updateRotation(); updateKeyboardState(); super.onMeasure(widthMeasureSpec, heightMeasureSpec); @@ -100,7 +102,7 @@ public class KeyboardAwareLinearLayout extends LinearLayoutCompat { getWindowVisibleDisplayFrame(rect); final int availableHeight = getAvailableHeight(); - final int keyboardHeight = availableHeight - (rect.bottom - rect.top); + final int keyboardHeight = availableHeight - rect.bottom; if (keyboardHeight > minKeyboardSize) { if (getKeyboardHeight() != keyboardHeight) { @@ -128,17 +130,19 @@ public class KeyboardAwareLinearLayout extends LinearLayoutCompat { Field stableInsetsField = attachInfo.getClass().getDeclaredField("mStableInsets"); stableInsetsField.setAccessible(true); Rect insets = (Rect)stableInsetsField.get(attachInfo); - return insets.bottom; + if (insets != null) { + return insets.bottom; + } } } catch (NoSuchFieldException | IllegalAccessException e) { // Do nothing } - return 0; + return statusBarHeight; } private int getAvailableHeight() { - final int availableHeight = this.getRootView().getHeight() - viewInset - (!isFullscreen ? statusBarHeight : 0); - final int availableWidth = this.getRootView().getWidth() - (!isFullscreen ? statusBarHeight : 0); + final int availableHeight = this.getRootView().getHeight() - viewInset; + final int availableWidth = this.getRootView().getWidth(); if (isLandscape() && availableHeight > availableWidth) { //noinspection SuspiciousNameCombination diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 0b9bb4c8f3..df227b5fe5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -979,9 +979,13 @@ public class ConversationActivity extends PassphraseRequiredActivity @Override public void onBackPressed() { Log.d(TAG, "onBackPressed()"); - if (reactionOverlay.isShowing()) reactionOverlay.hide(); - else if (container.isInputOpen()) container.hideCurrentInput(composeText); - else super.onBackPressed(); + if (reactionOverlay.isShowing()) { + reactionOverlay.hide(); + } else if (container.isInputOpen()) { + container.hideCurrentInput(composeText); + } else { + super.onBackPressed(); + } } @Override diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 8a47253288..e5e980f5b0 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,7 +1,7 @@ 32sp - 50dp + 60dp 220dp 110dp 170dp