diff --git a/app/src/main/java/com/fox2code/mmm/ModuleHolder.java b/app/src/main/java/com/fox2code/mmm/ModuleHolder.java index 73ff0dd..5c4a1b8 100644 --- a/app/src/main/java/com/fox2code/mmm/ModuleHolder.java +++ b/app/src/main/java/com/fox2code/mmm/ModuleHolder.java @@ -154,14 +154,15 @@ public final class ModuleHolder implements Comparable { public void getButtons(Context context, List buttonTypeList, boolean showcaseMode) { if (!this.isModuleHolder()) return; - if (this.moduleInfo != null && !showcaseMode) { + LocalModuleInfo localModuleInfo = this.moduleInfo; + if (localModuleInfo != null && !showcaseMode) { buttonTypeList.add(ActionButtonType.UNINSTALL); } if (this.repoModule != null && this.repoModule.notesUrl != null) { buttonTypeList.add(ActionButtonType.INFO); } - if ((this.repoModule != null || (this.moduleInfo != null && - this.moduleInfo.updateZipUrl != null))) { + if ((this.repoModule != null || (localModuleInfo != null && + localModuleInfo.updateZipUrl != null))) { buttonTypeList.add(ActionButtonType.UPDATE_INSTALL); } String config = this.getMainModuleConfig(); @@ -171,7 +172,7 @@ public final class ModuleHolder implements Comparable { } else { String pkg = IntentHelper.getPackageOfConfig(config); try { - context.getPackageManager().getPackageInfo(pkg, 0); + XHooks.checkConfigTargetExists(context, pkg, config); buttonTypeList.add(ActionButtonType.CONFIG); } catch (PackageManager.NameNotFoundException e) { Log.w(TAG, "Config package \"" + pkg + @@ -180,6 +181,10 @@ public final class ModuleHolder implements Comparable { } } ModuleInfo moduleInfo = this.getMainModuleInfo(); + if (moduleInfo == null) { // Avoid concurrency NPE + if (localModuleInfo == null) return; + moduleInfo = localModuleInfo; + } if (moduleInfo.support != null) { buttonTypeList.add(ActionButtonType.SUPPORT); } diff --git a/app/src/main/java/com/fox2code/mmm/ModuleViewAdapter.java b/app/src/main/java/com/fox2code/mmm/ModuleViewAdapter.java index 73cfb7f..8ea4e0f 100644 --- a/app/src/main/java/com/fox2code/mmm/ModuleViewAdapter.java +++ b/app/src/main/java/com/fox2code/mmm/ModuleViewAdapter.java @@ -187,16 +187,18 @@ public final class ModuleViewAdapter extends RecyclerView.Adapter { IntentHelper.openConfig(this, config); @@ -182,6 +183,7 @@ public class AndroidacyActivity extends CompatActivity { IntentHelper.openCustomTab(this, downloadUrl); } }); + XHooks.onWebViewInitialize(this.webView, allowInstall); this.webView.addJavascriptInterface(androidacyWebAPI = new AndroidacyWebAPI(this, allowInstall), "mmm"); if (compatLevel != 0) androidacyWebAPI.notifyCompatModeRaw(compatLevel); diff --git a/app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java b/app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java index 9ea765b..040ea39 100644 --- a/app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java +++ b/app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java @@ -21,6 +21,7 @@ import com.fox2code.mmm.BuildConfig; import com.fox2code.mmm.Constants; import com.fox2code.mmm.MainApplication; import com.fox2code.mmm.R; +import com.fox2code.mmm.XHooks; import com.fox2code.mmm.compat.CompatActivity; import com.fox2code.mmm.utils.FastException; import com.fox2code.mmm.utils.Files; @@ -567,7 +568,7 @@ public class InstallerActivity extends CompatActivity { if (config != null && !config.isEmpty()) { String configPkg = IntentHelper.getPackageOfConfig(config); try { - this.getPackageManager().getPackageInfo(configPkg, 0); + XHooks.checkConfigTargetExists(this, configPkg, config); this.setActionBarExtraMenuButton(R.drawable.ic_baseline_app_settings_alt_24, menu -> { IntentHelper.openConfig(this, config); return true; diff --git a/app/src/main/java/com/fox2code/mmm/manager/ModuleManager.java b/app/src/main/java/com/fox2code/mmm/manager/ModuleManager.java index bc0d539..b58d991 100644 --- a/app/src/main/java/com/fox2code/mmm/manager/ModuleManager.java +++ b/app/src/main/java/com/fox2code/mmm/manager/ModuleManager.java @@ -253,4 +253,9 @@ public final class ModuleManager { moduleInfo.flags = ModuleInfo.FLAG_METADATA_INVALID; return true; } + + public static boolean isModuleActive(String moduleId) { + ModuleInfo moduleInfo = ModuleManager.getINSTANCE().getModules().get(moduleId); + return moduleInfo != null && (moduleInfo.flags & ModuleInfo.FLAGS_MODULE_ACTIVE) != 0; + } } diff --git a/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java index 8364400..2adc362 100644 --- a/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java +++ b/app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java @@ -15,6 +15,7 @@ import androidx.annotation.Nullable; import com.fox2code.mmm.Constants; import com.fox2code.mmm.MainApplication; import com.fox2code.mmm.R; +import com.fox2code.mmm.XHooks; import com.fox2code.mmm.compat.CompatActivity; import com.fox2code.mmm.utils.Http; import com.fox2code.mmm.utils.IntentHelper; @@ -83,7 +84,7 @@ public class MarkdownActivity extends CompatActivity { if (config != null && !config.isEmpty()) { String configPkg = IntentHelper.getPackageOfConfig(config); try { - this.getPackageManager().getPackageInfo(configPkg, 0); + XHooks.checkConfigTargetExists(this, configPkg, config); this.setActionBarExtraMenuButton(R.drawable.ic_baseline_app_settings_alt_24, menu -> { IntentHelper.openConfig(this, config); return true; diff --git a/app/src/main/java/com/fox2code/mmm/utils/IntentHelper.java b/app/src/main/java/com/fox2code/mmm/utils/IntentHelper.java index 96a0861..027b600 100644 --- a/app/src/main/java/com/fox2code/mmm/utils/IntentHelper.java +++ b/app/src/main/java/com/fox2code/mmm/utils/IntentHelper.java @@ -22,10 +22,15 @@ import com.fox2code.mmm.BuildConfig; import com.fox2code.mmm.Constants; import com.fox2code.mmm.MainApplication; import com.fox2code.mmm.R; +import com.fox2code.mmm.XHooks; import com.fox2code.mmm.androidacy.AndroidacyActivity; import com.fox2code.mmm.compat.CompatActivity; import com.fox2code.mmm.installer.InstallerActivity; import com.fox2code.mmm.markdown.MarkdownActivity; +import com.topjohnwu.superuser.CallbackList; +import com.topjohnwu.superuser.Shell; +import com.topjohnwu.superuser.ShellUtils; +import com.topjohnwu.superuser.internal.Utils; import com.topjohnwu.superuser.io.SuFileInputStream; import java.io.File; @@ -33,6 +38,8 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; public class IntentHelper { private static final String TAG = "IntentHelper"; @@ -128,9 +135,23 @@ public class IntentHelper { public static void openConfig(Context context, String config) { String pkg = getPackageOfConfig(config); try { - Intent intent = context.getPackageManager() - .getLaunchIntentForPackage(pkg); + Intent intent = XHooks.getConfigIntent(context, pkg, config); if (intent == null) { + if ("org.lsposed.manager".equals(config) && ( + XHooks.isModuleActive("riru_lsposed") || + XHooks.isModuleActive("zygisk_lsposed"))) { + Shell.getShell().newJob().add( + "am start -a android.intent.action.MAIN " + + "-c org.lsposed.manager.LAUNCH_MANAGER " + + "com.android.shell/.BugreportWarningActivity") + .to(new CallbackList() { + @Override + public void onAddElement(String str) { + Log.d(TAG, "LSPosed: " + str); + } + }).submit(); + return; + } intent = new Intent("android.intent.action.APPLICATION_PREFERENCES"); intent.setPackage(pkg); } diff --git a/app/src/main/java/com/fox2code/mmm/utils/PropUtils.java b/app/src/main/java/com/fox2code/mmm/utils/PropUtils.java index d4a1012..9e005c7 100644 --- a/app/src/main/java/com/fox2code/mmm/utils/PropUtils.java +++ b/app/src/main/java/com/fox2code/mmm/utils/PropUtils.java @@ -45,8 +45,10 @@ public class PropUtils { moduleSupportsFallbacks.put("substratum", "https://github.com/substratum/substratum/issues"); // Config are application installed by modules that allow them to be configured moduleConfigsFallbacks.put("quickstepswitcher", "xyz.paphonb.quickstepswitcher"); + moduleConfigsFallbacks.put("hex_installer_module", "project.vivid.hex.bodhi"); moduleConfigsFallbacks.put("riru_edxposed", "org.meowcat.edxposed.manager"); moduleConfigsFallbacks.put("riru_lsposed", "org.lsposed.manager"); + moduleConfigsFallbacks.put("zygisk_lsposed", "org.lsposed.manager"); moduleConfigsFallbacks.put("xposed_dalvik", "de.robv.android.xposed.installer"); moduleConfigsFallbacks.put("xposed", "de.robv.android.xposed.installer"); moduleConfigsFallbacks.put("substratum", "projekt.substratum");