From 39e36f957de6fa83583c9318cf30d4f9ef4a88c0 Mon Sep 17 00:00:00 2001
From: arkon <eugcheung94@gmail.com>
Date: Sat, 2 May 2020 19:03:48 -0400
Subject: [PATCH] More extreme method for enforcing WebView availability

(cherry picked from commit 6cd34614f607c51a62eed68d98996990969e5909)

# Conflicts:
#	app/src/main/java/eu/kanade/tachiyomi/App.kt
---
 app/src/main/AndroidManifest.xml              |  5 ++++
 app/src/main/java/eu/kanade/tachiyomi/App.kt  | 10 +++++++
 .../tachiyomi/ui/main/ForceCloseActivity.kt   | 28 +++++++++++++++++++
 .../kanade/tachiyomi/ui/main/MainActivity.kt  |  7 -----
 .../tachiyomi/util/system/WebViewUtil.kt      | 11 +++++++-
 5 files changed, 53 insertions(+), 8 deletions(-)
 create mode 100644 app/src/main/java/eu/kanade/tachiyomi/ui/main/ForceCloseActivity.kt

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index d53ca4c32..13f7fe83a 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -49,6 +49,11 @@
                 android:name="android.app.shortcuts"
                 android:resource="@xml/shortcuts" />
         </activity>
+        <activity
+            android:name=".ui.main.ForceCloseActivity"
+            android:clearTaskOnLaunch="true"
+            android:noHistory="true"
+            android:theme="@android:style/Theme.NoDisplay" />
         <activity
             android:name=".ui.main.DeepLinkActivity"
             android:launchMode="singleTask"
diff --git a/app/src/main/java/eu/kanade/tachiyomi/App.kt b/app/src/main/java/eu/kanade/tachiyomi/App.kt
index d8b1dd4af..e19610e76 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/App.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/App.kt
@@ -6,6 +6,7 @@ import android.content.res.Configuration
 import android.graphics.Color
 import android.os.Build
 import android.os.Environment
+import android.widget.Toast
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleObserver
 import androidx.lifecycle.OnLifecycleEvent
@@ -28,8 +29,11 @@ import com.ms_square.debugoverlay.DebugOverlay
 import com.ms_square.debugoverlay.modules.FpsModule
 import eu.kanade.tachiyomi.data.notification.Notifications
 import eu.kanade.tachiyomi.data.preference.PreferencesHelper
+import eu.kanade.tachiyomi.ui.main.ForceCloseActivity
 import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
 import eu.kanade.tachiyomi.util.system.LocaleHelper
+import eu.kanade.tachiyomi.util.system.WebViewUtil
+import eu.kanade.tachiyomi.util.system.toast
 import exh.debug.DebugToggles
 import exh.log.CrashlyticsPrinter
 import exh.log.EHDebugModeOverlay
@@ -57,6 +61,12 @@ open class App : Application(), LifecycleObserver {
 
         workaroundAndroid7BrokenSSL()
 
+        // Enforce WebView availability
+        if (!WebViewUtil.supportsWebView(this)) {
+            toast(R.string.information_webview_required, Toast.LENGTH_LONG)
+            ForceCloseActivity.closeApp(this)
+        }
+
         Injekt = InjektScope(DefaultRegistrar())
         Injekt.importModule(AppModule(this))
 
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/ForceCloseActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/ForceCloseActivity.kt
new file mode 100644
index 000000000..efcae017a
--- /dev/null
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/ForceCloseActivity.kt
@@ -0,0 +1,28 @@
+package eu.kanade.tachiyomi.ui.main
+
+import android.content.Context
+import android.content.Intent
+import android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+
+/**
+ * Activity that in conjunction with its configuration in the manifest allows for a way to
+ * "force close" the application from the main [App] class.
+ */
+class ForceCloseActivity : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        finish()
+    }
+
+    companion object {
+        fun closeApp(context: Context) {
+            val intent = Intent(context, ForceCloseActivity::class.java).apply {
+                addCategory(Intent.CATEGORY_HOME)
+                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
+            }
+            context.startActivity(intent)
+        }
+    }
+}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
index 6fe0e2dce..ce84822f5 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt
@@ -37,7 +37,6 @@ import eu.kanade.tachiyomi.ui.more.MoreController
 import eu.kanade.tachiyomi.ui.recent.history.HistoryController
 import eu.kanade.tachiyomi.ui.recent.updates.UpdatesController
 import eu.kanade.tachiyomi.util.lang.launchUI
-import eu.kanade.tachiyomi.util.system.WebViewUtil
 import eu.kanade.tachiyomi.util.system.toast
 import exh.EXHMigrations
 import exh.eh.EHentaiUpdateWorker
@@ -93,12 +92,6 @@ class MainActivity : BaseActivity<MainActivityBinding>() {
 
         binding = MainActivityBinding.inflate(layoutInflater)
 
-        // Enforce WebView availability
-        if (!WebViewUtil.supportsWebView(this)) {
-            toast(R.string.information_webview_required, Toast.LENGTH_LONG)
-            finishAndRemoveTask()
-        }
-
         // Do not let the launcher create a new activity http://stackoverflow.com/questions/16283079
         if (!isTaskRoot) {
             finish()
diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt
index 3eeb60bc3..6eaf6bc9f 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewUtil.kt
@@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.util.system
 
 import android.content.Context
 import android.content.pm.PackageManager
+import android.webkit.CookieManager
 import android.webkit.WebView
 
 object WebViewUtil {
@@ -9,9 +10,17 @@ object WebViewUtil {
         Regex(""".*Chrome/(\d+)\..*""")
     }
 
-    const val MINIMUM_WEBVIEW_VERSION = 79
+    const val MINIMUM_WEBVIEW_VERSION = 80
 
     fun supportsWebView(context: Context): Boolean {
+        try {
+            // May throw android.webkit.WebViewFactory$MissingWebViewPackageException if WebView
+            // is not installed
+            CookieManager.getInstance()
+        } catch (e: Exception) {
+            return false
+        }
+
         return context.packageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)
     }
 }