Many improvements

- [CODE] Change `distributionSha256Sum`
- [DESIGN] Rework markdown activity with blur support (beta)
- [API] added `this.getActionBarHeight(this);` to get the right action bar height (old one is still available)
- [CHIPS (MD)] Added chips for `Min. Android [...]`,`Max. Android [...]`, `Min. Magisk "[...]"`
- [CHIPS (MD)] Added an Android version parser
pull/145/head
DerGoogler 2 years ago
parent fa46b79c3e
commit ab5361a276

@ -105,7 +105,7 @@ public class MainActivity extends CompatActivity implements SwipeRefreshLayout.O
this.moduleList.setItemViewCacheSize(4); // Default is 2 this.moduleList.setItemViewCacheSize(4); // Default is 2
OverScrollManager.install(this.moduleList, this); OverScrollManager.install(this.moduleList, this);
this.swipeRefreshLayout.setOnRefreshListener(this); this.swipeRefreshLayout.setOnRefreshListener(this);
this.actionBarBlur.setBackground(this.actionBarBackground);; this.actionBarBlur.setBackground(this.actionBarBackground);
this.actionBarBlur.setupWith(this.moduleList).setFrameClearDrawable( this.actionBarBlur.setupWith(this.moduleList).setFrameClearDrawable(
this.getWindow().getDecorView().getBackground()) this.getWindow().getDecorView().getBackground())
.setBlurAlgorithm(new RenderScriptBlur(this)) .setBlurAlgorithm(new RenderScriptBlur(this))

