From 2a97cbafa34d27b6560e7d628bf3f9afd76ad542 Mon Sep 17 00:00:00 2001 From: Fox2Code Date: Tue, 22 Feb 2022 06:04:58 +0100 Subject: [PATCH 1/3] Rework user interface, add blur view, fix landscape. --- .../java/com/fox2code/mmm/MainActivity.java | 67 +++++++++++++++++-- .../java/com/fox2code/mmm/ModuleHolder.java | 18 ++--- .../com/fox2code/mmm/ModuleViewAdapter.java | 7 +- .../fox2code/mmm/ModuleViewListBuilder.java | 36 ++++++++-- .../mmm/androidacy/AndroidacyWebAPI.java | 6 +- .../fox2code/mmm/compat/CompatActivity.java | 30 +++++++++ app/src/main/res/layout/activity_main.xml | 22 +++++- app/src/main/res/layout/module_entry.xml | 1 + app/src/main/res/values/colors.xml | 2 + 9 files changed, 166 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/fox2code/mmm/MainActivity.java b/app/src/main/java/com/fox2code/mmm/MainActivity.java index 07b4430..f3cb5eb 100644 --- a/app/src/main/java/com/fox2code/mmm/MainActivity.java +++ b/app/src/main/java/com/fox2code/mmm/MainActivity.java @@ -3,17 +3,24 @@ package com.fox2code.mmm; import androidx.annotation.NonNull; import androidx.appcompat.widget.SearchView; import androidx.cardview.widget.CardView; +import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.PixelFormat; +import android.os.Build; import android.os.Bundle; import android.util.Log; import android.util.TypedValue; import android.view.View; +import android.view.ViewGroup; +import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; +import android.widget.TextView; import com.fox2code.mmm.compat.CompatActivity; import com.fox2code.mmm.installer.InstallerInitializer; @@ -25,6 +32,9 @@ import com.fox2code.mmm.utils.Http; import com.fox2code.mmm.utils.IntentHelper; import com.google.android.material.progressindicator.LinearProgressIndicator; +import eightbitlab.com.blurview.BlurView; +import eightbitlab.com.blurview.RenderScriptBlur; + public class MainActivity extends CompatActivity implements SwipeRefreshLayout.OnRefreshListener, SearchView.OnQueryTextListener, SearchView.OnCloseListener { private static final String TAG = "MainActivity"; @@ -33,7 +43,11 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O public LinearProgressIndicator progressIndicator; private ModuleViewAdapter moduleViewAdapter; private SwipeRefreshLayout swipeRefreshLayout; + private int swipeRefreshLayoutOrigStartOffset; + private int swipeRefreshLayoutOrigEndOffset; private long swipeRefreshBlocker = 0; + private TextView actionBarPadding; + private BlurView actionBarBlur; private RecyclerView moduleList; private CardView searchCard; private SearchView searchView; @@ -55,10 +69,24 @@ 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); + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, + WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | + WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + WindowManager.LayoutParams layoutParams = this.getWindow().getAttributes(); + layoutParams.layoutInDisplayCutoutMode = // Support cutout in Android 9 + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES; + this.getWindow().setAttributes(layoutParams); + } + this.actionBarPadding = findViewById(R.id.action_bar_padding); + this.actionBarBlur = findViewById(R.id.action_bar_blur); this.progressIndicator = findViewById(R.id.progress_bar); this.swipeRefreshLayout = findViewById(R.id.swipe_refresh); + this.swipeRefreshLayoutOrigStartOffset = + this.swipeRefreshLayout.getProgressViewStartOffset(); + this.swipeRefreshLayoutOrigEndOffset = + this.swipeRefreshLayout.getProgressViewEndOffset(); this.swipeRefreshBlocker = Long.MAX_VALUE; this.moduleList = findViewById(R.id.module_list); this.searchCard = findViewById(R.id.search_card); @@ -68,6 +96,11 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O this.moduleList.setLayoutManager(new LinearLayoutManager(this)); this.moduleList.setItemViewCacheSize(4); // Default is 2 this.swipeRefreshLayout.setOnRefreshListener(this); + this.actionBarBlur.setupWith(this.moduleList).setFrameClearDrawable( + this.getWindow().getDecorView().getBackground()) + .setBlurAlgorithm(new RenderScriptBlur(this)) + .setBlurRadius(5F).setBlurAutoUpdate(true) + .setHasFixedTransformationMatrix(true); this.moduleList.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { @@ -158,6 +191,7 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O progressIndicator.setProgressCompat(PRECISION, true); progressIndicator.setVisibility(View.GONE); searchView.setEnabled(true); + setActionBarBackground(null); }); moduleViewListBuilder.appendRemoteModules(); moduleViewListBuilder.applyTo(moduleList, moduleViewAdapter); @@ -175,12 +209,29 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O TypedValue value = new TypedValue(); theme.resolveAttribute(backgroundAttr, value, true); this.searchCard.setCardBackgroundColor(value.data); - this.searchCard.setAlpha(iconified ? 0.70F : 1F); + this.searchCard.setAlpha(iconified ? 0.80F : 1F); } private void updateScreenInsets() { - this.moduleViewListBuilder.setFooterPx( - this.getNavigationBarHeight() + this.searchCard.getHeight()); + this.runOnUiThread(() -> this.updateScreenInsets( + this.getResources().getConfiguration())); + } + + private void updateScreenInsets(Configuration configuration) { + boolean landscape = configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE; + int statusBarHeight = getStatusBarHeight(); + int actionBarHeight = getActionBarHeight(); + int combinedBarsHeight = statusBarHeight + actionBarHeight; + this.actionBarPadding.setMinHeight(combinedBarsHeight); + this.swipeRefreshLayout.setProgressViewOffset(false, + swipeRefreshLayoutOrigStartOffset + combinedBarsHeight, + swipeRefreshLayoutOrigEndOffset + combinedBarsHeight); + this.moduleViewListBuilder.setHeaderPx(actionBarHeight); + this.moduleViewListBuilder.setFooterPx((landscape ? 0 : + this.getNavigationBarHeight()) + this.searchCard.getHeight()); + this.moduleViewListBuilder.updateInsets(); + this.actionBarBlur.invalidate(); } @Override @@ -234,6 +285,12 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O this.initMode = false; } + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + this.updateScreenInsets(newConfig); + super.onConfigurationChanged(newConfig); + } + @Override public void onRefresh() { if (this.swipeRefreshBlocker > System.currentTimeMillis() || diff --git a/app/src/main/java/com/fox2code/mmm/ModuleHolder.java b/app/src/main/java/com/fox2code/mmm/ModuleHolder.java index 2c81567..73ff0dd 100644 --- a/app/src/main/java/com/fox2code/mmm/ModuleHolder.java +++ b/app/src/main/java/com/fox2code/mmm/ModuleHolder.java @@ -24,7 +24,7 @@ public final class ModuleHolder implements Comparable { public final String moduleId; public final NotificationType notificationType; public final Type separator; - public final int footerPx; + public int footerPx; public View.OnClickListener onClickListener; public LocalModuleInfo moduleInfo; public RepoModule repoModule; @@ -34,32 +34,33 @@ public final class ModuleHolder implements Comparable { this.moduleId = Objects.requireNonNull(moduleId); this.notificationType = null; this.separator = null; - this.footerPx = 0; + this.footerPx = -1; } public ModuleHolder(NotificationType notificationType) { this.moduleId = ""; this.notificationType = Objects.requireNonNull(notificationType); this.separator = null; - this.footerPx = 0; + this.footerPx = -1; } public ModuleHolder(Type separator) { this.moduleId = ""; this.notificationType = null; this.separator = separator; - this.footerPx = 0; + this.footerPx = -1; } - public ModuleHolder(int footerPx) { + public ModuleHolder(int footerPx,boolean header) { this.moduleId = ""; this.notificationType = null; this.separator = null; this.footerPx = footerPx; + this.filterLevel = header ? 1 : 0; } public boolean isModuleHolder() { - return this.notificationType == null && this.separator == null && this.footerPx == 0; + return this.notificationType == null && this.separator == null && this.footerPx == -1; } public ModuleInfo getMainModuleInfo() { @@ -115,7 +116,7 @@ public final class ModuleHolder implements Comparable { } public Type getType() { - if (this.footerPx != 0) { + if (this.footerPx != -1) { return Type.FOOTER; } else if (this.separator != null) { return Type.SEPARATOR; @@ -145,7 +146,7 @@ public final class ModuleHolder implements Comparable { public boolean shouldRemove() { return this.notificationType != null ? this.notificationType.shouldRemove() : - this.footerPx == 0 && this.moduleInfo == null && + this.footerPx == -1 && this.moduleInfo == null && (this.repoModule == null || !this.repoModule.repoData.isEnabled() || (PropUtils.isLowQualityModule(this.repoModule.moduleInfo) && !MainApplication.isDisableLowQualityModuleFilter())); @@ -207,6 +208,7 @@ public final class ModuleHolder implements Comparable { } public enum Type implements Comparator { + HEADER(R.string.loading, false, false), SEPARATOR(R.string.loading, false, false) { @Override @SuppressWarnings("ConstantConditions") diff --git a/app/src/main/java/com/fox2code/mmm/ModuleViewAdapter.java b/app/src/main/java/com/fox2code/mmm/ModuleViewAdapter.java index fdc6d83..0b44297 100644 --- a/app/src/main/java/com/fox2code/mmm/ModuleViewAdapter.java +++ b/app/src/main/java/com/fox2code/mmm/ModuleViewAdapter.java @@ -26,6 +26,7 @@ import com.google.android.material.switchmaterial.SwitchMaterial; import com.topjohnwu.superuser.internal.UiThreadHandler; import java.util.ArrayList; +import java.util.Objects; public final class ModuleViewAdapter extends RecyclerView.Adapter { private static final boolean DEBUG = false; @@ -182,14 +183,16 @@ public final class ModuleViewAdapter extends RecyclerView.Adapter localModuleInfo.updateVersionCode) { this.creditText.setText((localModuleInfo == null || - moduleInfo.version.equals(localModuleInfo.version) ? + Objects.equals(moduleInfo.version, localModuleInfo.version) ? moduleInfo.version : localModuleInfo.version + " (" + this.getString(R.string.module_last_update) + moduleInfo.version + ")") + " " + this.getString(R.string.module_by) + " " + moduleInfo.author); } else { this.creditText.setText(localModuleInfo.version + ( - localModuleInfo.version.equals(localModuleInfo.updateVersion) ? + (localModuleInfo.updateVersion != null && + Objects.equals(localModuleInfo.version, + localModuleInfo.updateVersion)) ? "" : " (" + this.getString(R.string.module_last_update) + localModuleInfo.updateVersion + ")") + " " + this.getString(R.string.module_by) + " " + localModuleInfo.author); diff --git a/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java b/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java index 70069f5..b09af2a 100644 --- a/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java +++ b/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java @@ -23,6 +23,7 @@ import java.util.Locale; public class ModuleViewListBuilder { private static final String TAG = "ModuleViewListBuilder"; + private static final Runnable RUNNABLE = () -> {}; private final EnumSet notifications = EnumSet.noneOf(NotificationType.class); private final HashMap mappedModuleHolders = new HashMap<>(); private final Object updateLock = new Object(); @@ -31,8 +32,10 @@ public class ModuleViewListBuilder { @NonNull private String query = ""; private boolean updating; + private int headerPx; private int footerPx; private ModuleSorter moduleSorter = ModuleSorter.UPDATE; + private Runnable updateInsets = RUNNABLE; public ModuleViewListBuilder(Activity activity) { this.activity = activity; @@ -100,6 +103,7 @@ public class ModuleViewListBuilder { this.updating = true; final ArrayList moduleHolders; final int newNotificationsLen; + final ModuleHolder[] headerFooter = new ModuleHolder[2]; try { synchronized (this.updateLock) { // Build start @@ -150,9 +154,12 @@ public class ModuleViewListBuilder { } } Collections.sort(moduleHolders, this.moduleSorter); - if (this.footerPx != 0) { // Footer is always last - moduleHolders.add(new ModuleHolder(this.footerPx)); - } + // Header is always first + moduleHolders.add(0, headerFooter[0] = + new ModuleHolder(this.headerPx, true)); + // Footer is always last + moduleHolders.add(headerFooter[1] = + new ModuleHolder(this.footerPx, false)); Log.i(TAG, "Got " + moduleHolders.size() + " entries!"); // Build end } @@ -160,6 +167,7 @@ public class ModuleViewListBuilder { this.updating = false; } this.activity.runOnUiThread(() -> { + this.updateInsets = RUNNABLE; final EnumSet oldNotifications = EnumSet.noneOf(NotificationType.class); boolean isTop = !moduleList.canScrollVertically(-1); @@ -172,7 +180,8 @@ public class ModuleViewListBuilder { oldNotifications.add(notificationType); if (!notificationType.special) oldNotificationsLen++; - } + } else if (moduleHolder.footerPx != -1) + oldNotificationsLen++; // Fix header if (moduleHolder.separator == ModuleHolder.Type.INSTALLABLE) break; oldOfflineModulesLen++; @@ -208,6 +217,13 @@ public class ModuleViewListBuilder { } if (isTop) moduleList.scrollToPosition(0); if (isBottom) moduleList.scrollToPosition(newLen); + this.updateInsets = () -> { + headerFooter[0].footerPx = this.headerPx; + headerFooter[1].footerPx = this.footerPx; + notifySizeChanged(moduleViewAdapter, 0, 1, 1); + notifySizeChanged(moduleViewAdapter, + moduleHolders.size(), 1, 1); + }; }); } @@ -281,6 +297,14 @@ public class ModuleViewListBuilder { return true; } + public void setHeaderPx(int headerPx) { + if (this.headerPx != headerPx) { + synchronized (this.updateLock) { + this.headerPx = headerPx; + } + } + } + public void setFooterPx(int footerPx) { if (this.footerPx != footerPx) { synchronized (this.updateLock) { @@ -288,4 +312,8 @@ public class ModuleViewListBuilder { } } } + + public void updateInsets() { + this.updateInsets.run(); + } } diff --git a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java index 50144d1..2a91d7b 100644 --- a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java +++ b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java @@ -165,13 +165,17 @@ public class AndroidacyWebAPI { /** * Show action bar if not visible, the action bar is only visible by default on notes. + * Optional title param to set action bar title. */ @JavascriptInterface - public void showActionBar() { + public void showActionBar(final String title) { if (this.consumedAction) return; this.consumedAction = true; this.activity.runOnUiThread(() -> { this.activity.showActionBar(); + if (title != null && !title.isEmpty()) { + this.activity.setTitle(title); + } this.consumedAction = false; }); } 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 2f13c25..4783397 100644 --- a/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java +++ b/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java @@ -6,6 +6,7 @@ import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.res.Resources; +import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.util.Log; @@ -198,6 +199,35 @@ public class CompatActivity extends AppCompatActivity { } } + public void setActionBarBackground(Drawable drawable) { + 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) { + compatActionBar.setBackgroundDrawable(drawable); + } else { + android.app.ActionBar actionBar = this.getActionBar(); + if (actionBar != null) + actionBar.setBackgroundDrawable(drawable); + } + } + + @Dimension @Px + public int getStatusBarHeight() { // How to improve this? + int height = WindowInsetsCompat.CONSUMED.getInsets( + WindowInsetsCompat.Type.statusBars()).top; + if (height == 0) { // Fallback to system resources + int id = Resources.getSystem().getIdentifier( + "status_bar_height", "dimen", "android"); + if (id > 0) return Resources.getSystem().getDimensionPixelSize(id); + } + return height; + } + public int getNavigationBarHeight() { // How to improve this? int height = WindowInsetsCompat.CONSUMED.getInsets( WindowInsetsCompat.Type.navigationBars()).bottom; diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index c4a1fc4..8165540 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -2,9 +2,10 @@ + + + + + app:layout_constraintTop_toBottomOf="@+id/action_bar_blur" /> + android:layout_height="wrap_content" + android:background="@null" /> diff --git a/app/src/main/res/layout/module_entry.xml b/app/src/main/res/layout/module_entry.xml index a2c8d55..b718051 100644 --- a/app/src/main/res/layout/module_entry.xml +++ b/app/src/main/res/layout/module_entry.xml @@ -17,6 +17,7 @@ android:layout_height="wrap_content" app:cardCornerRadius="@dimen/card_corner_radius" app:strokeColor="@android:color/transparent" + app:cardPreventCornerOverlap="true" app:strokeWidth="0dp"> #FF018786 #EF6C00 #FFA726 + #80000000 + #80FFFFFF #FF000000 #FFFFFFFF \ No newline at end of file From 63224b76fdb18b464de25b62861ef04e50490969 Mon Sep 17 00:00:00 2001 From: Fox2Code Date: Wed, 23 Feb 2022 15:36:26 +0100 Subject: [PATCH 2/3] Fix top inset bug, try to workaround no root/magisk issues. --- .../main/java/com/fox2code/mmm/MainActivity.java | 2 ++ .../com/fox2code/mmm/ModuleViewListBuilder.java | 12 ++++++++++-- .../mmm/installer/InstallerInitializer.java | 15 +++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/fox2code/mmm/MainActivity.java b/app/src/main/java/com/fox2code/mmm/MainActivity.java index f3cb5eb..73d25ad 100644 --- a/app/src/main/java/com/fox2code/mmm/MainActivity.java +++ b/app/src/main/java/com/fox2code/mmm/MainActivity.java @@ -154,6 +154,8 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O runOnUiThread(() -> { progressIndicator.setIndeterminate(false); progressIndicator.setMax(PRECISION); + // Fix insets not being accounted for correctly + updateScreenInsets(getResources().getConfiguration()); }); Log.i(TAG, "Scanning for modules!"); final int max = ModuleManager.getINSTANCE().getUpdatableModuleCount(); diff --git a/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java b/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java index b09af2a..fc4a173 100644 --- a/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java +++ b/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java @@ -120,7 +120,7 @@ public class ModuleViewListBuilder { moduleHolders.add(new ModuleHolder(notificationType)); } } - newNotificationsLen = this.notifications.size() - special; + newNotificationsLen = this.notifications.size() + 1 - special; EnumSet headerTypes = EnumSet.of(ModuleHolder.Type.SEPARATOR, ModuleHolder.Type.NOTIFICATION, ModuleHolder.Type.FOOTER); Iterator moduleHolderIterator = this.mappedModuleHolders.values().iterator(); @@ -170,7 +170,9 @@ public class ModuleViewListBuilder { this.updateInsets = RUNNABLE; final EnumSet oldNotifications = EnumSet.noneOf(NotificationType.class); - boolean isTop = !moduleList.canScrollVertically(-1); + boolean isTop = // Force isTop if empty + moduleViewAdapter.moduleHolders.isEmpty() || + !moduleList.canScrollVertically(-1); boolean isBottom = !isTop && !moduleList.canScrollVertically(1); int oldNotificationsLen = 0; int oldOfflineModulesLen = 0; @@ -199,10 +201,16 @@ public class ModuleViewListBuilder { int oldLen = moduleViewAdapter.moduleHolders.size(); moduleViewAdapter.moduleHolders.clear(); moduleViewAdapter.moduleHolders.addAll(moduleHolders); + synchronized (this.updateLock) { + headerFooter[0].footerPx = this.headerPx; + headerFooter[1].footerPx = this.footerPx; + } if (oldNotificationsLen != newNotificationsLen || !oldNotifications.equals(this.notifications)) { notifySizeChanged(moduleViewAdapter, 0, oldNotificationsLen, newNotificationsLen); + } else { + notifySizeChanged(moduleViewAdapter, 0, 1, 1); } if (newLen - newNotificationsLen == 0) { notifySizeChanged(moduleViewAdapter, newNotificationsLen, diff --git a/app/src/main/java/com/fox2code/mmm/installer/InstallerInitializer.java b/app/src/main/java/com/fox2code/mmm/installer/InstallerInitializer.java index c983549..111947a 100644 --- a/app/src/main/java/com/fox2code/mmm/installer/InstallerInitializer.java +++ b/app/src/main/java/com/fox2code/mmm/installer/InstallerInitializer.java @@ -15,6 +15,8 @@ import java.util.ArrayList; public class InstallerInitializer extends Shell.Initializer { private static final String TAG = "InstallerInitializer"; + private static final File MAGISK_SYSTEM = + new File("/system/bin/magisk"); private static String MAGISK_PATH; private static int MAGISK_VERSION_CODE; @@ -64,6 +66,9 @@ public class InstallerInitializer extends Shell.Initializer { } if (forceCheck) { InstallerInitializer.MAGISK_PATH = MAGISK_PATH; + if (MAGISK_PATH == null) { + InstallerInitializer.MAGISK_VERSION_CODE = 0; + } } if (MAGISK_PATH != null) { MainApplication.setHasGottenRootAccess(true); @@ -112,9 +117,15 @@ public class InstallerInitializer extends Shell.Initializer { Log.w(TAG, "Unable to detect magisk path!"); } else { newJob.add("export ASH_STANDALONE=1"); - newJob.add("export PATH=\"" + MAGISK_PATH + "/.magisk/busybox;$PATH\""); + if (!MAGISK_PATH.equals("/sbin") && !MAGISK_SYSTEM.exists()) { + newJob.add("export PATH=" + MAGISK_PATH + ";$PATH;" + + MAGISK_PATH + "/.magisk/busybox"); + } else { + newJob.add("export PATH=$PATH;" + + MAGISK_PATH + "/.magisk/busybox"); + } newJob.add("export MAGISKTMP=\"" + MAGISK_PATH + "/.magisk\""); - newJob.add("busybox sh"); + newJob.add("$(which busybox 2> /dev/null) sh"); } return true; } From 6f7c40393e2e51e2ea004ad18df1cb4ec934a785 Mon Sep 17 00:00:00 2001 From: Fox2Code Date: Wed, 23 Feb 2022 21:30:51 +0100 Subject: [PATCH 3/3] Improve layout and top blur, fix light theme. --- .../java/com/fox2code/mmm/MainActivity.java | 34 +++++-- .../fox2code/mmm/ModuleViewListBuilder.java | 9 +- .../com/fox2code/mmm/OverScrollManager.java | 92 +++++++++++++++++++ .../mmm/androidacy/AndroidacyActivity.java | 9 +- .../fox2code/mmm/compat/CompatActivity.java | 9 ++ .../mmm/compat/CompatConfigHelper.java | 40 +++++--- .../mmm/installer/InstallerActivity.java | 1 + .../mmm/markdown/MarkdownActivity.java | 3 +- .../mmm/settings/SettingsActivity.java | 12 ++- app/src/main/res/layout/activity_main.xml | 13 +-- app/src/main/res/layout/module_entry.xml | 1 + app/src/main/res/values-v23/colors.xml | 4 + app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/themes.xml | 11 ++- 14 files changed, 200 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/fox2code/mmm/OverScrollManager.java create mode 100644 app/src/main/res/values-v23/colors.xml diff --git a/app/src/main/java/com/fox2code/mmm/MainActivity.java b/app/src/main/java/com/fox2code/mmm/MainActivity.java index 73d25ad..7e7c8ac 100644 --- a/app/src/main/java/com/fox2code/mmm/MainActivity.java +++ b/app/src/main/java/com/fox2code/mmm/MainActivity.java @@ -3,21 +3,17 @@ package com.fox2code.mmm; import androidx.annotation.NonNull; import androidx.appcompat.widget.SearchView; import androidx.cardview.widget.CardView; -import androidx.core.view.WindowInsetsCompat; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import android.content.res.Configuration; import android.content.res.Resources; -import android.graphics.PixelFormat; import android.os.Build; import android.os.Bundle; import android.util.Log; import android.util.TypedValue; import android.view.View; -import android.view.ViewGroup; -import android.view.Window; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; import android.widget.TextView; @@ -36,7 +32,8 @@ import eightbitlab.com.blurview.BlurView; import eightbitlab.com.blurview.RenderScriptBlur; public class MainActivity extends CompatActivity implements SwipeRefreshLayout.OnRefreshListener, - SearchView.OnQueryTextListener, SearchView.OnCloseListener { + SearchView.OnQueryTextListener, SearchView.OnCloseListener, + OverScrollManager.OverScrollHelper { private static final String TAG = "MainActivity"; private static final int PRECISION = 10000; public final ModuleViewListBuilder moduleViewListBuilder; @@ -46,6 +43,8 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O private int swipeRefreshLayoutOrigStartOffset; private int swipeRefreshLayoutOrigEndOffset; private long swipeRefreshBlocker = 0; + private int overScrollInsetTop; + private int overScrollInsetBottom; private TextView actionBarPadding; private BlurView actionBarBlur; private RecyclerView moduleList; @@ -70,9 +69,10 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O this.setTitle(R.string.app_name); this.getWindow().setFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | - WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION | - WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); + setActionBarBackground(null); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { WindowManager.LayoutParams layoutParams = this.getWindow().getAttributes(); layoutParams.layoutInDisplayCutoutMode = // Support cutout in Android 9 @@ -95,6 +95,7 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O this.moduleList.setAdapter(this.moduleViewAdapter); this.moduleList.setLayoutManager(new LinearLayoutManager(this)); this.moduleList.setItemViewCacheSize(4); // Default is 2 + OverScrollManager.install(this.moduleList, this); this.swipeRefreshLayout.setOnRefreshListener(this); this.actionBarBlur.setupWith(this.moduleList).setFrameClearDrawable( this.getWindow().getDecorView().getBackground()) @@ -109,7 +110,7 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O } }); this.searchView.setImeOptions(EditorInfo.IME_ACTION_SEARCH | - EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_FLAG_FORCE_ASCII); + EditorInfo.IME_FLAG_NO_FULLSCREEN); this.searchView.setOnQueryTextListener(this); this.searchView.setOnCloseListener(this); this.searchView.setOnQueryTextFocusChangeListener((v, h) -> { @@ -230,10 +231,13 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O swipeRefreshLayoutOrigStartOffset + combinedBarsHeight, swipeRefreshLayoutOrigEndOffset + combinedBarsHeight); this.moduleViewListBuilder.setHeaderPx(actionBarHeight); - this.moduleViewListBuilder.setFooterPx((landscape ? 0 : - this.getNavigationBarHeight()) + this.searchCard.getHeight()); + int bottomInset = (landscape ? 0 : this.getNavigationBarHeight()); + this.moduleViewListBuilder.setFooterPx( + bottomInset + this.searchCard.getHeight()); this.moduleViewListBuilder.updateInsets(); this.actionBarBlur.invalidate(); + this.overScrollInsetTop = combinedBarsHeight; + this.overScrollInsetBottom = bottomInset; } @Override @@ -360,4 +364,14 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O } return false; } + + @Override + public int getOverScrollInsetTop() { + return this.overScrollInsetTop; + } + + @Override + public int getOverScrollInsetBottom() { + return this.overScrollInsetBottom; + } } \ No newline at end of file diff --git a/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java b/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java index fc4a173..ec074a2 100644 --- a/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java +++ b/app/src/main/java/com/fox2code/mmm/ModuleViewListBuilder.java @@ -103,6 +103,7 @@ public class ModuleViewListBuilder { this.updating = true; final ArrayList moduleHolders; final int newNotificationsLen; + final boolean first; final ModuleHolder[] headerFooter = new ModuleHolder[2]; try { synchronized (this.updateLock) { @@ -120,6 +121,7 @@ public class ModuleViewListBuilder { moduleHolders.add(new ModuleHolder(notificationType)); } } + first = moduleViewAdapter.moduleHolders.isEmpty(); newNotificationsLen = this.notifications.size() + 1 - special; EnumSet headerTypes = EnumSet.of(ModuleHolder.Type.SEPARATOR, ModuleHolder.Type.NOTIFICATION, ModuleHolder.Type.FOOTER); @@ -170,9 +172,7 @@ public class ModuleViewListBuilder { this.updateInsets = RUNNABLE; final EnumSet oldNotifications = EnumSet.noneOf(NotificationType.class); - boolean isTop = // Force isTop if empty - moduleViewAdapter.moduleHolders.isEmpty() || - !moduleList.canScrollVertically(-1); + boolean isTop = first || !moduleList.canScrollVertically(-1); boolean isBottom = !isTop && !moduleList.canScrollVertically(1); int oldNotificationsLen = 0; int oldOfflineModulesLen = 0; @@ -182,7 +182,8 @@ public class ModuleViewListBuilder { oldNotifications.add(notificationType); if (!notificationType.special) oldNotificationsLen++; - } else if (moduleHolder.footerPx != -1) + } else if (moduleHolder.footerPx != -1 && + moduleHolder.filterLevel == 1) oldNotificationsLen++; // Fix header if (moduleHolder.separator == ModuleHolder.Type.INSTALLABLE) break; diff --git a/app/src/main/java/com/fox2code/mmm/OverScrollManager.java b/app/src/main/java/com/fox2code/mmm/OverScrollManager.java new file mode 100644 index 0000000..0b81b6c --- /dev/null +++ b/app/src/main/java/com/fox2code/mmm/OverScrollManager.java @@ -0,0 +1,92 @@ +package com.fox2code.mmm; + +import android.util.Log; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.fox2code.mmm.compat.CompatDisplay; +import com.mikepenz.aboutlibraries.LibsConfiguration; + +public class OverScrollManager { + private static final String TAG = "OverScrollManager"; + + public interface OverScrollHelper { + int getOverScrollInsetTop(); + + int getOverScrollInsetBottom(); + } + + public static class LibsOverScroll implements LibsConfiguration.LibsUIListener { + private final OverScrollHelper overScrollHelper; + + public LibsOverScroll() { + this.overScrollHelper = null; + } + + public LibsOverScroll(OverScrollHelper overScrollHelper) { + this.overScrollHelper = overScrollHelper; + } + + @NonNull + @Override + public View preOnCreateView(@NonNull View view) { + return view; + } + + @NonNull + @Override + public View postOnCreateView(@NonNull View view) { + OverScrollManager.install( + view.findViewById(R.id.cardListView), + this.overScrollHelper); + return view; + } + } + + public static void install(final RecyclerView recyclerView) { + OverScrollManager.install(recyclerView, null); + } + + public static void install(final RecyclerView recyclerView, + final OverScrollHelper overScrollHelper) { + if (recyclerView == null) return; + recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); + recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + int prevState = -1, lastTranslation = 0; + + @Override + public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { + if (newState == RecyclerView.SCROLL_STATE_IDLE && this.prevState != newState) { + if (recyclerView.getOverScrollMode() != View.OVER_SCROLL_NEVER) + recyclerView.setOverScrollMode(View.OVER_SCROLL_NEVER); + final int threshold = CompatDisplay.dpToPixel(16); + final int lastTranslation = this.lastTranslation; + if (lastTranslation < threshold) { + this.prevState = newState; + return; + } + final int insetTop; + final int insetBottom; + if (overScrollHelper == null) { + insetTop = 0; + insetBottom = 0; + } else { + insetTop = overScrollHelper.getOverScrollInsetTop(); + insetBottom = overScrollHelper.getOverScrollInsetBottom(); + } + Log.d(TAG, "Overscroll: " + lastTranslation + " -> (" + + insetTop + ", " + insetBottom + ")"); + // TODO Overscroll effect for 5.0 (With settings toggle) + } + this.prevState = newState; + } + + @Override + public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { + this.lastTranslation = dy; + } + }); + } +} diff --git a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java index 26830f8..c965735 100644 --- a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java +++ b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java @@ -78,11 +78,16 @@ public class AndroidacyActivity extends CompatActivity { String title = intent.getStringExtra(Constants.EXTRA_ANDROIDACY_ACTIONBAR_TITLE); String config = intent.getStringExtra(Constants.EXTRA_ANDROIDACY_ACTIONBAR_CONFIG); this.setContentView(R.layout.webview); + setActionBarBackground(null); + this.setDisplayHomeAsUpEnabled(true); + if (title == null || title.isEmpty()) { + this.setTitle(title); + } else { + this.setTitle("Androidacy"); + } if (allowInstall || title == null || title.isEmpty()) { this.hideActionBar(); } else { // Only used for note section - this.setTitle(title); - this.setDisplayHomeAsUpEnabled(true); if (config != null && !config.isEmpty()) { String configPkg = IntentHelper.getPackageOfConfig(config); try { 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 4783397..87d4675 100644 --- a/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java +++ b/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java @@ -5,6 +5,7 @@ import android.app.Application; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Build; @@ -17,6 +18,7 @@ import android.view.View; import androidx.annotation.CallSuper; import androidx.annotation.Dimension; import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.Px; import androidx.annotation.StringRes; @@ -322,6 +324,13 @@ public class CompatActivity extends AppCompatActivity { } } + @Override + public void onConfigurationChanged(@NonNull Configuration newConfig) { + this.compatConfigHelper.checkResourcesOverrides(this.getTheme(), + this.forceEnglish, this.nightModeOverride); + super.onConfigurationChanged(newConfig); + } + public void setOnBackPressedCallback(OnBackPressedCallback onBackPressedCallback) { this.onBackPressedCallback = onBackPressedCallback; } diff --git a/app/src/main/java/com/fox2code/mmm/compat/CompatConfigHelper.java b/app/src/main/java/com/fox2code/mmm/compat/CompatConfigHelper.java index 86ab063..e9655dc 100644 --- a/app/src/main/java/com/fox2code/mmm/compat/CompatConfigHelper.java +++ b/app/src/main/java/com/fox2code/mmm/compat/CompatConfigHelper.java @@ -14,9 +14,13 @@ import java.util.Locale; final class CompatConfigHelper { // ENGLISH like this is an unnatural local, as it doesn't precise the country // All english locales settable by the user precise the country (Ex: en-US) - private static final Locale english = Locale.ENGLISH; + private static final Locale englishLocale = Locale.ENGLISH; + private static final Object englishLocales = + Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? + new LocaleList(englishLocale) : null; private final Context context; + private Object userLocales; private Locale userLocale; CompatConfigHelper(Context context) { @@ -32,22 +36,35 @@ final class CompatConfigHelper { void checkResourcesOverrides(Resources.Theme theme, boolean forceEnglish, Boolean nightModeOverride) { - final Resources res = theme.getResources(); - final Configuration conf = res.getConfiguration(); + Resources res = theme.getResources(); + if (this.checkResourcesOverrides(res.getConfiguration(), + forceEnglish, nightModeOverride)) { + res.updateConfiguration( + res.getConfiguration(), + res.getDisplayMetrics()); + } + } + + boolean checkResourcesOverrides(Configuration conf, boolean forceEnglish, + Boolean nightModeOverride) { Locale current = conf.locale; boolean didChange = false; - if (forceEnglish != current.equals(english)) { + boolean wasForceEnglish = englishLocale.equals(current); + if (forceEnglish != wasForceEnglish) { didChange = true; if (forceEnglish) { this.userLocale = conf.locale; - conf.locale = english; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - conf.setLocales(LocaleList.getEmptyLocaleList()); + this.userLocales = conf.getLocales(); + } + conf.locale = englishLocale; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + conf.setLocales((LocaleList) englishLocales); } } else { conf.locale = this.userLocale; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - conf.setLocales(LocaleList.getAdjustedDefault()); + conf.setLocales((LocaleList) this.userLocales); } } } @@ -62,15 +79,16 @@ final class CompatConfigHelper { Configuration.UI_MODE_NIGHT_YES : Configuration.UI_MODE_NIGHT_NO; conf.uiMode = nightMode | (conf.uiMode & ~Configuration.UI_MODE_NIGHT_MASK); } - if (didChange) { - res.updateConfiguration(conf, null); - if (!forceEnglish) this.userLocale = null; + if (!forceEnglish && !wasForceEnglish) { + this.userLocale = null; + this.userLocales = null; } + return didChange; } public Locale getUserLocale() { // Only use cached value if force english Locale locale = this.context.getResources().getConfiguration().locale; - return english.equals(locale) ? this.userLocale : locale; + return englishLocale.equals(locale) ? this.userLocale : locale; } } diff --git a/app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java b/app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java index 149b301..f9b5fdd 100644 --- a/app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java +++ b/app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java @@ -57,6 +57,7 @@ public class InstallerActivity extends CompatActivity { Log.e(TAG, "Failed to mkdir module cache dir!"); super.onCreate(savedInstanceState); this.setDisplayHomeAsUpEnabled(true); + setActionBarBackground(null); this.setOnBackPressedCallback(a -> { this.canceled = true; return false; }); diff --git a/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java index e123cc5..cdd3c80 100644 --- a/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java +++ b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java @@ -43,8 +43,9 @@ public class MarkdownActivity extends CompatActivity { String config = intent.getExtras() .getString(Constants.EXTRA_MARKDOWN_CONFIG); if (title != null && !title.isEmpty()) { - setTitle(title); + this.setTitle(title); } + setActionBarBackground(null); this.getWindow().setFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); diff --git a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java index dfe0ad2..8b079c4 100644 --- a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java +++ b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java @@ -1,19 +1,23 @@ package com.fox2code.mmm.settings; import android.os.Bundle; +import android.view.View; import android.widget.Toast; +import androidx.annotation.NonNull; import androidx.annotation.StringRes; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentTransaction; import androidx.preference.ListPreference; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; +import androidx.recyclerview.widget.RecyclerView; import com.fox2code.mmm.AppUpdateManager; import com.fox2code.mmm.BuildConfig; import com.fox2code.mmm.Constants; import com.fox2code.mmm.MainApplication; +import com.fox2code.mmm.OverScrollManager; import com.fox2code.mmm.R; import com.fox2code.mmm.compat.CompatActivity; import com.fox2code.mmm.compat.CompatThemeWrapper; @@ -23,6 +27,8 @@ import com.fox2code.mmm.repo.RepoManager; import com.fox2code.mmm.utils.Http; import com.fox2code.mmm.utils.IntentHelper; import com.mikepenz.aboutlibraries.LibsBuilder; +import com.mikepenz.aboutlibraries.LibsConfiguration; +import com.mikepenz.aboutlibraries.ui.LibsSupportFragment; import com.topjohnwu.superuser.internal.UiThreadHandler; public class SettingsActivity extends CompatActivity { @@ -35,6 +41,7 @@ public class SettingsActivity extends CompatActivity { this.setDisplayHomeAsUpEnabled(true); setContentView(R.layout.settings_activity); setTitle(R.string.app_name); + setActionBarBackground(null); if (savedInstanceState == null) { getSupportFragmentManager() .beginTransaction() @@ -50,6 +57,7 @@ public class SettingsActivity extends CompatActivity { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { getPreferenceManager().setSharedPreferencesName("mmm"); setPreferencesFromResource(R.xml.root_preferences, rootKey); + OverScrollManager.install(getListView()); findPreference("pref_manage_repos").setOnPreferenceClickListener(p -> { devModeStep = 0; openFragment(new RepoFragment(), R.string.manage_repos_pref); @@ -100,7 +108,8 @@ public class SettingsActivity extends CompatActivity { } final LibsBuilder libsBuilder = new LibsBuilder().withShowLoadingProgress(false) - .withLicenseShown(true).withAboutMinimalDesign(false); + .withLicenseShown(true).withAboutMinimalDesign(false) + .withUiListener(new OverScrollManager.LibsOverScroll()); Preference update = findPreference("pref_update"); update.setVisible(AppUpdateManager.getAppUpdateManager().peekHasUpdate()); update.setOnPreferenceClickListener(p -> { @@ -162,6 +171,7 @@ public class SettingsActivity extends CompatActivity { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { getPreferenceManager().setSharedPreferencesName("mmm"); setPreferencesFromResource(R.xml.repo_preferences, rootKey); + OverScrollManager.install(getListView()); setRepoData(RepoManager.MAGISK_ALT_REPO, "Magisk Modules Alt Repo", RepoManager.MAGISK_ALT_REPO_HOMEPAGE, null, null, diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 8165540..2002bd0 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -50,15 +50,15 @@ android:id="@+id/search_container" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginLeft="8dp" - android:layout_marginRight="8dp" + android:layout_marginLeft="12dp" + android:layout_marginRight="12dp" android:layout_marginTop="8dp" android:layout_marginBottom="8dp" - android:gravity="center_vertical" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toStartOf="parent" + android:gravity="right" + app:layout_constraintRight_toRightOf="parent" app:layout_constraintBottom_toBottomOf="parent" - app:fitsSystemWindowsInsets="bottom"> + app:fitsSystemWindowsInsets="bottom" + tools:ignore="RtlHardcoded"> + + @color/transparent + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 26ab45f..ba10cbe 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,6 +9,8 @@ #FFA726 #80000000 #80FFFFFF + #00000000 #FF000000 #FFFFFFFF + @color/black_transparent \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 0cddfb5..f163125 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -4,7 +4,7 @@ tools:targetApi="q">true true - @color/white + @color/orange_200 @color/white @color/white @@ -12,7 +12,8 @@ @color/orange_200 @color/white - ?attr/colorPrimaryVariant + @color/status_bar_color + true true