diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d7a64c0..5a6ab48 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -71,10 +71,13 @@
android:theme="@style/Theme.MagiskModuleManager">
+
+
+
diff --git a/app/src/main/java/com/fox2code/mmm/Constants.java b/app/src/main/java/com/fox2code/mmm/Constants.java
index e2d073f..37e3a3b 100644
--- a/app/src/main/java/com/fox2code/mmm/Constants.java
+++ b/app/src/main/java/com/fox2code/mmm/Constants.java
@@ -8,6 +8,8 @@ public class Constants {
public static final int MAGISK_VER_CODE_MAGISK_ZYGOTE = 23002;
public static final String INTENT_INSTALL_INTERNAL =
BuildConfig.APPLICATION_ID + ".intent.action.INSTALL_MODULE_INTERNAL";
+ public static final String INTENT_ANDROIDACY_INTERNAL =
+ BuildConfig.APPLICATION_ID + ".intent.action.OPEN_ANDROIDACY_INTERNAL";
public static final String EXTRA_INSTALL_PATH = "extra_install_path";
public static final String EXTRA_INSTALL_NAME = "extra_install_name";
public static final String EXTRA_INSTALL_CONFIG = "extra_install_config";
diff --git a/app/src/main/java/com/fox2code/mmm/MainApplication.java b/app/src/main/java/com/fox2code/mmm/MainApplication.java
index ee251e6..60cb8c4 100644
--- a/app/src/main/java/com/fox2code/mmm/MainApplication.java
+++ b/app/src/main/java/com/fox2code/mmm/MainApplication.java
@@ -79,7 +79,7 @@ public class MainApplication extends Application implements CompatActivity.Appli
}
public static boolean checkSecret(Intent intent) {
- return intent.getLongExtra("secret", ~secret) == secret;
+ return intent != null && intent.getLongExtra("secret", ~secret) == secret;
}
public static SharedPreferences getSharedPreferences() {
diff --git a/app/src/main/java/com/fox2code/mmm/androidacy/AndoridacyActivity.java b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java
similarity index 74%
rename from app/src/main/java/com/fox2code/mmm/androidacy/AndoridacyActivity.java
rename to app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java
index f001c2c..25a7c48 100644
--- a/app/src/main/java/com/fox2code/mmm/androidacy/AndoridacyActivity.java
+++ b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java
@@ -11,6 +11,7 @@ import android.webkit.WebViewClient;
import androidx.annotation.Nullable;
+import com.fox2code.mmm.MainApplication;
import com.fox2code.mmm.R;
import com.fox2code.mmm.compat.CompatActivity;
import com.fox2code.mmm.utils.Http;
@@ -19,17 +20,18 @@ import com.fox2code.mmm.utils.IntentHelper;
/**
* Per Androidacy repo implementation agreement, no request of this WebView shall be modified.
*/
-public class AndoridacyActivity extends CompatActivity {
+public class AndroidacyActivity extends CompatActivity {
private WebView webView;
@Override
- @SuppressLint("SetJavaScriptEnabled")
+ @SuppressLint({"SetJavaScriptEnabled", "JavascriptInterface"})
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = this.getIntent();
Uri uri;
- if (intent == null || (uri = intent.getData()) == null
- || !uri.getHost().endsWith(".androidacy.com")) {
+ if (!MainApplication.checkSecret(intent) ||
+ (uri = intent.getData()) == null ||
+ !uri.getHost().endsWith(".androidacy.com")) {
this.forceBackPressed();
return;
}
@@ -43,14 +45,16 @@ public class AndoridacyActivity extends CompatActivity {
this.webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
- if (request.isForMainFrame() && // Don't open non andoridacy urls inside WebView
- !request.getUrl().getHost().endsWith(".androidacy.com")) {
+ // Don't open non andoridacy urls inside WebView
+ if (request.isForMainFrame() && !(request.getUrl().getScheme().equals("intent") ||
+ request.getUrl().getHost().endsWith(".androidacy.com"))) {
IntentHelper.openUrl(view.getContext(), request.getUrl().toString());
return true;
}
return false;
}
});
+ this.webView.addJavascriptInterface(new AndroidacyWebAPI(this), "mmm");
this.webView.loadUrl(uri.toString());
}
diff --git a/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java
new file mode 100644
index 0000000..e4bbb21
--- /dev/null
+++ b/app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyWebAPI.java
@@ -0,0 +1,72 @@
+package com.fox2code.mmm.androidacy;
+
+import android.net.Uri;
+import android.webkit.JavascriptInterface;
+import android.widget.Toast;
+
+import com.fox2code.mmm.MainApplication;
+import com.fox2code.mmm.installer.InstallerInitializer;
+import com.fox2code.mmm.manager.ModuleManager;
+import com.fox2code.mmm.utils.IntentHelper;
+
+public class AndroidacyWebAPI {
+ private final AndroidacyActivity activity;
+
+ public AndroidacyWebAPI(AndroidacyActivity activity) {
+ this.activity = activity;
+ }
+
+ @JavascriptInterface
+ public void forceQuit(String error) {
+ Toast.makeText(this.activity, error, Toast.LENGTH_LONG).show();
+ this.activity.forceBackPressed();
+ }
+
+ @JavascriptInterface
+ public void cancel() {
+ this.activity.forceBackPressed();
+ }
+
+ @JavascriptInterface
+ public void openUrl(String url) {
+ if (Uri.parse(url).getScheme().equals("https")) {
+ IntentHelper.openUrl(this.activity, url);
+ }
+ }
+
+ @JavascriptInterface
+ public boolean isLightTheme() {
+ return MainApplication.getINSTANCE().isLightTheme();
+ }
+
+ @JavascriptInterface
+ public boolean hasRoot() {
+ return InstallerInitializer.peekMagiskPath() != null;
+ }
+
+ @JavascriptInterface
+ public boolean canInstall() {
+ return InstallerInitializer.peekMagiskPath() != null &&
+ !MainApplication.isShowcaseMode();
+ }
+
+ @JavascriptInterface
+ public void install(String moduleUrl, String installTitle) {
+ if (MainApplication.isShowcaseMode() ||
+ InstallerInitializer.peekMagiskPath() != null) {
+ // With lockdown mode enabled or lack of root, install should not have any effect
+ return;
+ }
+ Uri uri = Uri.parse(moduleUrl);
+ if (uri.getScheme().equals("https") && uri.getHost().endsWith(".androidacy.com")) {
+ IntentHelper.openInstaller(this.activity, moduleUrl, installTitle, null);
+ } else {
+ this.activity.forceBackPressed();
+ }
+ }
+
+ @JavascriptInterface
+ public boolean isModuleInstalled(String moduleId) {
+ return ModuleManager.getINSTANCE().getModules().get(moduleId) != null;
+ }
+}
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 531991d..67280f1 100644
--- a/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java
+++ b/app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java
@@ -127,6 +127,15 @@ public class SettingsActivity extends CompatActivity {
.commit();
return true;
});
+ if (BuildConfig.DEBUG) {
+ Preference debugPref = findPreference("pref_debug_button");
+ debugPref.setVisible(true);
+ debugPref.setOnPreferenceClickListener(preference -> {
+ IntentHelper.openUrlAndroidacy(this.getContext(),
+ "https://www.androidacy.com/modules-repo");
+ return true;
+ });
+ }
}
private void setRepoNameResolution(String preferenceName,String url,
diff --git a/app/src/main/java/com/fox2code/mmm/utils/Http.java b/app/src/main/java/com/fox2code/mmm/utils/Http.java
index 20df1d6..4867cfb 100644
--- a/app/src/main/java/com/fox2code/mmm/utils/Http.java
+++ b/app/src/main/java/com/fox2code/mmm/utils/Http.java
@@ -238,7 +238,12 @@ public class Http {
if (this.androidacySupport && httpUrl.host().endsWith(".androidacy.com")) {
String cookies = CookieManager.getInstance().getCookie(httpUrl.uri().toString());
if (cookies == null || cookies.isEmpty()) return Collections.emptyList();
-
+ String[] splitCookies = cookies.split(";");
+ ArrayList cookieList = new ArrayList<>(splitCookies.length);
+ for (String cookie : splitCookies) {
+ cookieList.add(Cookie.parse(httpUrl, cookie));
+ }
+ return cookieList;
}
Cookie cookies = cookieMap.get(httpUrl.url().getHost());
return cookies == null || cookies.expiresAt() < System.currentTimeMillis() ?
@@ -248,6 +253,13 @@ public class Http {
@Override
public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List cookies) {
if (!httpUrl.isHttps()) return;
+ if (this.androidacySupport && httpUrl.host().endsWith(".androidacy.com")) {
+ for (Cookie cookie : cookies) {
+ CookieManager.getInstance().setCookie(
+ httpUrl.uri().toString(), cookie.toString());
+ }
+ return;
+ }
String host = httpUrl.url().getHost();
Iterator cookieIterator = cookies.iterator();
Cookie cdnCookie = cookieMap.get(host);
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 1bff216..d4d68ab 100644
--- a/app/src/main/java/com/fox2code/mmm/utils/IntentHelper.java
+++ b/app/src/main/java/com/fox2code/mmm/utils/IntentHelper.java
@@ -20,6 +20,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.androidacy.AndroidacyActivity;
import com.fox2code.mmm.compat.CompatActivity;
import com.fox2code.mmm.installer.InstallerActivity;
import com.fox2code.mmm.markdown.MarkdownActivity;
@@ -44,6 +45,21 @@ public class IntentHelper {
}
}
+ public static void openUrlAndroidacy(Context context, String url) {
+ Uri uri = Uri.parse(url);
+ try {
+ Intent myIntent = new Intent(
+ Constants.INTENT_ANDROIDACY_INTERNAL,
+ uri, context, AndroidacyActivity.class);
+ MainApplication.addSecret(myIntent);
+ context.startActivity(myIntent);
+ } catch (ActivityNotFoundException e) {
+ Toast.makeText(context, "No application can handle this request."
+ + " Please install a web-browser", Toast.LENGTH_SHORT).show();
+ e.printStackTrace();
+ }
+ }
+
public static String getPackageOfConfig(String config) {
int i = config.indexOf(' ');
if (i != -1)
diff --git a/app/src/main/res/drawable/ic_baseline_bug_report_24.xml b/app/src/main/res/drawable/ic_baseline_bug_report_24.xml
new file mode 100644
index 0000000..7853f61
--- /dev/null
+++ b/app/src/main/res/drawable/ic_baseline_bug_report_24.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml
index c1eccc0..da8a927 100644
--- a/app/src/main/res/xml/root_preferences.xml
+++ b/app/src/main/res/xml/root_preferences.xml
@@ -99,5 +99,11 @@
app:icon="@drawable/ic_baseline_info_24"
app:title="@string/show_licenses"
app:singleLineTitle="false" />
+
+
\ No newline at end of file