From 06fc2ab968bf92a386e93563cab13ad890225e11 Mon Sep 17 00:00:00 2001 From: Fox2Code Date: Thu, 3 Feb 2022 21:08:30 +0100 Subject: [PATCH] Allow modules to display under the nav bar. --- app/build.gradle | 2 + .../java/com/fox2code/mmm/MainActivity.java | 14 ++++++- .../fox2code/mmm/compat/CompatActivity.java | 42 +++++++++++++++++++ .../fox2code/mmm/compat/CompatDisplay.java | 8 ++-- app/src/main/res/layout/activity_main.xml | 7 +++- 5 files changed, 65 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index aa60c13..4ca0c08 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,6 +56,8 @@ dependencies { implementation 'androidx.webkit:webkit:1.4.0' implementation 'com.google.android.material:material:1.5.0' implementation "com.mikepenz:aboutlibraries:${latestAboutLibsRelease}" + implementation "dev.rikka.rikkax.layoutinflater:layoutinflater:1.2.0" + implementation "dev.rikka.rikkax.insets:insets:1.1.1" // Utils implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.9.3' diff --git a/app/src/main/java/com/fox2code/mmm/MainActivity.java b/app/src/main/java/com/fox2code/mmm/MainActivity.java index 374734e..e47153a 100644 --- a/app/src/main/java/com/fox2code/mmm/MainActivity.java +++ b/app/src/main/java/com/fox2code/mmm/MainActivity.java @@ -12,6 +12,7 @@ import android.os.Bundle; import android.util.Log; import android.util.TypedValue; import android.view.View; +import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import com.fox2code.mmm.compat.CompatActivity; @@ -53,6 +54,9 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O }); setContentView(R.layout.activity_main); this.setTitle(R.string.app_name); + this.getWindow().setFlags( + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); this.progressIndicator = findViewById(R.id.progress_bar); this.swipeRefreshLayout = findViewById(R.id.swipe_refresh); this.swipeRefreshBlocker = Long.MAX_VALUE; @@ -86,6 +90,7 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O }); this.searchView.setEnabled(false); // Enabled later this.cardIconifyUpdate(); + this.updateScreenInsets(); InstallerInitializer.tryGetMagiskPathAsync(new InstallerInitializer.Callback() { @Override public void onPathReceived(String path) { @@ -109,7 +114,7 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O public void commonNext() { swipeRefreshBlocker = System.currentTimeMillis() + 5_000L; - moduleViewListBuilder.setFooterPx(searchCard.getHeight()); // Fix an edge case + updateScreenInsets(); // Fix an edge case if (MainApplication.isShowcaseMode()) moduleViewListBuilder.addNotification(NotificationType.SHOWCASE_MODE); moduleViewListBuilder.applyTo(moduleList, moduleViewAdapter); @@ -171,7 +176,11 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O theme.resolveAttribute(backgroundAttr, value, true); this.searchCard.setCardBackgroundColor(value.data); this.searchCard.setAlpha(iconified ? 0.70F : 1F); - this.moduleViewListBuilder.setFooterPx(this.searchCard.getHeight()); + } + + private void updateScreenInsets() { + this.moduleViewListBuilder.setFooterPx( + this.getNavigationBarHeight() + this.searchCard.getHeight()); } @Override @@ -184,6 +193,7 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O this.searchView.clearFocus(); this.searchView.setIconified(true); this.cardIconifyUpdate(); + this.updateScreenInsets(); this.moduleViewListBuilder.setQuery(null); Log.i(TAG, "Item After"); this.moduleViewListBuilder.refreshNotificationsUI(this.moduleViewAdapter); diff --git a/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java b/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java index 9636090..09dfc64 100644 --- a/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java +++ b/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java @@ -13,10 +13,13 @@ import android.view.MenuItem; import android.view.View; import androidx.annotation.CallSuper; +import androidx.annotation.Dimension; import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; +import androidx.annotation.Px; import androidx.annotation.StyleRes; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; import com.fox2code.mmm.Constants; @@ -25,6 +28,9 @@ import com.fox2code.mmm.R; import java.util.Locale; import java.util.Objects; +import rikka.insets.WindowInsetsHelper; +import rikka.layoutinflater.view.LayoutInflaterFactory; + /** * I will probably outsource this to a separate library later */ @@ -55,6 +61,10 @@ public class CompatActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { + if (!this.onCreateCalled) { + this.getLayoutInflater().setFactory2(new LayoutInflaterFactory(this.getDelegate()) + .addOnViewCreatedListener(WindowInsetsHelper.Companion.getLISTENER())); + } Application application = this.getApplication(); if (application instanceof ApplicationCallbacks) { ((ApplicationCallbacks) application).onCreateCompatActivity(this); @@ -151,6 +161,38 @@ public class CompatActivity extends AppCompatActivity { } } + @Dimension @Px + public int getActionBarHeight() { + androidx.appcompat.app.ActionBar compatActionBar; + try { + compatActionBar = this.getSupportActionBar(); + } catch (Exception e) { + Log.e(TAG, "Failed to call getSupportActionBar", e); + compatActionBar = null; // Allow fallback to builtin actionBar. + } + if (compatActionBar != null) { + return compatActionBar.isShowing() ? compatActionBar.getHeight() : 0; + } else { + android.app.ActionBar actionBar = this.getActionBar(); + return actionBar != null && actionBar.isShowing() ? actionBar.getHeight() : 0; + } + } + + public int getNavigationBarHeight() { // How to improve this? + int height = WindowInsetsCompat.CONSUMED.getInsets( + WindowInsetsCompat.Type.navigationBars()).bottom; + if (height == 0) { // Fallback to system resources + int id = Resources.getSystem().getIdentifier( + "config_showNavigationBar", "bool", "android"); + if (id > 0 && Resources.getSystem().getBoolean(id)) { + id = Resources.getSystem().getIdentifier( + "navigation_bar_height", "dimen", "android"); + if (id > 0) return Resources.getSystem().getDimensionPixelSize(id); + } + } + return height; + } + public void setActionBarExtraMenuButton(@DrawableRes int drawableResId, MenuItem.OnMenuItemClickListener menuClickListener) { Objects.requireNonNull(menuClickListener); diff --git a/app/src/main/java/com/fox2code/mmm/compat/CompatDisplay.java b/app/src/main/java/com/fox2code/mmm/compat/CompatDisplay.java index f0ff3eb..15e8214 100644 --- a/app/src/main/java/com/fox2code/mmm/compat/CompatDisplay.java +++ b/app/src/main/java/com/fox2code/mmm/compat/CompatDisplay.java @@ -6,16 +6,16 @@ import android.util.DisplayMetrics; import androidx.annotation.Dimension; import androidx.annotation.Px; -public class CompatDisplay { +public final class CompatDisplay { @Dimension @Px - public static int dpToPixel(@Dimension(unit = Dimension.DP) int dp){ + public static int dpToPixel(@Dimension(unit = Dimension.DP) float dp){ return (int) (dp * ((float) Resources.getSystem().getDisplayMetrics() .densityDpi / DisplayMetrics.DENSITY_DEFAULT)); } @Dimension(unit = Dimension.DP) - public static int pixelsToDp(@Dimension @Px int px){ - return (int) (px / ((float) Resources.getSystem().getDisplayMetrics() + public static float pixelsToDp(@Dimension @Px int px){ + return (px / ((float) Resources.getSystem().getDisplayMetrics() .densityDpi / DisplayMetrics.DENSITY_DEFAULT)); } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8304e67..c88174d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,6 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + app:fitsSystemWindowsInsets="top" tools:context=".MainActivity"> + android:layout_height="match_parent" + app:edgeToEdge="true" /> + app:layout_constraintBottom_toBottomOf="parent" + app:fitsSystemWindowsInsets="bottom">