From f656676c12fca1ec71f62b253e8ef666ca2fbf7f Mon Sep 17 00:00:00 2001 From: Grigorii Date: Mon, 26 Dec 2022 14:12:51 +0400 Subject: [PATCH] Add RedirectionController to BaseWebView --- .../roboswag/webview/web_view/BaseWebView.kt | 8 ++-- .../webview/web_view/BaseWebViewClient.kt | 8 +++- .../redirection/RedirectionController.kt | 41 +++++++++++++++++++ 3 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 webview/src/main/java/ru/touchin/roboswag/webview/web_view/redirection/RedirectionController.kt diff --git a/webview/src/main/java/ru/touchin/roboswag/webview/web_view/BaseWebView.kt b/webview/src/main/java/ru/touchin/roboswag/webview/web_view/BaseWebView.kt index f9881f2..6f0af20 100644 --- a/webview/src/main/java/ru/touchin/roboswag/webview/web_view/BaseWebView.kt +++ b/webview/src/main/java/ru/touchin/roboswag/webview/web_view/BaseWebView.kt @@ -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?) { 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) } diff --git a/webview/src/main/java/ru/touchin/roboswag/webview/web_view/BaseWebViewClient.kt b/webview/src/main/java/ru/touchin/roboswag/webview/web_view/BaseWebViewClient.kt index 5c1e8a9..d47246d 100644 --- a/webview/src/main/java/ru/touchin/roboswag/webview/web_view/BaseWebViewClient.kt +++ b/webview/src/main/java/ru/touchin/roboswag/webview/web_view/BaseWebViewClient.kt @@ -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 diff --git a/webview/src/main/java/ru/touchin/roboswag/webview/web_view/redirection/RedirectionController.kt b/webview/src/main/java/ru/touchin/roboswag/webview/web_view/redirection/RedirectionController.kt new file mode 100644 index 0000000..951ca2d --- /dev/null +++ b/webview/src/main/java/ru/touchin/roboswag/webview/web_view/redirection/RedirectionController.kt @@ -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? = null, + private val hosts: List? = null, + private val paths: List? = null, + private val queries: List? = 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 + } +}