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

Commit 95b1c80

Browse files
committed
Fix gradle build and add external shortcut support
1 parent 90e166f commit 95b1c80

File tree

8 files changed

+138
-1
lines changed

8 files changed

+138
-1
lines changed

app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ plugins {
55
}
66

77
android {
8+
namespace "com.fox2code.mmm"
89
compileSdk 33
910

1011
defaultConfig {

app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
33
xmlns:tools="http://schemas.android.com/tools"
4-
package="com.fox2code.mmm"
54
tools:ignore="QueryAllPackagesPermission">
65

6+
<queries>
7+
<intent>
8+
<action android:name="com.fox2code.mmm.utils.intent.action.OPEN_EXTERNAL" />
9+
</intent>
10+
</queries>
11+
712
<!-- Wifi is not the only way to get an internet connection -->
813
<uses-feature
914
android:name="android.hardware.wifi"

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import com.fox2code.mmm.module.ModuleViewListBuilder;
3232
import com.fox2code.mmm.repo.RepoManager;
3333
import com.fox2code.mmm.settings.SettingsActivity;
34+
import com.fox2code.mmm.utils.ExternalHelper;
3435
import com.fox2code.mmm.utils.Http;
3536
import com.fox2code.mmm.utils.IntentHelper;
3637
import com.google.android.material.progressindicator.LinearProgressIndicator;
@@ -230,6 +231,7 @@ public void commonNext() {
230231
Log.i(TAG, "Finished app opening state!");
231232
}
232233
}, true);
234+
ExternalHelper.INSTANCE.refreshHelper(this);
233235
this.initMode = false;
234236
}
235237

app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.fox2code.mmm.manager.ModuleInfo;
2525
import com.fox2code.mmm.manager.ModuleManager;
2626
import com.fox2code.mmm.repo.RepoModule;
27+
import com.fox2code.mmm.utils.ExternalHelper;
2728
import com.fox2code.mmm.utils.Files;
2829
import com.fox2code.mmm.utils.Hashes;
2930
import com.fox2code.mmm.utils.IntentHelper;
@@ -115,6 +116,8 @@ void openNativeModuleDialogRaw(String moduleUrl, String installTitle,
115116
if (!this.activity.backOnResume)
116117
this.consumedAction = false;
117118
});
119+
ExternalHelper.INSTANCE.injectButton(builder,
120+
Uri.parse(moduleUrl), "androidacy_repo");
118121
final int dim5dp = FoxDisplay.dpToPixel(5);
119122
builder.setBackgroundInsetStart(dim5dp).setBackgroundInsetEnd(dim5dp);
120123
this.activity.runOnUiThread(() -> {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.annotation.SuppressLint;
44
import android.content.Context;
5+
import android.net.Uri;
56
import android.text.Spanned;
67
import android.util.Log;
78
import android.widget.Button;
@@ -20,6 +21,7 @@
2021
import com.fox2code.mmm.manager.LocalModuleInfo;
2122
import com.fox2code.mmm.manager.ModuleInfo;
2223
import com.fox2code.mmm.manager.ModuleManager;
24+
import com.fox2code.mmm.utils.ExternalHelper;
2325
import com.fox2code.mmm.utils.IntentHelper;
2426
import com.google.android.material.chip.Chip;
2527
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@@ -122,6 +124,8 @@ public void doAction(Chip button, ModuleHolder moduleHolder) {
122124
moduleInfo.mmtReborn);
123125
});
124126
}
127+
ExternalHelper.INSTANCE.injectButton(builder,
128+
Uri.parse(updateZipUrl), moduleHolder.getUpdateZipRepo());
125129
int dim5dp = FoxDisplay.dpToPixel(5);
126130
builder.setBackgroundInsetStart(dim5dp).setBackgroundInsetEnd(dim5dp);
127131
AlertDialog alertDialog = builder.show();

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,13 @@ public String getUpdateZipUrl() {
8282
this.repoModule.zipUrl : this.moduleInfo.updateZipUrl;
8383
}
8484

