Improve Andoridacy WebView, progress on internal APIs.

pull/42/head
Fox2Code 2 years ago
parent 7839218bbb
commit 00ae269ae2

@ -71,10 +71,13 @@
android:theme="@style/Theme.MagiskModuleManager">
</activity>
<activity
android:name=".androidacy.AndoridacyActivity"
android:name=".androidacy.AndroidacyActivity"
android:parentActivityName=".MainActivity"
android:exported="false"
android:theme="@style/Theme.MagiskModuleManager">
<intent-filter>
<action android:name="${applicationId}.intent.action.OPEN_ANDROIDACY_INTERNAL" />
</intent-filter>
</activity>
<activity android:name="com.mikepenz.aboutlibraries.ui.LibsActivity"
tools:node="remove"/>

@ -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";

@ -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() {

@ -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());
}

@ -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;
}
}

@ -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,

@ -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<Cookie> 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<Cookie> 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<Cookie> cookieIterator = cookies.iterator();
Cookie cdnCookie = cookieMap.get(host);

@ -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)

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="@android:color/white"
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"/>
</vector>

@ -99,5 +99,11 @@
app:icon="@drawable/ic_baseline_info_24"
app:title="@string/show_licenses"
app:singleLineTitle="false" />
<!-- Only used in debug builds for debugging features -->
<Preference
app:key="pref_debug_button"
app:icon="@drawable/ic_baseline_bug_report_24"
app:isPreferenceVisible="false"
app:singleLineTitle="false" />
</PreferenceCategory>
</PreferenceScreen>
Loading…
Cancel
Save