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

Commit 7839218

Browse files
committed
Add initial Androidacy WebView Activity implementation.
1 parent 8f8842b commit 7839218

File tree

5 files changed

+119
-5
lines changed

5 files changed

+119
-5
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@
7070
android:exported="false"
7171
android:theme="@style/Theme.MagiskModuleManager">
7272
</activity>
73+
<activity
74+
android:name=".androidacy.AndoridacyActivity"
75+
android:parentActivityName=".MainActivity"
76+
android:exported="false"
77+
android:theme="@style/Theme.MagiskModuleManager">
78+
</activity>
7379
<activity android:name="com.mikepenz.aboutlibraries.ui.LibsActivity"
7480
tools:node="remove"/>
7581
<provider
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.fox2code.mmm.androidacy;
2+
3+
import android.annotation.SuppressLint;
4+
import android.content.Intent;
5+
import android.net.Uri;
6+
import android.os.Bundle;
7+
import android.webkit.WebResourceRequest;
8+
import android.webkit.WebSettings;
9+
import android.webkit.WebView;
10+
import android.webkit.WebViewClient;
11+
12+
import androidx.annotation.Nullable;
13+
14+
import com.fox2code.mmm.R;
15+
import com.fox2code.mmm.compat.CompatActivity;
16+
import com.fox2code.mmm.utils.Http;
17+
import com.fox2code.mmm.utils.IntentHelper;
18+
19+
/**
20+
* Per Androidacy repo implementation agreement, no request of this WebView shall be modified.
21+
*/
22+
public class AndoridacyActivity extends CompatActivity {
23+
private WebView webView;
24+
25+
@Override
26+
@SuppressLint("SetJavaScriptEnabled")
27+
protected void onCreate(@Nullable Bundle savedInstanceState) {
28+
super.onCreate(savedInstanceState);
29+
Intent intent = this.getIntent();
30+
Uri uri;
31+
if (intent == null || (uri = intent.getData()) == null
32+
|| !uri.getHost().endsWith(".androidacy.com")) {
33+
this.forceBackPressed();
34+
return;
35+
}
36+
this.setContentView(R.layout.webview);
37+
this.hideActionBar();
38+
this.webView = this.findViewById(R.id.webView);
39+
WebSettings webSettings = this.webView.getSettings();
40+
webSettings.setUserAgentString(Http.getAndroidacyUA());
41+
webSettings.setDomStorageEnabled(true);
42+
webSettings.setJavaScriptEnabled(true);
43+
this.webView.setWebViewClient(new WebViewClient() {
44+
@Override
45+
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+
IntentHelper.openUrl(view.getContext(), request.getUrl().toString());
49+
return true;
50+
}
51+
return false;
52+
}
53+
});
54+
this.webView.loadUrl(uri.toString());
55+
}
56+
57+
@Override
58+
public void onBackPressed() {
59+
WebView webView = this.webView;
60+
if (webView != null && webView.canGoBack()) {
61+
webView.goBack();
62+
} else {
63+
super.onBackPressed();
64+
}
65+
}
66+
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,23 @@ public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) {
134134
}
135135
}
136136

