From 0c1bf6f0b35f37717bbb97a2a016f7b310da3fa5 Mon Sep 17 00:00:00 2001
From: NekoInverter <7741672-NekoInverter@users.noreply.gitlab.com>
Date: Sun, 10 Jan 2021 19:32:08 +0800
Subject: [PATCH] Prevent crash on devices with bad webview
---
app/build.gradle | 1 +
.../preference/SignInRequiredPreference.java | 5 ++++
.../hippo/ehviewer/ui/scene/SignInScene.java | 5 ++++
.../main/java/com/hippo/util/WebViewUtil.java | 25 +++++++++++++++++++
app/src/main/res/values/strings.xml | 1 +
5 files changed, 37 insertions(+)
create mode 100644 app/src/main/java/com/hippo/util/WebViewUtil.java
diff --git a/app/build.gradle b/app/build.gradle
index 8eb823b4f..5830b7bde 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -93,6 +93,7 @@ dependencies {
implementation "androidx.fragment:fragment:1.3.0-rc01"
implementation "androidx.preference:preference:1.1.1"
implementation "androidx.recyclerview:recyclerview:1.2.0-beta01"
+ implementation 'androidx.webkit:webkit:1.4.0'
implementation 'com.google.android.material:material:1.3.0-beta01'
implementation 'com.getkeepsafe.relinker:relinker:1.4.1'
implementation 'com.getkeepsafe.taptargetview:taptargetview:1.13.0'
diff --git a/app/src/main/java/com/hippo/ehviewer/preference/SignInRequiredPreference.java b/app/src/main/java/com/hippo/ehviewer/preference/SignInRequiredPreference.java
index f916eb20b..9d55753bf 100644
--- a/app/src/main/java/com/hippo/ehviewer/preference/SignInRequiredPreference.java
+++ b/app/src/main/java/com/hippo/ehviewer/preference/SignInRequiredPreference.java
@@ -28,6 +28,7 @@ import com.hippo.ehviewer.client.EhCookieStore;
import com.hippo.ehviewer.client.EhUrl;
import com.hippo.ehviewer.ui.SettingsActivity;
import com.hippo.ehviewer.ui.scene.BaseScene;
+import com.hippo.util.WebViewUtil;
import okhttp3.HttpUrl;
@@ -58,6 +59,10 @@ public class SignInRequiredPreference extends Preference implements Preference.O
@Override
public boolean onPreferenceClick(Preference preference) {
+ if (!WebViewUtil.available(getContext())) {
+ mActivity.showTip(R.string.error_no_webview, BaseScene.LENGTH_SHORT);
+ return true;
+ }
EhCookieStore store = EhApplication.getEhCookieStore(getContext());
HttpUrl e = HttpUrl.get(EhUrl.HOST_E);
HttpUrl ex = HttpUrl.get(EhUrl.HOST_EX);
diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java
index 08f7d0646..69f3e637e 100644
--- a/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java
+++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/SignInScene.java
@@ -45,6 +45,7 @@ import com.hippo.ehviewer.ui.MainActivity;
import com.hippo.scene.Announcer;
import com.hippo.scene.SceneFragment;
import com.hippo.util.ExceptionUtils;
+import com.hippo.util.WebViewUtil;
import com.hippo.yorozuya.AssertUtils;
import com.hippo.yorozuya.IntIdGenerator;
import com.hippo.yorozuya.ViewUtils;
@@ -225,6 +226,10 @@ public final class SignInScene extends SolidScene implements EditText.OnEditorAc
} else if (mSignIn == v) {
signIn();
} else if (mSignInViaWebView == v) {
+ if (!WebViewUtil.available(getContext())) {
+ showTip(R.string.error_no_webview, BaseScene.LENGTH_SHORT);
+ return;
+ }
startScene(new Announcer(WebViewSignInScene.class).setRequestCode(this, REQUEST_CODE_WEBVIEW));
} else if (mSignInViaCookies == v) {
startScene(new Announcer(CookieSignInScene.class).setRequestCode(this, REQUEST_CODE_COOKIE));
diff --git a/app/src/main/java/com/hippo/util/WebViewUtil.java b/app/src/main/java/com/hippo/util/WebViewUtil.java
new file mode 100644
index 000000000..b080e502c
--- /dev/null
+++ b/app/src/main/java/com/hippo/util/WebViewUtil.java
@@ -0,0 +1,25 @@
+package com.hippo.util;
+
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.os.Build;
+import android.util.Log;
+
+import androidx.webkit.WebViewCompat;
+
+public class WebViewUtil {
+ private static final String TAG = "WebViewUtil";
+
+ public static boolean available(Context context) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
+ return false;
+ }
+ PackageInfo webViewPackageInfo = WebViewCompat.getCurrentWebViewPackage(context);
+ if (webViewPackageInfo == null) {
+ Log.d(TAG, "WebView not available");
+ return false;
+ }
+ Log.d(TAG, "WebView version: " + webViewPackageInfo.versionName);
+ return true;
+ }
+}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6ac99866f..444be2a77 100755
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -809,4 +809,5 @@
Memory cache cleaning completed
Add tag
Enter new tags, separated with comma
+ WebView is not available.