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

Commit a5d0c22

Browse files
committed
Improve LSPosed support, add more modules config fallback.
1 parent 0f2bb7b commit a5d0c22

File tree

9 files changed

+93
-13
lines changed

9 files changed

+93
-13
lines changed

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,15 @@ public boolean shouldRemove() {
154154

155155
public void getButtons(Context context, List<ActionButtonType> buttonTypeList, boolean showcaseMode) {
156156
if (!this.isModuleHolder()) return;
157-
if (this.moduleInfo != null && !showcaseMode) {
157+
LocalModuleInfo localModuleInfo = this.moduleInfo;
158+
if (localModuleInfo != null && !showcaseMode) {
158159
buttonTypeList.add(ActionButtonType.UNINSTALL);
159160
}
160161
if (this.repoModule != null && this.repoModule.notesUrl != null) {
161162
buttonTypeList.add(ActionButtonType.INFO);
162163
}
163-
if ((this.repoModule != null || (this.moduleInfo != null &&
164-
this.moduleInfo.updateZipUrl != null))) {
164+
if ((this.repoModule != null || (localModuleInfo != null &&
165+
localModuleInfo.updateZipUrl != null))) {
165166
buttonTypeList.add(ActionButtonType.UPDATE_INSTALL);
166167
}
167168
String config = this.getMainModuleConfig();
@@ -171,7 +172,7 @@ public void getButtons(Context context, List<ActionButtonType> buttonTypeList, b
171172
} else {
172173
String pkg = IntentHelper.getPackageOfConfig(config);
173174
try {
174-
context.getPackageManager().getPackageInfo(pkg, 0);
175+
XHooks.checkConfigTargetExists(context, pkg, config);
175176
buttonTypeList.add(ActionButtonType.CONFIG);
176177
} catch (PackageManager.NameNotFoundException e) {
177178
Log.w(TAG, "Config package \"" + pkg +
@@ -180,6 +181,10 @@ public void getButtons(Context context, List<ActionButtonType> buttonTypeList, b
180181
}
181182
}
182183
ModuleInfo moduleInfo = this.getMainModuleInfo();
184+
if (moduleInfo == null) { // Avoid concurrency NPE
185+
if (localModuleInfo == null) return;
186+
moduleInfo = localModuleInfo;
187+
}
183188
if (moduleInfo.support != null) {
184189
buttonTypeList.add(ActionButtonType.SUPPORT);
185190
}

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,16 +186,18 @@ public boolean update(ModuleHolder moduleHolder) {
186186
this.creditText.setText((localModuleInfo == null ||
187187
Objects.equals(moduleInfo.version, localModuleInfo.version) ?
188188
moduleInfo.version : localModuleInfo.version + " (" +
189-
this.getString(R.string.module_last_update) +
189+
this.getString(R.string.module_last_update) + " " +
190190
moduleInfo.version + ")") + " " +
191191
this.getString(R.string.module_by) + " " + moduleInfo.author);
192192
} else {
193193
this.creditText.setText(localModuleInfo.version + (
194-
(localModuleInfo.updateVersion != null &&
194+
(localModuleInfo.updateVersion != null && (Objects.equals(
195+
localModuleInfo.version, localModuleInfo.updateVersion) ||
195196
Objects.equals(localModuleInfo.version,
196-
localModuleInfo.updateVersion)) ?
197+
localModuleInfo.updateVersion + " (" +
198+
localModuleInfo.updateVersionCode + ")"))) ?
197199
"" : " (" + this.getString(R.string.module_last_update) +
198-
localModuleInfo.updateVersion + ")") + " " +
200+
" " + localModuleInfo.updateVersion + ")") + " " +
199201
this.getString(R.string.module_by) + " " + localModuleInfo.author);
200202
}
201203
if (moduleInfo.description == null || moduleInfo.description.isEmpty()) {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.fox2code.mmm;
2+
3+
import android.content.Context;
4+
import android.content.Intent;
5+
import android.content.pm.PackageManager;
6+
import android.webkit.WebView;
7+
8+
import androidx.annotation.Keep;
9+
10+
import com.fox2code.mmm.manager.ModuleManager;
11+
12+
/**
13+
* Class made to expose some manager functions to xposed modules.
14+
* It will not be obfuscated on release builds
15+
*/
16+
@Keep
17+
public class XHooks {
18+
@Keep
19+
public static boolean isModuleActive(String moduleId) {
20+
return ModuleManager.isModuleActive(moduleId);
21+
}
22+
23+
@Keep
24+
public static void checkConfigTargetExists(Context context, String packageName, String config)
25+
throws PackageManager.NameNotFoundException {
26+
if ("org.lsposed.manager".equals(config) && "org.lsposed.manager".equals(packageName) &&
27+
(XHooks.isModuleActive("riru_lsposed") || XHooks.isModuleActive("zygisk_lsposed")))
28+
return; // Skip check for lsposed as it is probably injected into the system.
29+
context.getPackageManager().getPackageInfo(packageName, 0);
30+
}
31+
32+
@Keep
33+
public static Intent getConfigIntent(Context context, String packageName,String config) {
34+
return context.getPackageManager().getLaunchIntentForPackage(packageName);
35+
}
36+
37+
@Keep
38+
public static void onWebViewInitialize(WebView webView,boolean allowInstall) {
39+
if (webView == null) throw new NullPointerException("WebView is null!");
40+
}
41+
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.fox2code.mmm.Constants;
2727
import com.fox2code.mmm.MainApplication;
2828
import com.fox2code.mmm.R;
29+
import com.fox2code.mmm.XHooks;
2930
import com.fox2code.mmm.compat.CompatActivity;
3031
import com.fox2code.mmm.utils.Http;
3132
import com.fox2code.mmm.utils.IntentHelper;
@@ -92,7 +93,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
9293
if (config != null && !config.isEmpty()) {
9394
String configPkg = IntentHelper.getPackageOfConfig(config);
9495
try {
95-
this.getPackageManager().getPackageInfo(configPkg, 0);
96+
XHooks.checkConfigTargetExists(this, configPkg, config);
9697
this.setActionBarExtraMenuButton(R.drawable.ic_baseline_app_settings_alt_24,
9798
menu -> {
9899
IntentHelper.openConfig(this, config);
@@ -182,6 +183,7 @@ public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathC
182183
IntentHelper.openCustomTab(this, downloadUrl);
183184
}
184185
});
186+
XHooks.onWebViewInitialize(this.webView, allowInstall);
185187
this.webView.addJavascriptInterface(androidacyWebAPI =
186188
new AndroidacyWebAPI(this, allowInstall), "mmm");
187189
if (compatLevel != 0) androidacyWebAPI.notifyCompatModeRaw(compatLevel);

app/src/main/java/com/fox2code/mmm/installer/InstallerActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.fox2code.mmm.Constants;
2222
import com.fox2code.mmm.MainApplication;
2323
import com.fox2code.mmm.R;
24+
import com.fox2code.mmm.XHooks;
2425
import com.fox2code.mmm.compat.CompatActivity;
2526
import com.fox2code.mmm.utils.FastException;
2627
import com.fox2code.mmm.utils.Files;
@@ -567,7 +568,7 @@ private void setInstallStateFinished(boolean success, String message,String opti
567568
if (config != null && !config.isEmpty()) {
568569
String configPkg = IntentHelper.getPackageOfConfig(config);
569570
try {
570-
this.getPackageManager().getPackageInfo(configPkg, 0);
571+
XHooks.checkConfigTargetExists(this, configPkg, config);
571572
this.setActionBarExtraMenuButton(R.drawable.ic_baseline_app_settings_alt_24, menu -> {
572573
IntentHelper.openConfig(this, config);
573574
return true;

app/src/main/java/com/fox2code/mmm/manager/ModuleManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,4 +253,9 @@ public boolean masterClear(ModuleInfo moduleInfo) {
253253
moduleInfo.flags = ModuleInfo.FLAG_METADATA_INVALID;
254254
return true;
255255
}
256+
257+
public static boolean isModuleActive(String moduleId) {
258+
ModuleInfo moduleInfo = ModuleManager.getINSTANCE().getModules().get(moduleId);
259+
return moduleInfo != null && (moduleInfo.flags & ModuleInfo.FLAGS_MODULE_ACTIVE) != 0;
260+
}
256261
}

app/src/main/java/com/fox2code/mmm/markdown/MarkdownActivity.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import com.fox2code.mmm.Constants;
1616
import com.fox2code.mmm.MainApplication;
1717
import com.fox2code.mmm.R;
18+
import com.fox2code.mmm.XHooks;
1819
import com.fox2code.mmm.compat.CompatActivity;
1920
import com.fox2code.mmm.utils.Http;
2021
import com.fox2code.mmm.utils.IntentHelper;
@@ -83,7 +84,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
8384
if (config != null && !config.isEmpty()) {
8485
String configPkg = IntentHelper.getPackageOfConfig(config);
8586
try {
86-
this.getPackageManager().getPackageInfo(configPkg, 0);
87+
XHooks.checkConfigTargetExists(this, configPkg, config);
8788
this.setActionBarExtraMenuButton(R.drawable.ic_baseline_app_settings_alt_24, menu -> {
8889
IntentHelper.openConfig(this, config);
8990
return true;

app/src/main/java/com/fox2code/mmm/utils/IntentHelper.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,24 @@
2222
import com.fox2code.mmm.Constants;
2323
import com.fox2code.mmm.MainApplication;
2424
import com.fox2code.mmm.R;
25+
import com.fox2code.mmm.XHooks;
2526
import com.fox2code.mmm.androidacy.AndroidacyActivity;
2627
import com.fox2code.mmm.compat.CompatActivity;
2728
import com.fox2code.mmm.installer.InstallerActivity;
2829
import com.fox2code.mmm.markdown.MarkdownActivity;
30+
import com.topjohnwu.superuser.CallbackList;
31+
import com.topjohnwu.superuser.Shell;
32+
import com.topjohnwu.superuser.ShellUtils;
33+
import com.topjohnwu.superuser.internal.Utils;
2934
import com.topjohnwu.superuser.io.SuFileInputStream;
3035

3136
import java.io.File;
3237
import java.io.FileOutputStream;
3338
import java.io.InputStream;
3439
import java.io.OutputStream;
3540
import java.net.URISyntaxException;
41+
import java.util.ArrayList;
42+
import java.util.List;
3643

3744
public class IntentHelper {
3845
private static final String TAG = "IntentHelper";
@@ -128,9 +135,23 @@ public static String getPackageOfConfig(String config) {
128135
public static void openConfig(Context context, String config) {
129136
String pkg = getPackageOfConfig(config);
130137
try {
131-
Intent intent = context.getPackageManager()
132-
.getLaunchIntentForPackage(pkg);
138+
Intent intent = XHooks.getConfigIntent(context, pkg, config);
133139
if (intent == null) {
140+
if ("org.lsposed.manager".equals(config) && (
141+
XHooks.isModuleActive("riru_lsposed") ||
142+
XHooks.isModuleActive("zygisk_lsposed"))) {
143+
Shell.getShell().newJob().add(
144+
"am start -a android.intent.action.MAIN " +
145+
"-c org.lsposed.manager.LAUNCH_MANAGER " +
146+
"com.android.shell/.BugreportWarningActivity")
147+
.to(new CallbackList<String>() {
148+
@Override
149+
public void onAddElement(String str) {
150+
Log.d(TAG, "LSPosed: " + str);
151+
}
152+
}).submit();
153+
return;
154+
}
134155
intent = new Intent("android.intent.action.APPLICATION_PREFERENCES");
135156
intent.setPackage(pkg);
136157
}

app/src/main/java/com/fox2code/mmm/utils/PropUtils.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,10 @@ public class PropUtils {
4545
moduleSupportsFallbacks.put("substratum", "https://github.com/substratum/substratum/issues");
4646
// Config are application installed by modules that allow them to be configured
4747
moduleConfigsFallbacks.put("quickstepswitcher", "xyz.paphonb.quickstepswitcher");
48+
moduleConfigsFallbacks.put("hex_installer_module", "project.vivid.hex.bodhi");
4849
moduleConfigsFallbacks.put("riru_edxposed", "org.meowcat.edxposed.manager");
4950
moduleConfigsFallbacks.put("riru_lsposed", "org.lsposed.manager");
51+
moduleConfigsFallbacks.put("zygisk_lsposed", "org.lsposed.manager");
5052
moduleConfigsFallbacks.put("xposed_dalvik", "de.robv.android.xposed.installer");
5153
moduleConfigsFallbacks.put("xposed", "de.robv.android.xposed.installer");
5254
moduleConfigsFallbacks.put("substratum", "projekt.substratum");

0 commit comments

Comments
 (0)