Add RedirectionController to BaseWebView
This commit is contained in:
parent
52be4071a4
commit
f656676c12
|
|
@ -16,6 +16,7 @@ import ru.touchin.extensions.setOnRippleClickListener
|
||||||
import ru.touchin.roboswag.views.widget.Switcher
|
import ru.touchin.roboswag.views.widget.Switcher
|
||||||
import ru.touchin.roboswag.webview.R
|
import ru.touchin.roboswag.webview.R
|
||||||
import ru.touchin.roboswag.webview.databinding.BaseWebViewBinding
|
import ru.touchin.roboswag.webview.databinding.BaseWebViewBinding
|
||||||
|
import ru.touchin.roboswag.webview.web_view.redirection.RedirectionController
|
||||||
|
|
||||||
open class BaseWebView @JvmOverloads constructor(
|
open class BaseWebView @JvmOverloads constructor(
|
||||||
context: Context,
|
context: Context,
|
||||||
|
|
@ -42,7 +43,7 @@ open class BaseWebView @JvmOverloads constructor(
|
||||||
field = value
|
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
|
* 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>?) {
|
override fun onPageCookiesLoaded(cookies: Map<String, String>?) {
|
||||||
onCookieLoaded?.invoke(cookies)
|
onCookieLoaded?.invoke(cookies)
|
||||||
|
|
@ -115,7 +117,7 @@ open class BaseWebView @JvmOverloads constructor(
|
||||||
actionOnRedirect?.invoke(url, webView)
|
actionOnRedirect?.invoke(url, webView)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setBaseWebViewClient(isSSlPinningEnable: Boolean = false) {
|
fun setBaseWebViewClient(isSSlPinningEnable: Boolean = true) {
|
||||||
binding.webView.webViewClient = BaseWebViewClient(this, isSSlPinningEnable)
|
binding.webView.webViewClient = BaseWebViewClient(this, isSSlPinningEnable)
|
||||||
binding.webView.webChromeClient = BaseChromeWebViewClient(onJsConfirm, onJsAlert, onJsPrompt, onJsError)
|
binding.webView.webChromeClient = BaseChromeWebViewClient(onJsConfirm, onJsAlert, onJsPrompt, onJsError)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,10 @@ import android.webkit.WebView
|
||||||
import android.webkit.WebViewClient
|
import android.webkit.WebViewClient
|
||||||
import androidx.core.os.postDelayed
|
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 {
|
companion object {
|
||||||
private const val WEB_VIEW_TIMEOUT_MS = 30 * 1000L // 30 sec
|
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()
|
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) {
|
return if (!callback.onOverrideUrlLoading(url) && view.originalUrl != null) {
|
||||||
callback.actionOnRedirectInsideWebView(webView = view, url = url)
|
callback.actionOnRedirectInsideWebView(webView = view, url = url)
|
||||||
true
|
true
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue