Skip to content
This repository was archived by the owner on May 4, 2023. It is now read-only.

Commit a766c73

Browse files
committed
Rework cards, Initial Android 12 Monet support
1 parent 5119726 commit a766c73

File tree

16 files changed

+344
-76
lines changed

16 files changed

+344
-76
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ dependencies {
8888
implementation 'androidx.recyclerview:recyclerview:1.2.1'
8989
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
9090
implementation 'androidx.webkit:webkit:1.4.0'
91-
implementation 'com.google.android.material:material:1.5.0'
91+
implementation 'com.google.android.material:material:1.6.0'
9292
implementation "com.mikepenz:aboutlibraries:${latestAboutLibsRelease}"
9393
implementation "dev.rikka.rikkax.layoutinflater:layoutinflater:1.2.0"
9494
implementation "dev.rikka.rikkax.insets:insets:1.2.0"

app/src/main/java/com/fox2code/mmm/MainActivity.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232
import com.fox2code.mmm.settings.SettingsActivity;
3333
import com.fox2code.mmm.utils.Http;
3434
import com.fox2code.mmm.utils.IntentHelper;
35+
import com.google.android.material.appbar.AppBarLayout;
36+
import com.google.android.material.appbar.MaterialToolbar;
3537
import com.google.android.material.progressindicator.LinearProgressIndicator;
3638

3739
import eightbitlab.com.blurview.BlurView;
@@ -68,10 +70,10 @@ public MainActivity() {
6870
protected void onCreate(Bundle savedInstanceState) {
6971
this.initMode = true;
7072
super.onCreate(savedInstanceState);
71-
this.setActionBarExtraMenuButton(R.drawable.ic_baseline_settings_24, v -> {
73+
this.setActionBarExtraMenuButton(R.drawable.ic_baseline_settings_24, v -> {
7274
IntentHelper.startActivity(this, SettingsActivity.class);
73-
return true;
74-
}, R.string.pref_category_settings);
75+
return true;
76+
}, R.string.pref_category_settings);
7577
setContentView(R.layout.activity_main);
7678
this.setTitle(R.string.app_name);
7779
this.getWindow().setFlags(
@@ -103,13 +105,13 @@ protected void onCreate(Bundle savedInstanceState) {
103105
this.moduleList.setItemViewCacheSize(4); // Default is 2
104106
OverScrollManager.install(this.moduleList, this);
105107
this.swipeRefreshLayout.setOnRefreshListener(this);
106-
this.actionBarBlur.setBackground(this.actionBarBackground);
108+
this.actionBarBlur.setBackground(this.actionBarBackground);;
107109
this.actionBarBlur.setupWith(this.moduleList).setFrameClearDrawable(
108110
this.getWindow().getDecorView().getBackground())
109-
.setBlurAlgorithm(new RenderScriptBlur(this))
110-
.setBlurRadius(4F).setBlurAutoUpdate(true)
111-
.setHasFixedTransformationMatrix(true);
112-
this.updateBlurState();
111+
.setBlurAlgorithm(new RenderScriptBlur(this))
112+
.setBlurRadius(4F).setBlurAutoUpdate(true)
113+
.setHasFixedTransformationMatrix(true);
114+
this.updateBlurState();
113115
this.moduleList.addOnScrollListener(new RecyclerView.OnScrollListener() {
114116
@Override
115117
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
@@ -255,7 +257,7 @@ private void updateScreenInsets(Configuration configuration) {
255257
bottomInset + this.searchCard.getHeight());
256258
this.searchCard.setRadius(this.searchCard.getHeight() / 2F);
257259
this.moduleViewListBuilder.updateInsets();
258-
this.actionBarBlur.invalidate();
260+
//this.actionBarBlur.invalidate();
259261
this.overScrollInsetTop = combinedBarsHeight;
260262
this.overScrollInsetBottom = bottomInset;
261263
Log.d(TAG, "( " + bottomInset + ", " +

app/src/main/java/com/fox2code/mmm/MainApplication.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.fox2code.mmm.installer.InstallerInitializer;
2424
import com.fox2code.mmm.utils.GMSProviderInstaller;
2525
import com.fox2code.mmm.utils.Http;
26+
import com.google.android.material.color.DynamicColors;
2627
import com.topjohnwu.superuser.Shell;
2728

2829
import java.text.SimpleDateFormat;
@@ -280,6 +281,9 @@ public boolean isLightTheme() {
280281
@Override
281282
public void onCreate() {
282283
super.onCreate();
284+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
285+
DynamicColors.applyToActivitiesIfAvailable(this);
286+
}
283287
SharedPreferences sharedPreferences = MainApplication.getSharedPreferences();
284288
// We are only one process so it's ok to do this
285289
SharedPreferences bootPrefs = MainApplication.bootSharedPreferences =

app/src/main/java/com/fox2code/mmm/module/ActionButtonType.java

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import androidx.annotation.DrawableRes;
1212
import androidx.appcompat.app.AlertDialog;
13+
import androidx.core.content.ContextCompat;
1314

1415
import com.fox2code.mmm.MainApplication;
1516
import com.fox2code.mmm.R;
@@ -22,14 +23,21 @@
2223
import com.fox2code.mmm.manager.ModuleManager;
2324
import com.fox2code.mmm.module.ModuleHolder;
2425
import com.fox2code.mmm.utils.IntentHelper;
26+
import com.google.android.material.chip.Chip;
2527
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
2628

2729
import io.noties.markwon.Markwon;
2830

2931
public enum ActionButtonType {
30-
INFO(R.drawable.ic_baseline_info_24) {
32+
INFO() {
3133
@Override
32-
public void doAction(ImageButton button, ModuleHolder moduleHolder) {
34+
public void update(Chip button, ModuleHolder moduleHolder) {
35+
button.setChipIcon(button.getContext().getResources().getDrawable(R.drawable.ic_baseline_info_24));
36+
button.setText("Description");
37+
}
38+
39+
@Override
40+
public void doAction(Chip button, ModuleHolder moduleHolder) {
3341
String notesUrl = moduleHolder.repoModule.notesUrl;
3442
if (notesUrl.startsWith("https://api.androidacy.com/magisk/readme/?module=") ||
3543
notesUrl.startsWith("https://www.androidacy.com/")) {
@@ -46,31 +54,36 @@ public void doAction(ImageButton button, ModuleHolder moduleHolder) {
4654
}
4755

4856
@Override
49-
public boolean doActionLong(ImageButton button, ModuleHolder moduleHolder) {
57+
public boolean doActionLong(Chip button, ModuleHolder moduleHolder) {
5058
Context context = button.getContext();
5159
Toast.makeText(context, context.getString(R.string.module_id_prefix) +
52-
moduleHolder.moduleId, Toast.LENGTH_SHORT).show();
60+
moduleHolder.moduleId, Toast.LENGTH_SHORT).show();
5361
return true;
5462
}
5563
},
5664
UPDATE_INSTALL() {
5765
@Override
58-
public void update(ImageButton button, ModuleHolder moduleHolder) {
66+
public void update(Chip button, ModuleHolder moduleHolder) {
5967
int icon = moduleHolder.hasUpdate() ?
6068
R.drawable.ic_baseline_update_24 :
6169
R.drawable.ic_baseline_system_update_24;
62-
button.setImageResource(icon);
70+
button.setChipIcon(button.getContext().getResources().getDrawable(icon));
71+
if (moduleHolder.hasUpdate()) {
72+
button.setText("Update");
73+
} else {
74+
button.setText("Install");
75+
}
6376
}
6477

6578
@Override
66-
public void doAction(ImageButton button, ModuleHolder moduleHolder) {
79+
public void doAction(Chip button, ModuleHolder moduleHolder) {
6780
ModuleInfo moduleInfo = moduleHolder.getMainModuleInfo();
6881
if (moduleInfo == null) return;
6982
String updateZipUrl = moduleHolder.getUpdateZipUrl();
7083
if (updateZipUrl == null) return;
7184
// Androidacy manage the selection between download and install
7285
if (updateZipUrl.startsWith("https://www.androidacy.com/") ||
73-
updateZipUrl.startsWith("https://api.androidacy.com/magisk/info/?module=")) {
86+
updateZipUrl.startsWith("https://api.androidacy.com/magisk/info/?module=")) {
7487
IntentHelper.openUrlAndroidacy(
7588
button.getContext(), updateZipUrl, true,
7689
moduleInfo.name, moduleInfo.config);
@@ -127,18 +140,19 @@ public void doAction(ImageButton button, ModuleHolder moduleHolder) {
127140
},
128141
UNINSTALL() {
129142
@Override
130-
public void update(ImageButton button, ModuleHolder moduleHolder) {
143+
public void update(Chip button, ModuleHolder moduleHolder) {
131144
int icon = moduleHolder.hasFlag(ModuleInfo.FLAG_MODULE_UNINSTALLING) ?
132145
R.drawable.ic_baseline_delete_outline_24 : (
133146
!moduleHolder.hasFlag(ModuleInfo.FLAG_MODULE_UPDATING) ||
134-
moduleHolder.hasFlag(ModuleInfo.FLAGS_MODULE_ACTIVE)) ?
135-
R.drawable.ic_baseline_delete_24 :
136-
R.drawable.ic_baseline_delete_forever_24;
137-
button.setImageResource(icon);
147+
moduleHolder.hasFlag(ModuleInfo.FLAGS_MODULE_ACTIVE)) ?
148+
R.drawable.ic_baseline_delete_24 :
149+
R.drawable.ic_baseline_delete_forever_24;
150+
button.setChipIcon(button.getContext().getResources().getDrawable(icon));
151+
button.setText("Uninstall");
138152
}
139153

140154
@Override
141-
public void doAction(ImageButton button, ModuleHolder moduleHolder) {
155+
public void doAction(Chip button, ModuleHolder moduleHolder) {
142156
if (!moduleHolder.hasFlag(ModuleInfo.FLAGS_MODULE_ACTIVE |
143157
ModuleInfo.FLAG_MODULE_UNINSTALLING) &&
144158
moduleHolder.hasFlag(ModuleInfo.FLAG_MODULE_UPDATING)) {
@@ -153,7 +167,7 @@ public void doAction(ImageButton button, ModuleHolder moduleHolder) {
153167
}
154168

155169
@Override
156-
public boolean doActionLong(ImageButton button, ModuleHolder moduleHolder) {
170+
public boolean doActionLong(Chip button, ModuleHolder moduleHolder) {
157171
// We can't trust active flag on first boot
158172
if (moduleHolder.moduleInfo.hasFlag(ModuleInfo.FLAGS_MODULE_ACTIVE)) return false;
159173
new AlertDialog.Builder(button.getContext()).setTitle(R.string.master_delete)
@@ -165,13 +179,20 @@ public boolean doActionLong(ImageButton button, ModuleHolder moduleHolder) {
165179
moduleHolder.moduleInfo = null;
166180
CompatActivity.getCompatActivity(button).refreshUI();
167181
}
168-
}).setNegativeButton(R.string.master_delete_no, (v, i) -> {}).create().show();
182+
}).setNegativeButton(R.string.master_delete_no, (v, i) -> {
183+
}).create().show();
169184
return true;
170185
}
171186
},
172-
CONFIG(R.drawable.ic_baseline_app_settings_alt_24) {
187+
CONFIG() {
188+
@Override
189+
public void update(Chip button, ModuleHolder moduleHolder) {
190+
button.setChipIcon(button.getContext().getResources().getDrawable(R.drawable.ic_baseline_app_settings_alt_24));
191+
button.setText("Config");
192+
}
193+
173194
@Override
174-
public void doAction(ImageButton button, ModuleHolder moduleHolder) {
195+
public void doAction(Chip button, ModuleHolder moduleHolder) {
175196
String config = moduleHolder.getMainModuleConfig();
176197
if (config == null) return;
177198
if (AndroidacyUtil.isAndroidacyLink(config)) {
@@ -183,31 +204,33 @@ public void doAction(ImageButton button, ModuleHolder moduleHolder) {
183204
},
184205
SUPPORT() {
185206
@Override
186-
public void update(ImageButton button, ModuleHolder moduleHolder) {
207+
public void update(Chip button, ModuleHolder moduleHolder) {
187208
ModuleInfo moduleInfo = moduleHolder.getMainModuleInfo();
188-
button.setImageResource(supportIconForUrl(moduleInfo.support));
209+
button.setChipIcon(button.getContext().getResources().getDrawable(supportIconForUrl(moduleInfo.support)));
210+
button.setText("Support");
189211
}
190212

191213
@Override
192-
public void doAction(ImageButton button, ModuleHolder moduleHolder) {
214+
public void doAction(Chip button, ModuleHolder moduleHolder) {
193215
IntentHelper.openUrl(button.getContext(), moduleHolder.getMainModuleInfo().support);
194216
}
195217
},
196218
DONATE() {
197219
@Override
198-
public void update(ImageButton button, ModuleHolder moduleHolder) {
220+
public void update(Chip button, ModuleHolder moduleHolder) {
199221
ModuleInfo moduleInfo = moduleHolder.getMainModuleInfo();
200222
int icon = R.drawable.ic_baseline_monetization_on_24;
201223
if (moduleInfo.donate.startsWith("https://www.paypal.me/")) {
202224
icon = R.drawable.ic_baseline_paypal_24;
203225
} else if (moduleInfo.donate.startsWith("https://www.patreon.com/")) {
204226
icon = R.drawable.ic_patreon;
205227
}
206-
button.setImageResource(icon);
228+
button.setChipIcon(button.getContext().getResources().getDrawable(icon));
229+
button.setText("Donate");
207230
}
208231

209232
@Override
210-
public void doAction(ImageButton button, ModuleHolder moduleHolder) {
233+
public void doAction(Chip button, ModuleHolder moduleHolder) {
211234
IntentHelper.openUrl(button.getContext(), moduleHolder.getMainModuleInfo().donate);
212235
}
213236
};
@@ -239,13 +262,13 @@ public static int supportIconForUrl(String url) {
239262
this.iconId = iconId;
240263
}
241264

242-
public void update(ImageButton button, ModuleHolder moduleHolder) {
243-
button.setImageResource(this.iconId);
265+
public void update(Chip button, ModuleHolder moduleHolder) {
266+
button.setChipIcon(button.getContext().getResources().getDrawable(this.iconId));
244267
}
245268

246-
public abstract void doAction(ImageButton button, ModuleHolder moduleHolder);
269+
public abstract void doAction(Chip button, ModuleHolder moduleHolder);
247270

248-
public boolean doActionLong(ImageButton button, ModuleHolder moduleHolder) {
271+
public boolean doActionLong(Chip button, ModuleHolder moduleHolder) {
249272
return false;
250273
}
251274
}

app/src/main/java/com/fox2code/mmm/module/ModuleViewAdapter.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@
2525
import com.fox2code.mmm.manager.ModuleInfo;
2626
import com.fox2code.mmm.manager.ModuleManager;
2727
import com.fox2code.mmm.repo.RepoModule;
28+
import com.google.android.material.chip.Chip;
2829
import com.google.android.material.switchmaterial.SwitchMaterial;
2930
import com.topjohnwu.superuser.internal.UiThreadHandler;
3031

3132
import java.util.ArrayList;
3233
import java.util.Objects;
3334

35+
3436
public final class ModuleViewAdapter extends RecyclerView.Adapter<ModuleViewAdapter.ViewHolder> {
3537
private static final boolean DEBUG = false;
3638
public final ArrayList<ModuleHolder> moduleHolders = new ArrayList<>();
@@ -70,7 +72,7 @@ public static class ViewHolder extends RecyclerView.ViewHolder {
7072
private final TextView creditText;
7173
private final TextView descriptionText;
7274
private final TextView updateText;
73-
private final ImageButton[] actionsButtons;
75+
private final Chip[] actionsButtons;
7476
private final ArrayList<ActionButtonType> actionButtonsTypes;
7577
private boolean initState;
7678
public ModuleHolder moduleHolder;
@@ -86,7 +88,7 @@ public ViewHolder(@NonNull View itemView) {
8688
this.creditText = itemView.findViewById(R.id.credit_text);
8789
this.descriptionText = itemView.findViewById(R.id.description_text);
8890
this.updateText = itemView.findViewById(R.id.updated_text);
89-
this.actionsButtons = new ImageButton[6];
91+
this.actionsButtons = new Chip[6];
9092
this.actionsButtons[0] = itemView.findViewById(R.id.button_action1);
9193
this.actionsButtons[1] = itemView.findViewById(R.id.button_action2);
9294
this.actionsButtons[2] = itemView.findViewById(R.id.button_action3);
@@ -110,7 +112,7 @@ public ViewHolder(@NonNull View itemView) {
110112
this.buttonAction.setClickable(false);
111113
this.switchMaterial.setEnabled(false);
112114
this.switchMaterial.setOnCheckedChangeListener((v, checked) -> {
113-
if (this.initState) return; // Skip if non user
115+
if (this.initState) return; // Skip if non user
114116
ModuleHolder moduleHolder = this.moduleHolder;
115117
if (moduleHolder != null && moduleHolder.moduleInfo != null) {
116118
ModuleInfo moduleInfo = moduleHolder.moduleInfo;
@@ -128,7 +130,7 @@ public ViewHolder(@NonNull View itemView) {
128130
ModuleHolder moduleHolder = this.moduleHolder;
129131
if (index < this.actionButtonsTypes.size() && moduleHolder != null) {
130132
this.actionButtonsTypes.get(index)
131-
.doAction((ImageButton) v, moduleHolder);
133+
.doAction((Chip) v, moduleHolder);
132134
if (moduleHolder.shouldRemove()) {
133135
this.cardView.setVisibility(View.GONE);
134136
}
@@ -140,7 +142,7 @@ public ViewHolder(@NonNull View itemView) {
140142
boolean didSomething = false;
141143
if (index < this.actionButtonsTypes.size() && moduleHolder != null) {
142144
didSomething = this.actionButtonsTypes.get(index)
143-
.doActionLong((ImageButton) v, moduleHolder);
145+
.doActionLong((Chip) v, moduleHolder);
144146
if (moduleHolder.shouldRemove()) {
145147
this.cardView.setVisibility(View.GONE);
146148
}
@@ -232,7 +234,7 @@ public boolean update(ModuleHolder moduleHolder) {
232234
this.switchMaterial.setEnabled(!showCaseMode &&
233235
!moduleHolder.hasFlag(ModuleInfo.FLAG_MODULE_UPDATING));
234236
for (int i = 0; i < this.actionsButtons.length; i++) {
235-
ImageButton imageButton = this.actionsButtons[i];
237+
Chip imageButton = this.actionsButtons[i];
236238
if (i < this.actionButtonsTypes.size()) {
237239
imageButton.setVisibility(View.VISIBLE);
238240
imageButton.setImportantForAccessibility(
@@ -272,7 +274,7 @@ public boolean update(ModuleHolder moduleHolder) {
272274
this.descriptionText.setText(" ");
273275
this.switchMaterial.setEnabled(false);
274276
this.actionButtonsTypes.clear();
275-
for (ImageButton button : this.actionsButtons) {
277+
for (Chip button : this.actionsButtons) {
276278
button.setVisibility(View.GONE);
277279
button.setImportantForAccessibility(
278280
View.IMPORTANT_FOR_ACCESSIBILITY_NO);

app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,12 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
8181
enableBlur.setSummary(R.string.require_android_6);
8282
enableBlur.setEnabled(false);
8383
}
84+
85+
Preference disableMonet = findPreference("pref_disable_monet");
86+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
87+
disableMonet.setSummary(R.string.require_android_12);
88+
disableMonet.setEnabled(false);
89+
}
8490
Preference forceEnglish = findPreference("pref_force_english");
8591
forceEnglish.setOnPreferenceChangeListener((preference, newValue) -> {
8692
CompatThemeWrapper compatThemeWrapper =
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<vector android:height="24dp" android:tint="?attr/colorControlNormal"
2+
android:viewportHeight="24" android:viewportWidth="24"
3+
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
4+
<path android:fillColor="@android:color/white" android:pathData="M16.24,11.51l1.57,-1.57l-3.75,-3.75l-1.57,1.57L8.35,3.63c-0.78,-0.78 -2.05,-0.78 -2.83,0l-1.9,1.9c-0.78,0.78 -0.78,2.05 0,2.83l4.13,4.13L3,17.25V21h3.75l4.76,-4.76l4.13,4.13c0.95,0.95 2.23,0.6 2.83,0l1.9,-1.9c0.78,-0.78 0.78,-2.05 0,-2.83L16.24,11.51zM9.18,11.07L5.04,6.94l1.89,-1.9c0,0 0,0 0,0l1.27,1.27L7.02,7.5l1.41,1.41l1.19,-1.19l1.45,1.45L9.18,11.07zM17.06,18.96l-4.13,-4.13l1.9,-1.9l1.45,1.45l-1.19,1.19l1.41,1.41l1.19,-1.19l1.27,1.27L17.06,18.96z"/>
5+
<path android:fillColor="@android:color/white" android:pathData="M20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.47,-0.47 -1.12,-0.29 -1.41,0l-1.83,1.83l3.75,3.75L20.71,7.04z"/>
6+
</vector>

0 commit comments

Comments
 (0)