From 95b1c80abb32973129a5e2108bd1b8c94f51d628 Mon Sep 17 00:00:00 2001 From: Fox2Code Date: Sun, 11 Sep 2022 15:50:33 +0200 Subject: [PATCH] Fix gradle build and add external shortcut support --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 7 +- .../java/com/fox2code/mmm/MainActivity.java | 2 + .../mmm/androidacy/AndroidacyWebAPI.java | 3 + .../fox2code/mmm/module/ActionButtonType.java | 4 + .../com/fox2code/mmm/module/ModuleHolder.java | 7 ++ .../mmm/settings/SettingsActivity.java | 2 + .../fox2code/mmm/utils/ExternalHelper.java | 113 ++++++++++++++++++ 8 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/fox2code/mmm/utils/ExternalHelper.java diff --git a/app/build.gradle b/app/build.gradle index dd68987..a93b0e7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,6 +5,7 @@ plugins { } android { + namespace "com.fox2code.mmm" compileSdk 33 defaultConfig { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5be773c..78e467c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,9 +1,14 @@ + + + + + + { 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 797b79b..ce5910f 100644 --- a/app/src/main/java/com/fox2code/mmm/module/ActionButtonType.java +++ b/app/src/main/java/com/fox2code/mmm/module/ActionButtonType.java @@ -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(); diff --git a/app/src/main/java/com/fox2code/mmm/module/ModuleHolder.java b/app/src/main/java/com/fox2code/mmm/module/ModuleHolder.java index 767dca1..18261b3 100644 --- a/app/src/main/java/com/fox2code/mmm/module/ModuleHolder.java +++ b/app/src/main/java/com/fox2code/mmm/module/ModuleHolder.java @@ -82,6 +82,13 @@ public final class ModuleHolder implements Comparable { 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 < diff --git a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java index a925df3..96f77bc 100644 --- a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java +++ b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java @@ -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"); diff --git a/app/src/main/java/com/fox2code/mmm/utils/ExternalHelper.java b/app/src/main/java/com/fox2code/mmm/utils/ExternalHelper.java new file mode 100644 index 0000000..da42f1b --- /dev/null +++ b/app/src/main/java/com/fox2code/mmm/utils/ExternalHelper.java @@ -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 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(); + } + }); + } +}