Fix gradle build and add external shortcut support

pull/206/head
Fox2Code 2 years ago
parent 90e166fbd0
commit 95b1c80abb

@ -5,6 +5,7 @@ plugins {
}
android {
namespace "com.fox2code.mmm"
compileSdk 33
defaultConfig {

@ -1,9 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.fox2code.mmm"
tools:ignore="QueryAllPackagesPermission">
<queries>
<intent>
<action android:name="com.fox2code.mmm.utils.intent.action.OPEN_EXTERNAL" />
</intent>
</queries>
<!-- Wifi is not the only way to get an internet connection -->
<uses-feature
android:name="android.hardware.wifi"

@ -31,6 +31,7 @@ import com.fox2code.mmm.module.ModuleViewAdapter;
import com.fox2code.mmm.module.ModuleViewListBuilder;
import com.fox2code.mmm.repo.RepoManager;
import com.fox2code.mmm.settings.SettingsActivity;
import com.fox2code.mmm.utils.ExternalHelper;
import com.fox2code.mmm.utils.Http;
import com.fox2code.mmm.utils.IntentHelper;
import com.google.android.material.progressindicator.LinearProgressIndicator;
@ -230,6 +231,7 @@ public class MainActivity extends FoxActivity implements SwipeRefreshLayout.OnRe
Log.i(TAG, "Finished app opening state!");
}
}, true);
ExternalHelper.INSTANCE.refreshHelper(this);
this.initMode = false;
}

@ -24,6 +24,7 @@ import com.fox2code.mmm.manager.LocalModuleInfo;
import com.fox2code.mmm.manager.ModuleInfo;
import com.fox2code.mmm.manager.ModuleManager;
import com.fox2code.mmm.repo.RepoModule;
import com.fox2code.mmm.utils.ExternalHelper;
import com.fox2code.mmm.utils.Files;
import com.fox2code.mmm.utils.Hashes;
import com.fox2code.mmm.utils.IntentHelper;
@ -115,6 +116,8 @@ public class AndroidacyWebAPI {
if (!this.activity.backOnResume)
this.consumedAction = false;
});
ExternalHelper.INSTANCE.injectButton(builder,
Uri.parse(moduleUrl), "androidacy_repo");
final int dim5dp = FoxDisplay.dpToPixel(5);
builder.setBackgroundInsetStart(dim5dp).setBackgroundInsetEnd(dim5dp);
this.activity.runOnUiThread(() -> {

@ -2,6 +2,7 @@ package com.fox2code.mmm.module;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.Uri;
import android.text.Spanned;
import android.util.Log;
import android.widget.Button;
@ -20,6 +21,7 @@ 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.utils.ExternalHelper;
import com.fox2code.mmm.utils.IntentHelper;
import com.google.android.material.chip.Chip;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@ -122,6 +124,8 @@ public enum ActionButtonType {
moduleInfo.mmtReborn);
});
}
ExternalHelper.INSTANCE.injectButton(builder,
Uri.parse(updateZipUrl), moduleHolder.getUpdateZipRepo());
int dim5dp = FoxDisplay.dpToPixel(5);
builder.setBackgroundInsetStart(dim5dp).setBackgroundInsetEnd(dim5dp);
AlertDialog alertDialog = builder.show();

