diff --git a/app/src/main/java/org/koitharu/kotatsu/browser/BrowserActivity.kt b/app/src/main/java/org/koitharu/kotatsu/browser/BrowserActivity.kt index 991a86d8c..55f4e193b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/browser/BrowserActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/browser/BrowserActivity.kt @@ -15,6 +15,7 @@ import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseActivity import org.koitharu.kotatsu.core.network.CommonHeadersInterceptor import org.koitharu.kotatsu.databinding.ActivityBrowserBinding +import org.koitharu.kotatsu.utils.ext.catchingWebViewUnavailability import com.google.android.material.R as materialR @SuppressLint("SetJavaScriptEnabled") @@ -24,7 +25,9 @@ class BrowserActivity : BaseActivity(), BrowserCallback override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(ActivityBrowserBinding.inflate(layoutInflater)) + if (!catchingWebViewUnavailability { setContentView(ActivityBrowserBinding.inflate(layoutInflater)) }) { + return + } supportActionBar?.run { setDisplayHomeAsUpEnabled(true) setHomeAsUpIndicator(materialR.drawable.abc_ic_clear_material) diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt b/app/src/main/java/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt index 8c424eccd..b0f0ca321 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/sources/auth/SourceAuthActivity.kt @@ -25,6 +25,7 @@ import org.koitharu.kotatsu.databinding.ActivityBrowserBinding import org.koitharu.kotatsu.parsers.MangaParserAuthProvider import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.utils.TaggedActivityResult +import org.koitharu.kotatsu.utils.ext.catchingWebViewUnavailability import org.koitharu.kotatsu.utils.ext.getSerializableExtraCompat import javax.inject.Inject import com.google.android.material.R as materialR @@ -41,7 +42,9 @@ class SourceAuthActivity : BaseActivity(), BrowserCallba @SuppressLint("SetJavaScriptEnabled") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(ActivityBrowserBinding.inflate(layoutInflater)) + if (!catchingWebViewUnavailability { setContentView(ActivityBrowserBinding.inflate(layoutInflater)) }) { + return + } val source = intent?.getSerializableExtraCompat(EXTRA_SOURCE) as? MangaSource if (source == null) { finishAfterTransition() diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt index 966338125..7a1872739 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/AndroidExt.kt @@ -19,6 +19,7 @@ import android.provider.Settings import android.view.View import android.view.ViewPropertyAnimator import android.view.Window +import android.widget.Toast import androidx.activity.result.ActivityResultLauncher import androidx.annotation.IntegerRes import androidx.core.app.ActivityOptionsCompat @@ -170,3 +171,18 @@ fun Context.findActivity(): Activity? = when (this) { is ContextWrapper -> baseContext.findActivity() else -> null } + +inline fun Activity.catchingWebViewUnavailability(block: () -> Unit): Boolean { + return try { + block() + true + } catch (e: Exception) { + if (e.isWebViewUnavailable()) { + Toast.makeText(this, R.string.web_view_unavailable, Toast.LENGTH_LONG).show() + finishAfterTransition() + false + } else { + throw e + } + } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt index 7a6d95240..c205ca939 100644 --- a/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt +++ b/app/src/main/java/org/koitharu/kotatsu/utils/ext/ThrowableExt.kt @@ -2,6 +2,7 @@ package org.koitharu.kotatsu.utils.ext import android.content.ActivityNotFoundException import android.content.res.Resources +import android.util.AndroidRuntimeException import androidx.collection.arraySetOf import kotlinx.coroutines.CancellationException import okio.FileNotFoundException @@ -94,3 +95,8 @@ inline fun runCatchingCancellable(block: () -> R): Result { Result.failure(e) } } + +fun Throwable.isWebViewUnavailable(): Boolean { + return (this is AndroidRuntimeException && message?.contains("WebView") == true) || + cause?.isWebViewUnavailable() == true +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d3af2b733..406703d2e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -415,4 +415,5 @@ Downloads have been cancelled Do you want to receive personalized manga suggestions? Translations + WebView not available: check if WebView provider is installed