From e9f63718853b7e74a397d7075025f4b7ccbc89e9 Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Sat, 12 Dec 2020 12:45:45 +0100 Subject: [PATCH] Display the password reminder popup on top instead of the bottom This prevents the Android's autofill popup from occluding our popup --- .../aegis/helpers/MetricsHelper.java | 14 ++++++++++++++ .../com/beemdevelopment/aegis/ui/AuthActivity.java | 12 +++++++++++- .../aegis/ui/views/EntryListView.java | 3 ++- 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/beemdevelopment/aegis/helpers/MetricsHelper.java diff --git a/app/src/main/java/com/beemdevelopment/aegis/helpers/MetricsHelper.java b/app/src/main/java/com/beemdevelopment/aegis/helpers/MetricsHelper.java new file mode 100644 index 00000000..6bcc3c40 --- /dev/null +++ b/app/src/main/java/com/beemdevelopment/aegis/helpers/MetricsHelper.java @@ -0,0 +1,14 @@ +package com.beemdevelopment.aegis.helpers; + +import android.content.Context; +import android.util.DisplayMetrics; + +public class MetricsHelper { + private MetricsHelper() { + + } + + public static int convertDpToPixels(Context context, float dp) { + return (int) (dp * (context.getResources().getDisplayMetrics().densityDpi / DisplayMetrics.DENSITY_DEFAULT)); + } +} diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java index 8f63cb37..402b5f81 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/AuthActivity.java @@ -31,6 +31,7 @@ import com.beemdevelopment.aegis.crypto.KeyStoreHandleException; import com.beemdevelopment.aegis.crypto.MasterKey; import com.beemdevelopment.aegis.helpers.BiometricsHelper; import com.beemdevelopment.aegis.helpers.EditTextHelper; +import com.beemdevelopment.aegis.helpers.MetricsHelper; import com.beemdevelopment.aegis.helpers.UiThreadExecutor; import com.beemdevelopment.aegis.ui.tasks.PasswordSlotDecryptTask; import com.beemdevelopment.aegis.vault.VaultFile; @@ -231,13 +232,22 @@ public class AuthActivity extends AegisActivity { private void showPasswordReminder() { View popupLayout = getLayoutInflater().inflate(R.layout.popup_password, null); + popupLayout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + PopupWindow popup = new PopupWindow(popupLayout, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); popup.setFocusable(false); popup.setOutsideTouchable(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ popup.setElevation(5.0f); } - _textPassword.post(() -> popup.showAsDropDown(_textPassword)); + _textPassword.post(() -> { + // calculating the actual height of the popup window does not seem possible + // adding 25dp seems to look good enough + int yoff = _textPassword.getHeight() + + popupLayout.getMeasuredHeight() + + MetricsHelper.convertDpToPixels(this, 25); + popup.showAsDropDown(_textPassword, 0, -yoff); + }); _textPassword.postDelayed(popup::dismiss, 5000); } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java index 3e2079ba..34b271b5 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java @@ -24,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.beemdevelopment.aegis.R; import com.beemdevelopment.aegis.SortCategory; import com.beemdevelopment.aegis.ViewMode; +import com.beemdevelopment.aegis.helpers.MetricsHelper; import com.beemdevelopment.aegis.helpers.SimpleItemTouchHelperCallback; import com.beemdevelopment.aegis.helpers.UiRefresher; import com.beemdevelopment.aegis.otp.TotpInfo; @@ -392,7 +393,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { private VerticalSpaceItemDecoration(float dp) { // convert dp to pixels - _height = (int) (dp * (getContext().getResources().getDisplayMetrics().densityDpi / 160f)); + _height = MetricsHelper.convertDpToPixels(getContext(), dp); } @Override