@ -82,6 +82,13 @@ public final class ModuleHolder implements Comparable<ModuleHolder> {
this.repoModule.zipUrl : this.moduleInfo.updateZipUrl;
}
public String getUpdateZipRepo() {
return this.moduleInfo == null || (this.repoModule != null &&
this.moduleInfo.updateVersionCode <
this.repoModule.moduleInfo.versionCode) ?
this.repoModule.repoData.id : "update_json";
}
public String getUpdateZipChecksum() {
return this.moduleInfo == null || (this.repoModule != null &&
this.moduleInfo.updateVersionCode <

@ -48,6 +48,7 @@ import com.fox2code.mmm.repo.CustomRepoData;
import com.fox2code.mmm.repo.CustomRepoManager;
import com.fox2code.mmm.repo.RepoData;
import com.fox2code.mmm.repo.RepoManager;
import com.fox2code.mmm.utils.ExternalHelper;
import com.fox2code.mmm.utils.Http;
import com.fox2code.mmm.utils.IntentHelper;
import com.fox2code.rosettax.LanguageActivity;
@ -270,6 +271,7 @@ public class SettingsActivity extends FoxActivity implements LanguageActivity {
Toast.makeText(getContext(), // Tell the user something changed
R.string.dev_mode_enabled, Toast.LENGTH_SHORT).show();
}
ExternalHelper.INSTANCE.refreshHelper(getContext());
return true;
}
IntentHelper.openUrl(p.getContext(), "https://github.com/Fox2Code/FoxMagiskModuleManager");

@ -0,0 +1,113 @@
package com.fox2code.mmm.utils;
import android.app.Dialog;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityOptionsCompat;
import com.fox2code.mmm.BuildConfig;
import com.fox2code.mmm.Constants;
import com.fox2code.mmm.MainApplication;
import java.util.List;
public final class ExternalHelper {
private static final String TAG = "ExternalHelper";
private static final boolean TEST_MODE = true;
private static final String FOX_MMM_OPEN_EXTERNAL =
"com.fox2code.mmm.utils.intent.action.OPEN_EXTERNAL";
private static final String FOX_MMM_EXTRA_REPO_ID = "extra_repo_id";
public static final ExternalHelper INSTANCE = new ExternalHelper();
private ComponentName fallback;
private CharSequence label;
private boolean multi;
private ExternalHelper() {}
public void refreshHelper(Context context) {
// This feature is still WIP
if (!MainApplication.isDeveloper()) {
label = null;
multi = false;
return;
}
Intent intent = new Intent(FOX_MMM_OPEN_EXTERNAL,
Uri.parse("https://fox2code.com/module.zip"));
List<ResolveInfo> resolveInfos = context.getPackageManager()
.queryIntentActivities(intent, PackageManager.GET_RESOLVED_FILTER);
if (resolveInfos == null || resolveInfos.isEmpty()) {
Log.d(TAG, "No external provider installed!");
label = TEST_MODE ? "External" : null;
multi = TEST_MODE;
fallback = null;
} else {
ResolveInfo resolveInfo = resolveInfos.get(0);
Log.d(TAG, "Found external provider: " + resolveInfo.activityInfo.packageName);
fallback = new ComponentName(
resolveInfo.activityInfo.packageName,
resolveInfo.activityInfo.name);
label = resolveInfo.loadLabel(context.getPackageManager());
multi = resolveInfos.size() >= 2;
}
}
public boolean openExternal(Context context, Uri uri, String repoId) {
if (label == null) return false;
Bundle param = ActivityOptionsCompat.makeCustomAnimation(context,
android.R.anim.fade_in, android.R.anim.fade_out).toBundle();
Intent intent = new Intent(FOX_MMM_OPEN_EXTERNAL, uri);
intent.putExtra(FOX_MMM_EXTRA_REPO_ID, repoId);
if (multi) {
intent = Intent.createChooser(intent, label);
} else {
intent.putExtra(Constants.EXTRA_FADE_OUT, true);
}
try {
if (multi) {
context.startActivity(intent);
} else {
context.startActivity(intent, param);
}
return true;
} catch (ActivityNotFoundException e) {
Log.e(TAG, "Failed to launch activity", e);
}
if (fallback != null) {
if (multi) {
intent = new Intent(FOX_MMM_OPEN_EXTERNAL, uri);
intent.putExtra(FOX_MMM_EXTRA_REPO_ID, repoId);
intent.putExtra(Constants.EXTRA_FADE_OUT, true);
}
intent.setComponent(fallback);
try {
context.startActivity(intent, param);
return true;
} catch (ActivityNotFoundException e) {
Log.e(TAG, "Failed to launch fallback", e);
}
}
return false;
}
public void injectButton(AlertDialog.Builder builder, Uri uri, String repoId) {
if (label == null) return;
builder.setNeutralButton(label, (dialog, button) -> {
Context context = ((Dialog) dialog).getContext();
if (!openExternal(context, uri, repoId)) {
Toast.makeText(context,
"Failed to launch external activity",
Toast.LENGTH_SHORT).show();
}
});
}
}
Loading…
Cancel
Save