85+
public String getUpdateZipRepo() {
86+
return this.moduleInfo == null || (this.repoModule != null &&
87+
this.moduleInfo.updateVersionCode <
88+
this.repoModule.moduleInfo.versionCode) ?
89+
this.repoModule.repoData.id : "update_json";
90+
}
91+
8592
public String getUpdateZipChecksum() {
8693
return this.moduleInfo == null || (this.repoModule != null &&
8794
this.moduleInfo.updateVersionCode <

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.fox2code.mmm.repo.CustomRepoManager;
4949
import com.fox2code.mmm.repo.RepoData;
5050
import com.fox2code.mmm.repo.RepoManager;
51+
import com.fox2code.mmm.utils.ExternalHelper;
5152
import com.fox2code.mmm.utils.Http;
5253
import com.fox2code.mmm.utils.IntentHelper;
5354
import com.fox2code.rosettax.LanguageActivity;
@@ -270,6 +271,7 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
270271
Toast.makeText(getContext(), // Tell the user something changed
271272
R.string.dev_mode_enabled, Toast.LENGTH_SHORT).show();
272273
}
274+
ExternalHelper.INSTANCE.refreshHelper(getContext());
273275
return true;
274276
}
275277
IntentHelper.openUrl(p.getContext(), "https://github.com/Fox2Code/FoxMagiskModuleManager");
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.fox2code.mmm.utils;
2+
3+
import android.app.Dialog;
4+
import android.content.ActivityNotFoundException;
5+
import android.content.ComponentName;
6+
import android.content.Context;
7+
import android.content.Intent;
8+
import android.content.pm.PackageManager;
9+
import android.content.pm.ResolveInfo;
10+
import android.net.Uri;
11+
import android.os.Bundle;
12+
import android.util.Log;
13+
import android.widget.Toast;
14+
15+
import androidx.appcompat.app.AlertDialog;
16+
import androidx.core.app.ActivityOptionsCompat;
17+
18+
import com.fox2code.mmm.BuildConfig;
19+
import com.fox2code.mmm.Constants;
20+
import com.fox2code.mmm.MainApplication;
21+
22+
import java.util.List;
23+
24+
public final class ExternalHelper {
25+
private static final String TAG = "ExternalHelper";
26+
private static final boolean TEST_MODE = true;
27+
private static final String FOX_MMM_OPEN_EXTERNAL =
28+
"com.fox2code.mmm.utils.intent.action.OPEN_EXTERNAL";
29+
private static final String FOX_MMM_EXTRA_REPO_ID = "extra_repo_id";
30+
public static final ExternalHelper INSTANCE = new ExternalHelper();
31+
private ComponentName fallback;
32+
private CharSequence label;
33+
private boolean multi;
34+
35+
private ExternalHelper() {}
36+
37+
public void refreshHelper(Context context) {
38+
// This feature is still WIP
39+
if (!MainApplication.isDeveloper()) {
40+
label = null;
41+
multi = false;
42+
return;
43+
}
44+
Intent intent = new Intent(FOX_MMM_OPEN_EXTERNAL,
45+
Uri.parse("https://fox2code.com/module.zip"));
46+
List<ResolveInfo> resolveInfos = context.getPackageManager()
47+
.queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER);
48+
if (resolveInfos == null || resolveInfos.isEmpty()) {
49+
Log.d(TAG, "No external provider installed!");
50+
label = TEST_MODE ? "External" : null;
51+
multi = TEST_MODE;
52+
fallback = null;
53+
} else {
54+
ResolveInfo resolveInfo = resolveInfos.get(0);
55+
Log.d(TAG, "Found external provider: " + resolveInfo.activityInfo.packageName);
56+
fallback = new ComponentName(
57+
resolveInfo.activityInfo.packageName,
58+
resolveInfo.activityInfo.name);
59+
label = resolveInfo.loadLabel(context.getPackageManager());
60+
multi = resolveInfos.size() >= 2;
61+
}
62+
}
63+
64+
public boolean openExternal(Context context, Uri uri, String repoId) {
65+
if (label == null) return false;
66+
Bundle param = ActivityOptionsCompat.makeCustomAnimation(context,
67+
android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
68+
Intent intent = new Intent(FOX_MMM_OPEN_EXTERNAL, uri);
69+
intent.putExtra(FOX_MMM_EXTRA_REPO_ID, repoId);
70+
if (multi) {
71+
intent = Intent.createChooser(intent, label);
72+
} else {
73+
intent.putExtra(Constants.EXTRA_FADE_OUT, true);
74+
}
75+
try {
76+
if (multi) {
77+
context.startActivity(intent);
78+
} else {
79+
context.startActivity(intent, param);
80+
}
81+
return true;
82+
} catch (ActivityNotFoundException e) {
83+
Log.e(TAG, "Failed to launch activity", e);
84+
}
85+
if (fallback != null) {
86+
if (multi) {
87+
intent = new Intent(FOX_MMM_OPEN_EXTERNAL, uri);
88+
intent.putExtra(FOX_MMM_EXTRA_REPO_ID, repoId);
89+
intent.putExtra(Constants.EXTRA_FADE_OUT, true);
90+
}
91+
intent.setComponent(fallback);
92+
try {
93+
context.startActivity(intent, param);
94+
return true;
95+
} catch (ActivityNotFoundException e) {
96+
Log.e(TAG, "Failed to launch fallback", e);
97+
}
98+
}
99+
return false;
100+
}
101+
102+
public void injectButton(AlertDialog.Builder builder, Uri uri, String repoId) {
103+
if (label == null) return;
104+
builder.setNeutralButton(label, (dialog, button) -> {
105+
Context context = ((Dialog) dialog).getContext();
106+
if (!openExternal(context, uri, repoId)) {
107+
Toast.makeText(context,
108+
"Failed to launch external activity",
109+
Toast.LENGTH_SHORT).show();
110+
}
111+
});
112+
}
113+
}

0 commit comments

Comments
 (0)