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

Commit 00ae269

Browse files
committed
Improve Andoridacy WebView, progress on internal APIs.
1 parent 7839218 commit 00ae269

File tree

10 files changed

+143
-9
lines changed

10 files changed

+143
-9
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,13 @@
7171
android:theme="@style/Theme.MagiskModuleManager">
7272
</activity>
7373
<activity
74-
android:name=".androidacy.AndoridacyActivity"
74+
android:name=".androidacy.AndroidacyActivity"
7575
android:parentActivityName=".MainActivity"
7676
android:exported="false"
7777
android:theme="@style/Theme.MagiskModuleManager">
78+
<intent-filter>
79+
<action android:name="${applicationId}.intent.action.OPEN_ANDROIDACY_INTERNAL" />
80+
</intent-filter>
7881
</activity>
7982
<activity android:name="com.mikepenz.aboutlibraries.ui.LibsActivity"
8083
tools:node="remove"/>

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ public class Constants {
88
public static final int MAGISK_VER_CODE_MAGISK_ZYGOTE = 23002;
99
public static final String INTENT_INSTALL_INTERNAL =
1010
BuildConfig.APPLICATION_ID + ".intent.action.INSTALL_MODULE_INTERNAL";
11+
public static final String INTENT_ANDROIDACY_INTERNAL =
12+
BuildConfig.APPLICATION_ID + ".intent.action.OPEN_ANDROIDACY_INTERNAL";
1113
public static final String EXTRA_INSTALL_PATH = "extra_install_path";
1214
public static final String EXTRA_INSTALL_NAME = "extra_install_name";
1315
public static final String EXTRA_INSTALL_CONFIG = "extra_install_config";

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ public static void addSecret(Intent intent) {
7979
}
8080

8181
public static boolean checkSecret(Intent intent) {
82-
return intent.getLongExtra("secret", ~secret) == secret;
82+
return intent != null && intent.getLongExtra("secret", ~secret) == secret;
8383
}
8484

8585
public static SharedPreferences getSharedPreferences() {

app/src/main/java/com/fox2code/mmm/androidacy/AndoridacyActivity.java renamed to app/src/main/java/com/fox2code/mmm/androidacy/AndroidacyActivity.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import androidx.annotation.Nullable;
1313

14+
import com.fox2code.mmm.MainApplication;
1415
import com.fox2code.mmm.R;
1516
import com.fox2code.mmm.compat.CompatActivity;
1617
import com.fox2code.mmm.utils.Http;
@@ -19,17 +20,18 @@
1920
/**
2021
* Per Androidacy repo implementation agreement, no request of this WebView shall be modified.
2122
*/
22-
public class AndoridacyActivity extends CompatActivity {
23+
public class AndroidacyActivity extends CompatActivity {
2324
private WebView webView;
2425

2526
@Override
26-
@SuppressLint("SetJavaScriptEnabled")
27+
@SuppressLint({"SetJavaScriptEnabled", "JavascriptInterface"})
2728
protected void onCreate(@Nullable Bundle savedInstanceState) {
2829
super.onCreate(savedInstanceState);
2930
Intent intent = this.getIntent();
3031
Uri uri;
31-
if (intent == null || (uri = intent.getData()) == null
32-
|| !uri.getHost().endsWith(".androidacy.com")) {
32+
if (!MainApplication.checkSecret(intent) ||
33+
(uri = intent.getData()) == null ||
34+
!uri.getHost().endsWith(".androidacy.com")) {
3335
this.forceBackPressed();
3436
return;
3537
}
@@ -43,14 +45,16 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
4345
this.webView.setWebViewClient(new WebViewClient() {
4446
@Override
4547
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
46-
if (request.isForMainFrame() && // Don't open non andoridacy urls inside WebView
47-
!request.getUrl().getHost().endsWith(".androidacy.com")) {
48+
// Don't open non andoridacy urls inside WebView
49+
if (request.isForMainFrame() && !(request.getUrl().getScheme().equals("intent") ||
50+
request.getUrl().getHost().endsWith(".androidacy.com"))) {
4851
IntentHelper.openUrl(view.getContext(), request.getUrl().toString());
4952
return true;
5053
}
5154
return false;
5255
}
5356
});
57+
this.webView.addJavascriptInterface(new AndroidacyWebAPI(this), "mmm");
5458
this.webView.loadUrl(uri.toString());
5559
}
5660

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.fox2code.mmm.androidacy;
2+
3+
import android.net.Uri;
4+
import android.webkit.JavascriptInterface;
5+
import android.widget.Toast;
6+
7+
import com.fox2code.mmm.MainApplication;
8+
import com.fox2code.mmm.installer.InstallerInitializer;
9+
import com.fox2code.mmm.manager.ModuleManager;
10+
import com.fox2code.mmm.utils.IntentHelper;
11+
12+
public class AndroidacyWebAPI {
13+
private final AndroidacyActivity activity;
14+
15+
public AndroidacyWebAPI(AndroidacyActivity activity) {
16+
this.activity = activity;
17+
}
18+
19+
@JavascriptInterface
20+
public void forceQuit(String error) {
21+
Toast.makeText(this.activity, error, Toast.LENGTH_LONG).show();
22+
this.activity.forceBackPressed();
23+
}
24+
25+
@JavascriptInterface
26+
public void cancel() {
27+
this.activity.forceBackPressed();
28+
}
29+
30+
@JavascriptInterface
31+
public void openUrl(String url) {
32+
if (Uri.parse(url).getScheme().equals("https")) {
33+
IntentHelper.openUrl(this.activity, url);
34+
}
35+
}
36+
37+
@JavascriptInterface
38+
public boolean isLightTheme() {
39+
return MainApplication.getINSTANCE().isLightTheme();
40+
}
41+
42+
@JavascriptInterface
43+
public boolean hasRoot() {
44+
return InstallerInitializer.peekMagiskPath() != null;
45+
}
46+
47+
@JavascriptInterface
48+
public boolean canInstall() {
49+
return InstallerInitializer.peekMagiskPath() != null &&
50+
!MainApplication.isShowcaseMode();
51+
}
52+
53+
@JavascriptInterface
54+
public void install(String moduleUrl, String installTitle) {
55+
if (MainApplication.isShowcaseMode() ||
56+
InstallerInitializer.peekMagiskPath() != null) {
57+
// With lockdown mode enabled or lack of root, install should not have any effect
58+
return;
59+
}
60+
Uri uri = Uri.parse(moduleUrl);
61+
if (uri.getScheme().equals("https") && uri.getHost().endsWith(".androidacy.com")) {
62+
IntentHelper.openInstaller(this.activity, moduleUrl, installTitle, null);
63+
} else {
64+
this.activity.forceBackPressed();
65+
}
66+
}
67+
68+
@JavascriptInterface
69+
public boolean isModuleInstalled(String moduleId) {
70+
return ModuleManager.getINSTANCE().getModules().get(moduleId) != null;
71+
}
72+
}

app/src/main/java/com/fox2code/mmm/settings/SettingsActivity.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
127127
.commit();
128128
return true;
129129
});
130+
if (BuildConfig.DEBUG) {
131+
Preference debugPref = findPreference("pref_debug_button");
132+
debugPref.setVisible(true);
133+
debugPref.setOnPreferenceClickListener(preference -> {
134+
IntentHelper.openUrlAndroidacy(this.getContext(),
135+
"https://www.androidacy.com/modules-repo");
136+
return true;
137+
});
138+
}
130139
}
131140

132141
private void setRepoNameResolution(String preferenceName,String url,

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,12 @@ public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
238238
if (this.androidacySupport && httpUrl.host().endsWith(".androidacy.com")) {
239239
String cookies = CookieManager.getInstance().getCookie(httpUrl.uri().toString());
240240
if (cookies == null || cookies.isEmpty()) return Collections.emptyList();
241-
241+
String[] splitCookies = cookies.split(";");
242+
ArrayList<Cookie> cookieList = new ArrayList<>(splitCookies.length);
243+
for (String cookie : splitCookies) {
244+
cookieList.add(Cookie.parse(httpUrl, cookie));
245+
}
246+
return cookieList;
242247
}
243248
Cookie cookies = cookieMap.get(httpUrl.url().getHost());
244249
return cookies == null || cookies.expiresAt() < System.currentTimeMillis() ?
@@ -248,6 +253,13 @@ public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
248253
@Override
249254
public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> cookies) {
250255
if (!httpUrl.isHttps()) return;
256+
if (this.androidacySupport && httpUrl.host().endsWith(".androidacy.com")) {
257+
for (Cookie cookie : cookies) {
258+
CookieManager.getInstance().setCookie(
259+
httpUrl.uri().toString(), cookie.toString());
260+
}
261+
return;
262+
}
251263
String host = httpUrl.url().getHost();
252264
Iterator<Cookie> cookieIterator = cookies.iterator();
253265
Cookie cdnCookie = cookieMap.get(host);

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.fox2code.mmm.Constants;
2121
import com.fox2code.mmm.MainApplication;
2222
import com.fox2code.mmm.R;
23+
import com.fox2code.mmm.androidacy.AndroidacyActivity;
2324
import com.fox2code.mmm.compat.CompatActivity;
2425
import com.fox2code.mmm.installer.InstallerActivity;
2526
import com.fox2code.mmm.markdown.MarkdownActivity;
@@ -44,6 +45,21 @@ public static void openUrl(Context context, String url) {
4445
}
4546
}
4647

48+
public static void openUrlAndroidacy(Context context, String url) {
49+
Uri uri = Uri.parse(url);
50+
try {
51+
Intent myIntent = new Intent(
52+
Constants.INTENT_ANDROIDACY_INTERNAL,
53+
uri, context, AndroidacyActivity.class);
54+
MainApplication.addSecret(myIntent);
55+
context.startActivity(myIntent);
56+
} catch (ActivityNotFoundException e) {
57+
Toast.makeText(context, "No application can handle this request."
58+
+ " Please install a web-browser", Toast.LENGTH_SHORT).show();
59+
e.printStackTrace();
60+
}
61+
}
62+
4763
public static String getPackageOfConfig(String config) {
4864
int i = config.indexOf(' ');
4965
if (i != -1)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="24dp"
3+
android:height="24dp"
4+
android:viewportWidth="24"
5+
android:viewportHeight="24"
6+
android:tint="?attr/colorControlNormal">
7+
<path
8+
android:fillColor="@android:color/white"
9+
android:pathData="M20,8h-2.81c-0.45,-0.78 -1.07,-1.45 -1.82,-1.96L17,4.41 15.59,3l-2.17,2.17C12.96,5.06 12.49,5 12,5c-0.49,0 -0.96,0.06 -1.41,0.17L8.41,3 7,4.41l1.62,1.63C7.88,6.55 7.26,7.22 6.81,8L4,8v2h2.09c-0.05,0.33 -0.09,0.66 -0.09,1v1L4,12v2h2v1c0,0.34 0.04,0.67 0.09,1L4,16v2h2.81c1.04,1.79 2.97,3 5.19,3s4.15,-1.21 5.19,-3L20,18v-2h-2.09c0.05,-0.33 0.09,-0.66 0.09,-1v-1h2v-2h-2v-1c0,-0.34 -0.04,-0.67 -0.09,-1L20,10L20,8zM14,16h-4v-2h4v2zM14,12h-4v-2h4v2z"/>
10+
</vector>

app/src/main/res/xml/root_preferences.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,11 @@
9999
app:icon="@drawable/ic_baseline_info_24"
100100
app:title="@string/show_licenses"
101101
app:singleLineTitle="false" />
102+
<!-- Only used in debug builds for debugging features -->
103+
<Preference
104+
app:key="pref_debug_button"
105+
app:icon="@drawable/ic_baseline_bug_report_24"
106+
app:isPreferenceVisible="false"
107+
app:singleLineTitle="false" />
102108
</PreferenceCategory>
103109
</PreferenceScreen>

0 commit comments

Comments
 (0)