Add RedirectionController to BaseWebView

This commit is contained in:
Grigorii 2022-12-26 14:12:51 +04:00
parent 52be4071a4
commit f656676c12
3 changed files with 52 additions and 5 deletions

View File

@ -16,6 +16,7 @@ import ru.touchin.extensions.setOnRippleClickListener
import ru.touchin.roboswag.views.widget.Switcher
import ru.touchin.roboswag.webview.R
import ru.touchin.roboswag.webview.databinding.BaseWebViewBinding
import ru.touchin.roboswag.webview.web_view.redirection.RedirectionController
open class BaseWebView @JvmOverloads constructor(
context: Context,
@ -42,7 +43,7 @@ open class BaseWebView @JvmOverloads constructor(
field = value
}
var isRedirectEnable = false
var redirectionController = RedirectionController()
/**
* If you need to do some action on url click inside WebView, just assign this parameter and disable isRedirectEnable
@ -105,7 +106,8 @@ open class BaseWebView @JvmOverloads constructor(
}
}
override fun onOverrideUrlLoading(url: String?): Boolean = isRedirectEnable
override fun onOverrideUrlLoading(url: String?): Boolean =
redirectionController.shouldRedirectToUrl(url)
override fun onPageCookiesLoaded(cookies: Map<String, String>?) {
onCookieLoaded?.invoke(cookies)
@ -115,7 +117,7 @@ open class BaseWebView @JvmOverloads constructor(
actionOnRedirect?.invoke(url, webView)
}
fun setBaseWebViewClient(isSSlPinningEnable: Boolean = false) {
fun setBaseWebViewClient(isSSlPinningEnable: Boolean = true) {
binding.webView.webViewClient = BaseWebViewClient(this, isSSlPinningEnable)
binding.webView.webChromeClient = BaseChromeWebViewClient(onJsConfirm, onJsAlert, onJsPrompt, onJsError)
}

View File

@ -12,7 +12,10 @@ import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.core.os.postDelayed
open class BaseWebViewClient(private val callback: WebViewCallback, private val isSslPinningEnable: Boolean) : WebViewClient() {
open class BaseWebViewClient(
private val callback: WebViewCallback,
private val isSslPinningEnable: Boolean = true
) : WebViewClient() {
companion object {
private const val WEB_VIEW_TIMEOUT_MS = 30 * 1000L // 30 sec
@ -54,7 +57,8 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val
pageFinished()
}
override fun shouldOverrideUrlLoading(view: WebView, url: String?): Boolean {
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
val url = request.url.toString()
return if (!callback.onOverrideUrlLoading(url) && view.originalUrl != null) {
callback.actionOnRedirectInsideWebView(webView = view, url = url)
true

View File

@ -0,0 +1,41 @@
package ru.touchin.roboswag.webview.web_view.redirection
import ru.touchin.roboswag.webview.web_view.BaseWebView
import java.net.URL
/**
* Set [RedirectionController] to [BaseWebView] to handle url redirections
*
* By default all redirections are dismissed. For example:
*
* baseWebView.redirectionController = RedirectionController(
* hosts = listOf("www.petshop.ru"),
* paths = listOf("catalog")
* )
*/
class RedirectionController(
private val regex: List<Regex>? = null,
private val hosts: List<String>? = null,
private val paths: List<String>? = null,
private val queries: List<String>? = null,
private val checkCondition: ((url: String) -> Boolean)? = null
) {
fun shouldRedirectToUrl(rawUrl: String?): Boolean {
if (rawUrl == null) return false
if (checkCondition != null) return checkCondition.invoke(rawUrl)
val url = URL(rawUrl)
if (!regex.isNullOrEmpty()) return regex.any { rawUrl.matches(it) }
if (!queries.isNullOrEmpty()) return queries.any { it in url.query }
if (!paths.isNullOrEmpty()) return paths.any { it in url.path }
if (!hosts.isNullOrEmpty()) return hosts.any { it == url.host }
return false
}
}