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

Commit e90472a

Browse files
committed
Add Support for systems without a working WebView
1 parent 6daa941 commit e90472a

File tree

13 files changed

+127
-24
lines changed

13 files changed

+127
-24
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import androidx.annotation.NonNull;
44
import androidx.appcompat.widget.SearchView;
55
import androidx.cardview.widget.CardView;
6-
import androidx.core.content.ContextCompat;
76
import androidx.core.graphics.ColorUtils;
87
import androidx.recyclerview.widget.LinearLayoutManager;
98
import androidx.recyclerview.widget.RecyclerView;
@@ -34,7 +33,6 @@
3433
import com.google.android.material.progressindicator.LinearProgressIndicator;
3534

3635
import eightbitlab.com.blurview.BlurView;
37-
import eightbitlab.com.blurview.BlurViewFacade;
3836
import eightbitlab.com.blurview.RenderScriptBlur;
3937

4038
public class MainActivity extends CompatActivity implements SwipeRefreshLayout.OnRefreshListener,
@@ -161,6 +159,8 @@ public void commonNext() {
161159
updateScreenInsets(); // Fix an edge case
162160
if (MainApplication.isShowcaseMode())
163161
moduleViewListBuilder.addNotification(NotificationType.SHOWCASE_MODE);
162+
if (!Http.hasWebView()) // Check Http for WebView availability
163+
moduleViewListBuilder.addNotification(NotificationType.NO_WEB_VIEW);
164164
moduleViewListBuilder.applyTo(moduleList, moduleViewAdapter);
165165
runOnUiThread(() -> {
166166
progressIndicator.setIndeterminate(false);

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.fox2code.mmm;
22

33
import android.annotation.SuppressLint;
4-
import android.app.Application;
54
import android.content.Intent;
65
import android.content.SharedPreferences;
76
import android.content.res.Configuration;

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.fox2code.mmm.manager.LocalModuleInfo;
1212
import com.fox2code.mmm.manager.ModuleInfo;
1313
import com.fox2code.mmm.repo.RepoModule;
14+
import com.fox2code.mmm.utils.Http;
1415
import com.fox2code.mmm.utils.IntentHelper;
1516
import com.fox2code.mmm.utils.PropUtils;
1617

@@ -167,7 +168,7 @@ public void getButtons(Context context, List<ActionButtonType> buttonTypeList, b
167168
}
168169
String config = this.getMainModuleConfig();
169170
if (config != null) {
170-
if (config.startsWith("https://www.androidacy.com/")) {
171+
if (config.startsWith("https://www.androidacy.com/") && Http.hasWebView()) {
171172
buttonTypeList.add(ActionButtonType.CONFIG);
172173
} else {
173174
String pkg = IntentHelper.getPackageOfConfig(config);

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.fox2code.mmm.installer.InstallerInitializer;
1313
import com.fox2code.mmm.repo.RepoManager;
1414
import com.fox2code.mmm.utils.Files;
15+
import com.fox2code.mmm.utils.Http;
1516
import com.fox2code.mmm.utils.IntentHelper;
1617

1718
import java.io.File;
@@ -56,6 +57,12 @@ public boolean shouldRemove() {
5657
RepoManager.getINSTANCE().hasConnectivity();
5758
}
5859
},
60+
NO_WEB_VIEW(R.string.no_web_view, R.drawable.ic_baseline_android_24) {
61+
@Override
62+
public boolean shouldRemove() {
63+
return Http.hasWebView();
64+
}
65+
},
5966
UPDATE_AVAILABLE(R.string.app_update_available, R.drawable.ic_baseline_system_update_24,
6067
R.attr.colorPrimary, R.attr.colorOnPrimary, v -> {
6168
IntentHelper.openUrl(v.getContext(),

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,11 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
6666
this.forceBackPressed();
6767
return;
6868
}
69+
if (!Http.hasWebView()) {
70+
Log.w(TAG, "No WebView found to load url: " + url);
71+
this.forceBackPressed();
72+
return;
73+
}
6974
if (!url.endsWith(REFERRER) && (url.startsWith("https://www.androidacy.com/") ||
7075
url.startsWith("https://api.androidacy.com/magisk/"))) {
7176
if (url.lastIndexOf('/') < url.lastIndexOf('?')) {

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

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,24 @@
1818
import java.io.File;
1919
import java.nio.charset.StandardCharsets;
2020
import java.util.ArrayList;
21+
import java.util.Collections;
2122
import java.util.Iterator;
2223
import java.util.List;
2324

25+
import okhttp3.Cookie;
26+
import okhttp3.HttpUrl;
27+
28+
@SuppressWarnings("KotlinInternalInJava")
2429
public class AndroidacyRepoData extends RepoData {
2530
private static final String TAG = "AndroidacyRepoData";
31+
private static final HttpUrl OK_HTTP_URL;
32+
static {
33+
HttpUrl.Builder OK_HTTP_URL_BUILDER =
34+
new HttpUrl.Builder().scheme("https");
35+
// Using HttpUrl.Builder.host(String) crash the app
36+
OK_HTTP_URL_BUILDER.setHost$okhttp(".androidacy.com");
37+
OK_HTTP_URL = OK_HTTP_URL_BUILDER.build();
38+
}
2639
private long androidacyBlockade = 0;
2740

2841
public AndroidacyRepoData(String url, File cacheRoot,
@@ -36,13 +49,29 @@ public AndroidacyRepoData(String url, File cacheRoot,
3649
}
3750
}
3851

52+
private static String getCookies() {
53+
if (Http.hasWebView()) {
54+
return CookieManager.getInstance().getCookie("https://.androidacy.com/");
55+
} else {
56+
Iterator<Cookie> cookies = Http.getCookieJar()
57+
.loadForRequest(OK_HTTP_URL).iterator();
58+
if (!cookies.hasNext()) return "";
59+
StringBuilder stringBuilder = new StringBuilder();
60+
while (true) {
61+
stringBuilder.append(cookies.next().toString());
62+
if (!cookies.hasNext()) return stringBuilder.toString();
63+
stringBuilder.append(",");
64+
}
65+
}
66+
}
67+
3968
@Override
4069
protected boolean prepare() {
4170
// Implementation details discussed on telegram
4271
long time = System.currentTimeMillis();
4372
if (this.androidacyBlockade > time) return false;
4473
this.androidacyBlockade = time + 5_000L;
45-
String cookies = CookieManager.getInstance().getCookie("https://.androidacy.com/");
74+
String cookies = AndroidacyRepoData.getCookies();
4675
int start = cookies == null ? -1 : cookies.indexOf("USER=");
4776
String token = null;
4877
if (start != -1) {
@@ -61,9 +90,14 @@ protected boolean prepare() {
6190
return false;
6291
}
6392
Log.w(TAG, "Invalid token, resetting...");
64-
CookieManager.getInstance().setCookie("https://.androidacy.com/",
65-
"USER=; expires=Thu, 01 Jan 1970 00:00:00 GMT;" +
66-
" path=/; secure; domain=.androidacy.com");
93+
if (Http.hasWebView()) {
94+
CookieManager.getInstance().setCookie("https://.androidacy.com/",
95+
"USER=; expires=Thu, 01 Jan 1970 00:00:00 GMT;" +
96+
" path=/; secure; domain=.androidacy.com");
97+
} else {
98+
Http.getCookieJar().saveFromResponse(
99+
OK_HTTP_URL, Collections.emptyList());
100+
}
67101
token = null;
68102
}
69103
}
@@ -73,9 +107,16 @@ protected boolean prepare() {
73107
token = new String(Http.doHttpPost(
74108
"https://api.androidacy.com/auth/register",
75109
"",true), StandardCharsets.UTF_8);
76-
CookieManager.getInstance().setCookie("https://.androidacy.com/",
77-
"USER="+ token + "; expires=Fri, 31 Dec 9999 23:59:59 GMT;" +
78-
" path=/; secure; domain=.androidacy.com");
110+
if (Http.hasWebView()) {
111+
CookieManager.getInstance().setCookie("https://.androidacy.com/",
112+
"USER=" + token + "; expires=Fri, 31 Dec 9999 23:59:59 GMT;" +
113+
" path=/; secure; domain=.androidacy.com");
114+
} else {
115+
Http.getCookieJar().saveFromResponse(OK_HTTP_URL,
116+
Collections.singletonList(Cookie.parse(OK_HTTP_URL,
117+
"USER=" + token + "; expires=Fri, 31 Dec 9999 23:59:59 GMT;" +
118+
" path=/; secure; domain=.androidacy.com")));
119+
}
79120
} catch (Exception e) {
80121
if ("Received error code: 419".equals(e.getMessage()) ||
81122
"Received error code: 429".equals(e.getMessage()) ||

app/src/main/java/com/fox2code/mmm/compat/CompatThemeWrapper.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import android.content.Context;
44
import android.content.res.Resources;
5-
import android.graphics.Color;
65
import android.os.Build;
76
import android.util.TypedValue;
87

@@ -12,7 +11,6 @@
1211
import androidx.annotation.StyleRes;
1312
import androidx.appcompat.view.ContextThemeWrapper;
1413
import androidx.core.content.ContextCompat;
15-
import androidx.core.content.res.ComplexColorCompat;
1614
import androidx.core.graphics.ColorUtils;
1715

1816
import com.fox2code.mmm.R;

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.fox2code.mmm.utils.Files;
1111
import com.topjohnwu.superuser.NoShellException;
1212
import com.topjohnwu.superuser.Shell;
13-
import com.topjohnwu.superuser.io.SuFile;
1413

1514
import java.io.File;
1615
import java.util.ArrayList;

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

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ public class Http {
5656
private static final OkHttpClient httpClientWithCache;
5757
private static final OkHttpClient httpClientWithCacheDoH;
5858
private static final FallBackDNS fallbackDNS;
59+
private static final CookieJar cookieJar;
5960
private static final String androidacyUA;
61+
private static final boolean hasWebView;
6062
private static boolean doh;
6163

6264
static {
@@ -102,7 +104,7 @@ public class Http {
102104
return Dns.SYSTEM.lookup(s);
103105
};
104106
httpclientBuilder.dns(dns);
105-
httpclientBuilder.cookieJar(new CDNCookieJar(false));
107+
httpclientBuilder.cookieJar(new CDNCookieJar());
106108
dns = new DnsOverHttps.Builder().client(httpclientBuilder.build()).url(
107109
Objects.requireNonNull(HttpUrl.parse("https://cloudflare-dns.com/dns-query")))
108110
.bootstrapDnsHosts(cloudflareBootstrap).resolvePrivateAddresses(true).build();
@@ -139,7 +141,16 @@ public class Http {
139141
"camo.githubusercontent.com", "user-images.githubusercontent.com",
140142
"cdn.jsdelivr.net", "img.shields.io", "magisk-modules-repo.github.io",
141143
"www.androidacy.com", "api.androidacy.com");
142-
httpclientBuilder.cookieJar(new CDNCookieJar(true));
144+
CookieManager cookieManager;
145+
try {
146+
cookieManager = CookieManager.getInstance();
147+
cookieManager.flush(); // Make sure the instance work
148+
} catch (Throwable t) {
149+
cookieManager = null;
150+
Log.e(TAG, "No WebView support!", t);
151+
}
152+
hasWebView = cookieManager != null;
153+
httpclientBuilder.cookieJar(cookieJar = new CDNCookieJar(cookieManager));
143154
httpclientBuilder.dns(Dns.SYSTEM);
144155
httpClient = httpclientBuilder.build();
145156
httpclientBuilder.dns(fallbackDNS);
@@ -268,17 +279,29 @@ public static void setDoh(boolean doh) {
268279
private static class CDNCookieJar implements CookieJar {
269280
private final HashMap<String, Cookie> cookieMap = new HashMap<>();
270281
private final boolean androidacySupport;
282+
private final CookieManager cookieManager;
283+
private List<Cookie> androidacyCookies;
271284

272-
private CDNCookieJar(boolean androidacySupport) {
273-
this.androidacySupport = androidacySupport;
285+
private CDNCookieJar() {
286+
this.androidacySupport = false;
287+
this.cookieManager = null;
288+
}
289+
290+
private CDNCookieJar(CookieManager cookieManager) {
291+
this.androidacySupport = true;
292+
this.cookieManager = cookieManager;
293+
if (cookieManager == null) {
294+
this.androidacyCookies = Collections.emptyList();
295+
}
274296
}
275297

276298
@NonNull
277299
@Override
278300
public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
279301
if (!httpUrl.isHttps()) return Collections.emptyList();
280302
if (this.androidacySupport && httpUrl.host().endsWith(".androidacy.com")) {
281-
String cookies = CookieManager.getInstance().getCookie(httpUrl.uri().toString());
303+
if (this.cookieManager == null) return this.androidacyCookies;
304+
String cookies = this.cookieManager.getCookie(httpUrl.uri().toString());
282305
if (cookies == null || cookies.isEmpty()) return Collections.emptyList();
283306
String[] splitCookies = cookies.split(";");
284307
ArrayList<Cookie> cookieList = new ArrayList<>(splitCookies.length);
@@ -296,8 +319,13 @@ public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
296319
public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> cookies) {
297320
if (!httpUrl.isHttps()) return;
298321
if (this.androidacySupport && httpUrl.host().endsWith(".androidacy.com")) {
322+
if (this.cookieManager == null) {
323+
if (httpUrl.host().equals(".androidacy.com") || !cookies.isEmpty())
324+
this.androidacyCookies = cookies;
325+
return;
326+
}
299327
for (Cookie cookie : cookies) {
300-
CookieManager.getInstance().setCookie(
328+
this.cookieManager.setCookie(
301329
httpUrl.uri().toString(), cookie.toString());
302330
}
303331
return;
@@ -454,6 +482,10 @@ public void writeTo(@NonNull BufferedSink bufferedSink) throws IOException {
454482
}
455483
}
456484

485+
public static boolean hasWebView() {
486+
return hasWebView;
487+
}
488+
457489
/**
458490
* Change URL to appropriate url and force Magisk link to use latest version.
459491
*/
@@ -495,4 +527,8 @@ public static String cdnIfyLink(String string) {
495527
}
496528
return string;
497529
}
530+
531+
public static CookieJar getCookieJar() {
532+
return cookieJar;
533+
}
498534
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,13 @@
2929
import com.fox2code.mmm.markdown.MarkdownActivity;
3030
import com.topjohnwu.superuser.CallbackList;
3131
import com.topjohnwu.superuser.Shell;
32-
import com.topjohnwu.superuser.ShellUtils;
33-
import com.topjohnwu.superuser.internal.Utils;
3432
import com.topjohnwu.superuser.io.SuFileInputStream;
3533

3634
import java.io.File;
3735
import java.io.FileOutputStream;
3836
import java.io.InputStream;
3937
import java.io.OutputStream;
4038
import java.net.URISyntaxException;
41-
import java.util.ArrayList;
42-
import java.util.List;
4339

4440
public class IntentHelper {
4541
private static final String TAG = "IntentHelper";
@@ -103,6 +99,11 @@ public static void openUrlAndroidacy(Context context, String url,boolean allowIn
10399

104100
public static void openUrlAndroidacy(Context context, String url, boolean allowInstall,
105101
String title,String config) {
102+
if (!Http.hasWebView()) {
103+
Log.w(TAG, "Using custom tab for: " + url);
104+
openCustomTab(context, url);
105+
return;
106+
}
106107
Uri uri = Uri.parse(url);
107108
try {
108109
Intent myIntent = new Intent(

0 commit comments

Comments
 (0)