@ -55,12 +55,12 @@ public class CompatActivity extends AppCompatActivity {
private static final String TAG = "CompatActivity"; private static final String TAG = "CompatActivity";
public static final CompatActivity.OnBackPressedCallback DISABLE_BACK_BUTTON = public static final CompatActivity.OnBackPressedCallback DISABLE_BACK_BUTTON =
new CompatActivity.OnBackPressedCallback() { new CompatActivity.OnBackPressedCallback() {
@Override @Override
public boolean onBackPressed(CompatActivity compatActivity) { public boolean onBackPressed(CompatActivity compatActivity) {
compatActivity.setOnBackPressedCallback(this); compatActivity.setOnBackPressedCallback(this);
return true; return true;
} }
}; };
final WeakReference<CompatActivity> selfReference; final WeakReference<CompatActivity> selfReference;
private final CompatConfigHelper compatConfigHelper = new CompatConfigHelper(this); private final CompatConfigHelper compatConfigHelper = new CompatConfigHelper(this);
@ -68,7 +68,8 @@ public class CompatActivity extends AppCompatActivity {
private CompatActivity.OnBackPressedCallback onBackPressedCallback; private CompatActivity.OnBackPressedCallback onBackPressedCallback;
private MenuItem.OnMenuItemClickListener menuClickListener; private MenuItem.OnMenuItemClickListener menuClickListener;
private CharSequence menuContentDescription; private CharSequence menuContentDescription;
@StyleRes private int setThemeDynamic = 0; @StyleRes
private int setThemeDynamic = 0;
private boolean onCreateCalledOnce = false; private boolean onCreateCalledOnce = false;
private boolean onCreateCalled = false; private boolean onCreateCalled = false;
private boolean isRefreshUi = false; private boolean isRefreshUi = false;
@ -221,7 +222,8 @@ public class CompatActivity extends AppCompatActivity {
} }
} }
@Dimension @Px @Dimension
@Px
public int getActionBarHeight() { public int getActionBarHeight() {
androidx.appcompat.app.ActionBar compatActionBar; androidx.appcompat.app.ActionBar compatActionBar;
try { 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) { public void setActionBarBackground(Drawable drawable) {
androidx.appcompat.app.ActionBar compatActionBar; androidx.appcompat.app.ActionBar compatActionBar;
try { try {
@ -264,7 +275,8 @@ public class CompatActivity extends AppCompatActivity {
} }
} }
@Dimension @Px @Dimension
@Px
public int getStatusBarHeight() { public int getStatusBarHeight() {
int height = WindowInsetsCompat.CONSUMED.getInsets( int height = WindowInsetsCompat.CONSUMED.getInsets(
WindowInsetsCompat.Type.statusBars()).top; WindowInsetsCompat.Type.statusBars()).top;
@ -476,7 +488,7 @@ public class CompatActivity extends AppCompatActivity {
this.checkResourcesOverrides(forceEnglish, nightModeOverride); 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 if (this.isRefreshUi || !this.onCreateCalled) return; // Wait before reload
this.compatConfigHelper.checkResourcesOverrides(forceEnglish, nightModeOverride); this.compatConfigHelper.checkResourcesOverrides(forceEnglish, nightModeOverride);
} }

@ -2,13 +2,21 @@ package com.fox2code.mmm.markdown;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.HorizontalScrollView; import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
@ -21,6 +29,7 @@ import com.fox2code.mmm.MainApplication;
import com.fox2code.mmm.R; import com.fox2code.mmm.R;
import com.fox2code.mmm.XHooks; import com.fox2code.mmm.XHooks;
import com.fox2code.mmm.compat.CompatActivity; import com.fox2code.mmm.compat.CompatActivity;
import com.fox2code.mmm.compat.CompatDisplay;
import com.fox2code.mmm.utils.Http; import com.fox2code.mmm.utils.Http;
import com.fox2code.mmm.utils.IntentHelper; import com.fox2code.mmm.utils.IntentHelper;
import com.google.android.material.chip.Chip; import com.google.android.material.chip.Chip;
@ -34,6 +43,7 @@ import java.nio.charset.StandardCharsets;
import java.util.HashMap; import java.util.HashMap;
import eightbitlab.com.blurview.BlurView; import eightbitlab.com.blurview.BlurView;
import eightbitlab.com.blurview.RenderScriptBlur;
public class MarkdownActivity extends CompatActivity { public class MarkdownActivity extends CompatActivity {
@ -42,6 +52,12 @@ public class MarkdownActivity extends CompatActivity {
private static final String[] variants = new String[]{ private static final String[] variants = new String[]{
"readme.md", "README.MD", ".github/README.md" "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 { private static byte[] getRawMarkdown(String url) throws IOException {
String newUrl = redirects.get(url); String newUrl = redirects.get(url);
@ -119,27 +135,38 @@ public class MarkdownActivity extends CompatActivity {
setContentView(R.layout.markdown_view); setContentView(R.layout.markdown_view);
final ViewGroup markdownBackground = findViewById(R.id.markdownBackground); final ViewGroup markdownBackground = findViewById(R.id.markdownBackground);
final TextView textView = findViewById(R.id.markdownView); 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); final TextView footer = findViewById(R.id.markdownFooter);
UiThreadHandler.handler.postDelayed(() -> // Fix footer height UiThreadHandler.handler.postDelayed(() -> // Fix footer height
footer.setMinHeight(this.getNavigationBarHeight()), 1L); 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()) { if (MainApplication.isChipsDisabled()) {
chip_holder.setVisibility(View.GONE); this.chipHolder.setVisibility(View.GONE);
} else { } else {
this.chipHolder.setPadding(0,0,0,this.getNavigationBarHeight());
// set "message" to null to disable dialog // set "message" to null to disable dialog
this.setChips(change_boot, this.setChip(change_boot,
getString(R.string.module_can_change_boot), getString(R.string.module_can_change_boot),
"This module may change the boot image"); "This module may change the boot image");
this.setChips(needs_ramdisk, this.setChip(needs_ramdisk,
getString(R.string.module_needs_ramdisk), getString(R.string.module_needs_ramdisk),
"This module need boot ramdisk to be installed"); "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); null);
this.setChips(min_api, "Min. Android " + min_api, this.setChip(min_api, "Min. Android " + min_api,
null); null);
this.setChips(max_api, "Max. Android " + max_api, this.setChip(max_api, "Max. Android " + max_api,
null); null);
} }
@ -171,53 +198,121 @@ public class MarkdownActivity extends CompatActivity {
}, "Markdown load thread").start(); }, "Markdown load thread").start();
} }
private void setChips(boolean bool, String title, String message) { private void setupBlurView(BlurView view, ViewGroup setupWith, ColorDrawable background) {
final ChipGroup chip_group_holder = findViewById(R.id.chip_group_holder); 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) { if (bool) {
Chip chip = new Chip(this); this.makeChip(title, message);
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();
}); private void setChip(int i, String title, String message) {
} if (i != 0) {
chip_group_holder.addView(chip); 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); final ChipGroup chip_group_holder = findViewById(R.id.chip_group_holder);
if (i != 0) { Chip chip = new Chip(this);
Chip chip = new Chip(this); chip.setText(title);
chip.setText(title); chip.setVisibility(View.VISIBLE);
chip.setVisibility(View.VISIBLE); if (message != null) {
if (message != null) { chip.setOnClickListener(_view -> {
chip.setOnClickListener(_view -> { MaterialAlertDialogBuilder builder =
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(this);
new MaterialAlertDialogBuilder(this);
builder
.setTitle(title)
.setMessage(message)
.setCancelable(true)
.setPositiveButton(R.string.ok, (x, y) -> {
x.dismiss();
}).show();
}); builder
} .setTitle(title)
chip_group_holder.addView(chip); .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";
} }
} }

@ -4,13 +4,11 @@ import android.content.Context;
import android.text.Spanned; import android.text.Spanned;
import android.util.Log; import android.util.Log;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import androidx.annotation.DrawableRes; import androidx.annotation.DrawableRes;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.core.content.ContextCompat;
import com.fox2code.mmm.MainApplication; import com.fox2code.mmm.MainApplication;
import com.fox2code.mmm.R; 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.LocalModuleInfo;
import com.fox2code.mmm.manager.ModuleInfo; import com.fox2code.mmm.manager.ModuleInfo;
import com.fox2code.mmm.manager.ModuleManager; import com.fox2code.mmm.manager.ModuleManager;
import com.fox2code.mmm.module.ModuleHolder;
import com.fox2code.mmm.utils.IntentHelper; import com.fox2code.mmm.utils.IntentHelper;
import com.google.android.material.chip.Chip; import com.google.android.material.chip.Chip;
import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.android.material.dialog.MaterialAlertDialogBuilder;

@ -1,21 +1,25 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/markdownBackground" android:id="@+id/markdownBackground"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:baselineAligned="false" app:fitsSystemWindowsInsets="left|right"
android:orientation="vertical" tools:context=".markdown.MarkdownActivity">
app:fitsSystemWindowsInsets="top|left|right|bottom">
<ScrollView <ScrollView
android:layout_width="match_parent" android:id="@+id/scrollView2"
android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1" android:layout_weight="1"
tools:ignore="UselessParent"> app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<LinearLayout <LinearLayout
android:id="@+id/md_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
@ -35,21 +39,43 @@
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
<HorizontalScrollView <eightbitlab.com.blurview.BlurView
android:id="@+id/chip_holder" android:id="@+id/markdown_action_bar_blur"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/markdown_action_bar_padding"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</eightbitlab.com.blurview.BlurView>
<com.google.android.material.chip.ChipGroup <eightbitlab.com.blurview.BlurView
android:id="@+id/chip_group_holder" android:id="@+id/chip_holder"
android:layout_width="wrap_content" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="end" app:layout_constraintBottom_toBottomOf="@id/scrollView2"
android:padding="8dp" app:layout_constraintEnd_toEndOf="parent"
app:singleLine="true"> app:layout_constraintStart_toStartOf="parent">
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.chip.ChipGroup
android:id="@+id/chip_group_holder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:padding="8dp"
app:singleLine="true">
<!-- Dynamically added -->
<!-- Dynamically added --> </com.google.android.material.chip.ChipGroup>
</HorizontalScrollView>
</eightbitlab.com.blurview.BlurView>
</com.google.android.material.chip.ChipGroup> </androidx.constraintlayout.widget.ConstraintLayout>
</HorizontalScrollView>
</LinearLayout>

@ -5,7 +5,7 @@ buildscript {
mavenCentral() mavenCentral()
gradlePluginPortal() gradlePluginPortal()
} }
project.ext.latestAboutLibsRelease = "10.1.0" project.ext.latestAboutLibsRelease = "10.2.0"
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:7.2.0' classpath 'com.android.tools.build:gradle:7.2.0'
classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}" classpath "com.mikepenz.aboutlibraries.plugin:aboutlibraries-plugin:${latestAboutLibsRelease}"

@ -1,6 +1,7 @@
#Sun May 15 18:07:03 CEST 2022
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
zipStoreBase=GRADLE_USER_HOME distributionPath=wrapper/dists
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionSha256Sum=9afb3ca688fc12c761a0e9e4321e4d24e977a4a8916c8a768b1fe05ddb4d6b66 zipStoreBase=GRADLE_USER_HOME
distributionSha256Sum=b586e04868a22fd817c8971330fec37e298f3242eb85c374181b12d637f80302
Loading…
Cancel
Save