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.