137+
public void hideActionBar() {
138+
androidx.appcompat.app.ActionBar compatActionBar;
139+
try {
140+
compatActionBar = this.getSupportActionBar();
141+
} catch (Exception e) {
142+
Log.e(TAG, "Failed to call getSupportActionBar", e);
143+
compatActionBar = null; // Allow fallback to builtin actionBar.
144+
}
145+
if (compatActionBar != null) {
146+
compatActionBar.hide();
147+
} else {
148+
android.app.ActionBar actionBar = this.getActionBar();
149+
if (actionBar != null)
150+
actionBar.hide();
151+
}
152+
}
153+
137154
public void setActionBarExtraMenuButton(@DrawableRes int drawableResId,
138155
MenuItem.OnMenuItemClickListener menuClickListener) {
139156
Objects.requireNonNull(menuClickListener);

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.system.ErrnoException;
88
import android.system.Os;
99
import android.util.Log;
10+
import android.webkit.CookieManager;
1011

1112
import androidx.annotation.NonNull;
1213

@@ -28,12 +29,11 @@
2829
import java.util.HashSet;
2930
import java.util.Iterator;
3031
import java.util.List;
31-
import java.util.Locale;
32+
import java.util.Map;
3233
import java.util.Objects;
3334
import java.util.concurrent.TimeUnit;
3435

3536
import okhttp3.Cache;
36-
import okhttp3.ConnectionSpec;
3737
import okhttp3.Cookie;
3838
import okhttp3.CookieJar;
3939
import okhttp3.Dns;
@@ -50,6 +50,7 @@ public class Http {
5050
private static final OkHttpClient httpClient;
5151
private static final OkHttpClient httpClientWithCache;
5252
private static final FallBackDNS fallbackDNS;
53+
private static final String androidacyUA;
5354

5455
static {
5556
MainApplication mainApplication = MainApplication.getINSTANCE();
@@ -66,6 +67,7 @@ public class Http {
6667
}
6768
throw error;
6869
}
70+
CookieManager.getInstance().setAcceptCookie(true);
6971
OkHttpClient.Builder httpclientBuilder = new OkHttpClient.Builder();
7072
// Default is 10, extend it a bit for slow mobile connections.
7173
httpclientBuilder.connectTimeout(15, TimeUnit.SECONDS);
@@ -93,15 +95,15 @@ public class Http {
9395
return Dns.SYSTEM.lookup(s);
9496
};
9597
httpclientBuilder.dns(dns);
96-
httpclientBuilder.cookieJar(new CDNCookieJar());
98+
httpclientBuilder.cookieJar(new CDNCookieJar(false));
9799
dns = new DnsOverHttps.Builder().client(httpclientBuilder.build()).url(
98100
Objects.requireNonNull(HttpUrl.parse("https://cloudflare-dns.com/dns-query")))
99101
.bootstrapDnsHosts(cloudflareBootstrap).resolvePrivateAddresses(true).build();
100102
} catch (UnknownHostException|RuntimeException e) {
101103
Log.e(TAG, "Failed to init DoH", e);
102104
}
103105
httpclientBuilder.cookieJar(CookieJar.NO_COOKIES);
104-
final String androidacyUA = // User-Agent format was agreed on telegram
106+
androidacyUA = // User-Agent format was agreed on telegram
105107
"Mozilla/5.0 (Linux; Android " + Build.VERSION.RELEASE + "; " + Build.DEVICE +")" +
106108
" AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36"
107109
+ " FoxMmm/" + BuildConfig.VERSION_CODE;
@@ -125,11 +127,11 @@ public class Http {
125127
"camo.githubusercontent.com", "user-images.githubusercontent.com",
126128
"cdn.jsdelivr.net", "img.shields.io", "magisk-modules-repo.github.io",
127129
"www.androidacy.com", "api.androidacy.com"));
130+
httpclientBuilder.cookieJar(new CDNCookieJar(true));
128131
httpClient = httpclientBuilder.build();
129132
httpclientBuilder.cache(new Cache(
130133
new File(mainApplication.getCacheDir(), "http_cache"),
131134
16L * 1024L * 1024L)); // 16Mib of cache
132-
httpclientBuilder.cookieJar(new CDNCookieJar());
133135
httpClientWithCache = httpclientBuilder.build();
134136
Log.i(TAG, "Initialized Http successfully!");
135137
}
@@ -208,6 +210,10 @@ public static void cleanDnsCache() {
208210
}
209211
}
210212

213+
public static String getAndroidacyUA() {
214+
return androidacyUA;
215+
}
216+
211217
/**
212218
* Cookie jar that allow CDN cookies, reset on app relaunch
213219
* Note: An argument can be made that it allow tracking but
@@ -219,11 +225,21 @@ public static void cleanDnsCache() {
219225
* */
220226
private static class CDNCookieJar implements CookieJar {
221227
private final HashMap<String, Cookie> cookieMap = new HashMap<>();
228+
private final boolean androidacySupport;
229+
230+
private CDNCookieJar(boolean androidacySupport) {
231+
this.androidacySupport = androidacySupport;
232+
}
222233

223234
@NonNull
224235
@Override
225236
public List<Cookie> loadForRequest(@NonNull HttpUrl httpUrl) {
226237
if (!httpUrl.isHttps()) return Collections.emptyList();
238+
if (this.androidacySupport && httpUrl.host().endsWith(".androidacy.com")) {
239+
String cookies = CookieManager.getInstance().getCookie(httpUrl.uri().toString());
240+
if (cookies == null || cookies.isEmpty()) return Collections.emptyList();
241+
242+
}
227243
Cookie cookies = cookieMap.get(httpUrl.url().getHost());
228244
return cookies == null || cookies.expiresAt() < System.currentTimeMillis() ?
229245
Collections.emptyList() : Collections.singletonList(cookies);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
android:layout_width="match_parent"
4+
android:layout_height="match_parent">
5+
<WebView
6+
android:layout_width="match_parent"
7+
android:layout_height="match_parent"
8+
android:id="@+id/webView" />
9+
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)