diff --git a/app/build.gradle b/app/build.gradle index 709700cd5..d7b5d00d8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -139,7 +139,6 @@ dependencies { implementation 'androidx.preference:preference:1.1.1' implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha05' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.2.0-alpha01' - implementation 'androidx.webkit:webkit:1.3.0-rc01' final lifecycle_version = '2.3.0-alpha06' implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" diff --git a/app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt b/app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt index 02d5010bd..d517a9e4c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/network/CloudflareInterceptor.kt @@ -2,18 +2,16 @@ package eu.kanade.tachiyomi.network import android.annotation.SuppressLint import android.content.Context +import android.os.Build import android.os.Handler import android.os.Looper -import android.webkit.WebResourceRequest -import android.webkit.WebResourceResponse import android.webkit.WebSettings import android.webkit.WebView import android.widget.Toast -import androidx.webkit.WebViewClientCompat -import androidx.webkit.WebViewFeature import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.util.lang.launchUI +import eu.kanade.tachiyomi.util.system.WebViewClientCompat import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.isOutdated import eu.kanade.tachiyomi.util.system.setDefaultSettings @@ -116,7 +114,7 @@ class CloudflareInterceptor(private val context: Context) : Interceptor { } // HTTP error codes are only received since M - if (WebViewFeature.isFeatureSupported(WebViewFeature.RECEIVE_WEB_RESOURCE_ERROR) && + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && url == origRequestUrl && !challengeFound ) { // The first request didn't return the challenge, abort. @@ -124,13 +122,15 @@ class CloudflareInterceptor(private val context: Context) : Interceptor { } } - override fun onReceivedHttpError( + override fun onReceivedErrorCompat( view: WebView, - request: WebResourceRequest, - errorResponse: WebResourceResponse + errorCode: Int, + description: String?, + failingUrl: String, + isMainFrame: Boolean ) { - if (request.isForMainFrame) { - if (errorResponse.statusCode == 503) { + if (isMainFrame) { + if (errorCode == 503) { // Found the Cloudflare challenge page. challengeFound = true } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt index 79fed84c3..2eaed5bd6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/webview/WebViewActivity.kt @@ -9,19 +9,18 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.webkit.WebChromeClient -import android.webkit.WebResourceRequest import android.webkit.WebView import android.widget.Toast import androidx.core.graphics.ColorUtils import androidx.core.view.isInvisible import androidx.core.view.isVisible -import androidx.webkit.WebViewClientCompat import eu.kanade.tachiyomi.BuildConfig import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.databinding.WebviewActivityBinding import eu.kanade.tachiyomi.source.SourceManager import eu.kanade.tachiyomi.source.online.HttpSource import eu.kanade.tachiyomi.ui.base.activity.BaseActivity +import eu.kanade.tachiyomi.util.system.WebViewClientCompat import eu.kanade.tachiyomi.util.system.WebViewUtil import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.openInBrowser @@ -100,8 +99,8 @@ class WebViewActivity : BaseActivity() { } binding.webview.webViewClient = object : WebViewClientCompat() { - override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { - view.loadUrl(request.url.toString()) + override fun shouldOverrideUrlCompat(view: WebView, url: String): Boolean { + view.loadUrl(url) return true } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt new file mode 100644 index 000000000..d32cc1141 --- /dev/null +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/WebViewClientCompat.kt @@ -0,0 +1,91 @@ +package eu.kanade.tachiyomi.util.system + +import android.annotation.TargetApi +import android.os.Build +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse +import android.webkit.WebView +import android.webkit.WebViewClient + +@Suppress("OverridingDeprecatedMember") +abstract class WebViewClientCompat : WebViewClient() { + + open fun shouldOverrideUrlCompat(view: WebView, url: String): Boolean { + return false + } + + open fun shouldInterceptRequestCompat(view: WebView, url: String): WebResourceResponse? { + return null + } + + open fun onReceivedErrorCompat( + view: WebView, + errorCode: Int, + description: String?, + failingUrl: String, + isMainFrame: Boolean + ) { + } + + @TargetApi(Build.VERSION_CODES.N) + final override fun shouldOverrideUrlLoading( + view: WebView, + request: WebResourceRequest + ): Boolean { + return shouldOverrideUrlCompat(view, request.url.toString()) + } + + final override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean { + return shouldOverrideUrlCompat(view, url) + } + + final override fun shouldInterceptRequest( + view: WebView, + request: WebResourceRequest + ): WebResourceResponse? { + return shouldInterceptRequestCompat(view, request.url.toString()) + } + + final override fun shouldInterceptRequest( + view: WebView, + url: String + ): WebResourceResponse? { + return shouldInterceptRequestCompat(view, url) + } + + @TargetApi(Build.VERSION_CODES.M) + final override fun onReceivedError( + view: WebView, + request: WebResourceRequest, + error: WebResourceError + ) { + onReceivedErrorCompat( + view, error.errorCode, error.description?.toString(), + request.url.toString(), request.isForMainFrame + ) + } + + final override fun onReceivedError( + view: WebView, + errorCode: Int, + description: String?, + failingUrl: String + ) { + onReceivedErrorCompat(view, errorCode, description, failingUrl, failingUrl == view.url) + } + + @TargetApi(Build.VERSION_CODES.M) + final override fun onReceivedHttpError( + view: WebView, + request: WebResourceRequest, + error: WebResourceResponse + ) { + onReceivedErrorCompat( + view, error.statusCode, error.reasonPhrase, + request.url + .toString(), + request.isForMainFrame + ) + } +}