diff --git a/app/src/main/java/com/fox2code/mmm/MainActivity.java b/app/src/main/java/com/fox2code/mmm/MainActivity.java index 020278b..5ef3082 100644 --- a/app/src/main/java/com/fox2code/mmm/MainActivity.java +++ b/app/src/main/java/com/fox2code/mmm/MainActivity.java @@ -105,7 +105,7 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O this.moduleList.setItemViewCacheSize(4); // Default is 2 OverScrollManager.install(this.moduleList, this); this.swipeRefreshLayout.setOnRefreshListener(this); - this.actionBarBlur.setBackground(this.actionBarBackground);; + this.actionBarBlur.setBackground(this.actionBarBackground); this.actionBarBlur.setupWith(this.moduleList).setFrameClearDrawable( this.getWindow().getDecorView().getBackground()) .setBlurAlgorithm(new RenderScriptBlur(this)) 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 9a944d9..32bdeb1 100644 --- a/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java +++ b/app/src/main/java/com/fox2code/mmm/compat/CompatActivity.java @@ -55,12 +55,12 @@ public class CompatActivity extends AppCompatActivity { private static final String TAG = "CompatActivity"; public static final CompatActivity.OnBackPressedCallback DISABLE_BACK_BUTTON = new CompatActivity.OnBackPressedCallback() { - @Override - public boolean onBackPressed(CompatActivity compatActivity) { - compatActivity.setOnBackPressedCallback(this); - return true; - } - }; + @Override + public boolean onBackPressed(CompatActivity compatActivity) { + compatActivity.setOnBackPressedCallback(this); + return true; + } + }; final WeakReference selfReference; private final CompatConfigHelper compatConfigHelper = new CompatConfigHelper(this); @@ -68,7 +68,8 @@ public class CompatActivity extends AppCompatActivity { private CompatActivity.OnBackPressedCallback onBackPressedCallback; private MenuItem.OnMenuItemClickListener menuClickListener; private CharSequence menuContentDescription; - @StyleRes private int setThemeDynamic = 0; + @StyleRes + private int setThemeDynamic = 0; private boolean onCreateCalledOnce = false; private boolean onCreateCalled = false; private boolean isRefreshUi = false; @@ -221,7 +222,8 @@ public class CompatActivity extends AppCompatActivity { } } - @Dimension @Px + @Dimension + @Px public int getActionBarHeight() { androidx.appcompat.app.ActionBar compatActionBar; try { @@ -247,6 +249,15 @@ public class CompatActivity extends AppCompatActivity { } } + public int getActionBarHeight(Activity activity) { + TypedValue tv = new TypedValue(); + int actionBarHeight = 0; + if (activity.getTheme().resolveAttribute(R.attr.actionBarSize, tv, true)) { + actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics()); + } + return actionBarHeight; + } + public void setActionBarBackground(Drawable drawable) { androidx.appcompat.app.ActionBar compatActionBar; try { @@ -264,7 +275,8 @@ public class CompatActivity extends AppCompatActivity { } } - @Dimension @Px + @Dimension + @Px public int getStatusBarHeight() { int height = WindowInsetsCompat.CONSUMED.getInsets( WindowInsetsCompat.Type.statusBars()).top; @@ -476,7 +488,7 @@ public class CompatActivity extends AppCompatActivity { this.checkResourcesOverrides(forceEnglish, nightModeOverride); } - private void checkResourcesOverrides(boolean forceEnglish,Boolean nightModeOverride) { + private void checkResourcesOverrides(boolean forceEnglish, Boolean nightModeOverride) { if (this.isRefreshUi || !this.onCreateCalled) return; // Wait before reload this.compatConfigHelper.checkResourcesOverrides(forceEnglish, nightModeOverride); } 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 bf2df21..0b15050 100644 --- a/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java +++ b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java @@ -2,13 +2,21 @@ package com.fox2code.mmm.markdown; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.content.res.Resources; import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.View; +import android.view.ViewConfiguration; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.WindowManager; import android.widget.HorizontalScrollView; +import android.widget.LinearLayout; +import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; @@ -21,6 +29,7 @@ import com.fox2code.mmm.MainApplication; import com.fox2code.mmm.R; import com.fox2code.mmm.XHooks; import com.fox2code.mmm.compat.CompatActivity; +import com.fox2code.mmm.compat.CompatDisplay; import com.fox2code.mmm.utils.Http; import com.fox2code.mmm.utils.IntentHelper; import com.google.android.material.chip.Chip; @@ -34,6 +43,7 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import eightbitlab.com.blurview.BlurView; +import eightbitlab.com.blurview.RenderScriptBlur; public class MarkdownActivity extends CompatActivity { @@ -42,6 +52,12 @@ public class MarkdownActivity extends CompatActivity { private static final String[] variants = new String[]{ "readme.md", "README.MD", ".github/README.md" }; + private BlurView chipHolder; + private TextView actionBarPadding; + private BlurView actionBarBlur; + private ColorDrawable anyBarBackground; + private ScrollView scrollView; + private LinearLayout md_layout; private static byte[] getRawMarkdown(String url) throws IOException { String newUrl = redirects.get(url); @@ -119,27 +135,38 @@ public class MarkdownActivity extends CompatActivity { setContentView(R.layout.markdown_view); final ViewGroup markdownBackground = findViewById(R.id.markdownBackground); final TextView textView = findViewById(R.id.markdownView); - final HorizontalScrollView chip_holder = findViewById(R.id.chip_holder); + this.chipHolder = findViewById(R.id.chip_holder); + this.anyBarBackground = new ColorDrawable(Color.TRANSPARENT); + this.actionBarPadding = findViewById(R.id.markdown_action_bar_padding); + this.actionBarBlur = findViewById(R.id.markdown_action_bar_blur); + this.scrollView = findViewById(R.id.scrollView2); + this.md_layout = findViewById(R.id.md_layout); final TextView footer = findViewById(R.id.markdownFooter); UiThreadHandler.handler.postDelayed(() -> // Fix footer height footer.setMinHeight(this.getNavigationBarHeight()), 1L); + this.actionBarBlur.setBackground(this.anyBarBackground); + this.setupBlurView(this.chipHolder, markdownBackground, this.anyBarBackground); + this.setupBlurView(this.actionBarBlur, markdownBackground, this.anyBarBackground); + this.updateScreenInsets(); + this.updateUI(); - // Really bad created + // Really bad created (MSG by Der_Googler) if (MainApplication.isChipsDisabled()) { - chip_holder.setVisibility(View.GONE); + this.chipHolder.setVisibility(View.GONE); } else { + this.chipHolder.setPadding(0,0,0,this.getNavigationBarHeight()); // set "message" to null to disable dialog - this.setChips(change_boot, + this.setChip(change_boot, getString(R.string.module_can_change_boot), "This module may change the boot image"); - this.setChips(needs_ramdisk, + this.setChip(needs_ramdisk, getString(R.string.module_needs_ramdisk), "This module need boot ramdisk to be installed"); - this.setChips(min_magisk, "Min. Magisk \"" + min_magisk + "\"", + this.setChip(min_magisk, "Min. Magisk \"" + min_magisk + "\"", null); - this.setChips(min_api, "Min. Android " + min_api, + this.setChip(min_api, "Min. Android " + min_api, null); - this.setChips(max_api, "Max. Android " + max_api, + this.setChip(max_api, "Max. Android " + max_api, null); } @@ -171,53 +198,121 @@ public class MarkdownActivity extends CompatActivity { }, "Markdown load thread").start(); } - private void setChips(boolean bool, String title, String message) { - final ChipGroup chip_group_holder = findViewById(R.id.chip_group_holder); + private void setupBlurView(BlurView view, ViewGroup setupWith, ColorDrawable background) { + view.setBackground(background); + view.setupWith(setupWith).setFrameClearDrawable( + this.getWindow().getDecorView().getBackground()) + .setBlurAlgorithm(new RenderScriptBlur(this)) + .setBlurRadius(4F).setBlurAutoUpdate(true) + .setHasFixedTransformationMatrix(true); + } + + private void updateScreenInsets() { + this.runOnUiThread(() -> this.updateScreenInsets( + this.getResources().getConfiguration())); + } + + private void updateScreenInsets(Configuration configuration) { + boolean landscape = configuration.orientation == + Configuration.ORIENTATION_LANDSCAPE; + int bottomInset = (landscape ? 0 : this.getNavigationBarHeight()); + int statusBarHeight = getStatusBarHeight(); + int actionBarHeight = getActionBarHeight(); + int combinedBarsHeight = statusBarHeight + actionBarHeight; + this.actionBarPadding.setMinHeight(combinedBarsHeight); + //this.actionBarBlur.invalidate(); + } + + private void updateUI() { + boolean isLightMode = this.isLightTheme(); + int colorBackground; + try { + colorBackground = this.getColorCompat( + android.R.attr.windowBackground); + } catch (Resources.NotFoundException e) { + colorBackground = this.getColorCompat(isLightMode ? + R.color.white : R.color.black); + } + this.md_layout.setPadding(0,this.getActionBarHeight(this) + this.getStatusBarHeight(),0,this.getNavigationBarHeight() + 56); + if (MainApplication.isBlurEnabled()) { + this.actionBarBlur.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, this.getActionBarHeight(this) + this.getStatusBarHeight())); + this.chipHolder.setBlurEnabled(true); + this.anyBarBackground.setColor(ColorUtils + .setAlphaComponent(colorBackground, 0x02)); + this.anyBarBackground.setColor(Color.TRANSPARENT); + this.actionBarBlur.setBlurEnabled(true); + } else { + this.chipHolder.setBlurEnabled(false); + this.chipHolder.setOverlayColor(Color.TRANSPARENT); + this.anyBarBackground.setColor(colorBackground); + this.actionBarBlur.setBlurEnabled(false); + this.actionBarBlur.setOverlayColor(Color.TRANSPARENT); + } + } + + private void setChip(boolean bool, String title, String message) { if (bool) { - Chip chip = new Chip(this); - chip.setText(title); - chip.setVisibility(View.VISIBLE); - if (message != null) { - chip.setOnClickListener(_view -> { - MaterialAlertDialogBuilder builder = - new MaterialAlertDialogBuilder(this); - - builder - .setTitle(title) - .setMessage(message) - .setCancelable(true) - .setPositiveButton(R.string.ok, (x, y) -> { - x.dismiss(); - }).show(); + this.makeChip(title, message); + } + } - }); - } - chip_group_holder.addView(chip); + private void setChip(int i, String title, String message) { + if (i != 0) { + this.makeChip(title, message); } } - private void setChips(int i, String title, String message) { + private void makeChip(String title, String message) { final ChipGroup chip_group_holder = findViewById(R.id.chip_group_holder); - if (i != 0) { - Chip chip = new Chip(this); - chip.setText(title); - chip.setVisibility(View.VISIBLE); - if (message != null) { - chip.setOnClickListener(_view -> { - MaterialAlertDialogBuilder builder = - new MaterialAlertDialogBuilder(this); - - builder - .setTitle(title) - .setMessage(message) - .setCancelable(true) - .setPositiveButton(R.string.ok, (x, y) -> { - x.dismiss(); - }).show(); + Chip chip = new Chip(this); + chip.setText(title); + chip.setVisibility(View.VISIBLE); + if (message != null) { + chip.setOnClickListener(_view -> { + MaterialAlertDialogBuilder builder = + new MaterialAlertDialogBuilder(this); - }); - } - chip_group_holder.addView(chip); + builder + .setTitle(title) + .setMessage(message) + .setCancelable(true) + .setPositiveButton(R.string.ok, (x, y) -> { + x.dismiss(); + }).show(); + + }); + } + chip_group_holder.addView(chip); + } + + private String parseAndroidVersion(int version) { + switch (version) { + case Build.VERSION_CODES.LOLLIPOP: + return "5.0"; + case Build.VERSION_CODES.LOLLIPOP_MR1: + return "5.1"; + case Build.VERSION_CODES.M: + return "6.0"; + case Build.VERSION_CODES.N: + return "7.0"; + case Build.VERSION_CODES.N_MR1: + return "7.1"; + case Build.VERSION_CODES.O: + return "8.0"; + case Build.VERSION_CODES.O_MR1: + return "8.1"; + case Build.VERSION_CODES.P: + return "9.0 (P)"; + case Build.VERSION_CODES.Q: + return "10 (Q)"; + case Build.VERSION_CODES.R: + return "11 (R)"; + case Build.VERSION_CODES.S: + return "12 (S)"; + case Build.VERSION_CODES.S_V2: + return "12L"; + default: + return "false"; } } diff --git a/app/src/main/java/com/fox2code/mmm/module/ActionButtonType.java b/app/src/main/java/com/fox2code/mmm/module/ActionButtonType.java index f248376..f566da8 100644 --- a/app/src/main/java/com/fox2code/mmm/module/ActionButtonType.java +++ b/app/src/main/java/com/fox2code/mmm/module/ActionButtonType.java @@ -4,13 +4,11 @@ import android.content.Context; import android.text.Spanned; import android.util.Log; import android.widget.Button; -import android.widget.ImageButton; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.DrawableRes; import androidx.appcompat.app.AlertDialog; -import androidx.core.content.ContextCompat; import com.fox2code.mmm.MainApplication; import com.fox2code.mmm.R; @@ -21,7 +19,6 @@ import com.fox2code.mmm.installer.InstallerInitializer; import com.fox2code.mmm.manager.LocalModuleInfo; import com.fox2code.mmm.manager.ModuleInfo; import com.fox2code.mmm.manager.ModuleManager; -import com.fox2code.mmm.module.ModuleHolder; import com.fox2code.mmm.utils.IntentHelper; import com.google.android.material.chip.Chip; import com.google.android.material.dialog.MaterialAlertDialogBuilder; diff --git a/app/src/main/res/layout/markdown_view.xml b/app/src/main/res/layout/markdown_view.xml index dfb1b41..a0aef44 100644 --- a/app/src/main/res/layout/markdown_view.xml +++ b/app/src/main/res/layout/markdown_view.xml @@ -1,21 +1,25 @@ - + app:fitsSystemWindowsInsets="left|right" + tools:context=".markdown.MarkdownActivity"> + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> @@ -35,21 +39,43 @@ - + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + + - + + + + + + + - + + + - - - \ No newline at end of file + diff --git a/build.gradle b/build.gradle index fc778d6..add2d58 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { mavenCentral() gradlePluginPortal() } - project.ext.latestAboutLibsRelease = "10.1.0" + project.ext.latestAboutLibsRelease = "10.2.0" dependencies { classpath 'com.android.tools.build:gradle:7.2.0' classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f8c7f12..3906632 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ +#Sun May 15 18:07:03 CEST 2022 distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip -zipStoreBase=GRADLE_USER_HOME +distributionPath=wrapper/dists zipStorePath=wrapper/dists -distributionSha256Sum=9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66 +zipStoreBase=GRADLE_USER_HOME +distributionSha256Sum=b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302 \ No newline at end of file