From 82675846859b69960320eeeaa45de1b012476206 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sun, 18 Oct 2020 14:36:00 +0300 Subject: [PATCH 1/3] Added ssl processing, redirect, cookies processing --- .../roboswag/webview/web_view/BaseWebView.kt | 24 ++++++++++------- .../webview/web_view/BaseWebViewClient.kt | 26 +++++++++++++++++-- .../webview/web_view/WebViewCallback.kt | 4 +++ 3 files changed, 43 insertions(+), 11 deletions(-) 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 4af2e00..8716804 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 @@ -27,6 +27,7 @@ open class BaseWebView @JvmOverloads constructor( var onWebViewLoaded: (() -> Unit)? = null var onWebViewRepeatButtonClicked: (() -> Unit)? = null var onWebViewScrolled: ((WebView, Int, Int) -> Unit)? = null + var onCookieLoaded: ((cookies: Map) -> Unit)? = null var onJsConfirm: (() -> Unit)? = null var onJsAlert: (() -> Unit)? = null @@ -40,6 +41,8 @@ open class BaseWebView @JvmOverloads constructor( field = value } + var isRedirectEnable = false + init { binding.pullToRefresh.isEnabled = isPullToRefreshEnable binding.apply { @@ -72,16 +75,13 @@ open class BaseWebView @JvmOverloads constructor( errorRepeatButton.setOnRippleClickListener { onWebViewRepeatButtonClicked?.invoke() } + webView.onScrollChanged = { scrollX, scrollY, _, _ -> + onWebViewScrolled?.invoke(binding.webView, scrollX, scrollY) + } + setWebViewPreferences() } } - init { - binding.webView.onScrollChanged = { scrollX, scrollY, _, _ -> - onWebViewScrolled?.invoke(binding.webView, scrollX, scrollY) - } - setWebViewPreferences() - } - override fun onStateChanged(newState: WebViewLoadingState) { when { newState == WebViewLoadingState.LOADED -> { @@ -99,8 +99,14 @@ open class BaseWebView @JvmOverloads constructor( } } - fun setBaseWebViewClient() { - binding.webView.webViewClient = BaseWebViewClient(this) + override fun onOverrideUrlLoading(url: String?): Boolean = isRedirectEnable + + override fun onPageCookiesLoaded(cookies: Map) { + onCookieLoaded?.invoke(cookies) + } + + fun setBaseWebViewClient(isSSlPinningEnable: Boolean = false) { + 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 e5d2d3f..117806b 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 @@ -4,6 +4,7 @@ import android.graphics.Bitmap import android.net.http.SslError import android.os.Handler import android.os.Looper +import android.webkit.CookieManager import android.webkit.SslErrorHandler import android.webkit.WebResourceError import android.webkit.WebResourceRequest @@ -11,7 +12,7 @@ import android.webkit.WebView import android.webkit.WebViewClient import androidx.core.os.postDelayed -open class BaseWebViewClient(private val callback: WebViewCallback) : WebViewClient() { +open class BaseWebViewClient(private val callback: WebViewCallback, private val isSslPinningEnable: Boolean) : WebViewClient() { companion object { private const val WEB_VIEW_TIMEOUT_MS = 30 * 1000L // 30 sec @@ -40,11 +41,22 @@ open class BaseWebViewClient(private val callback: WebViewCallback) : WebViewCli override fun onPageFinished(view: WebView, url: String) { super.onPageFinished(view, url) isTimeout = false + callback.onPageCookiesLoaded(CookieManager.getInstance().getCookie(url).processCookies()) pageFinished() } + override fun shouldOverrideUrlLoading(view: WebView, url: String?): Boolean { + return !callback.onOverrideUrlLoading(url) && view.originalUrl != null + } + override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) { - handler.proceed() + if (isSslPinningEnable) { + super.onReceivedSslError(view, handler, error) + isError = true + callback.onStateChanged(WebViewLoadingState.ERROR) + } else { + handler.proceed() + } } override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { @@ -58,6 +70,16 @@ open class BaseWebViewClient(private val callback: WebViewCallback) : WebViewCli callback.onStateChanged(if (isError) WebViewLoadingState.ERROR else WebViewLoadingState.LOADED) } + private fun String.processCookies(): Map { + val cookiesMap = mutableMapOf() + this.split(";") + .forEach { cookie -> + val splittedCookie = cookie.trim().split("=") + cookiesMap[splittedCookie.first()] = splittedCookie.last() + } + return cookiesMap + } + } enum class WebViewLoadingState { diff --git a/webview/src/main/java/ru/touchin/roboswag/webview/web_view/WebViewCallback.kt b/webview/src/main/java/ru/touchin/roboswag/webview/web_view/WebViewCallback.kt index 38e6c4e..59ddc11 100644 --- a/webview/src/main/java/ru/touchin/roboswag/webview/web_view/WebViewCallback.kt +++ b/webview/src/main/java/ru/touchin/roboswag/webview/web_view/WebViewCallback.kt @@ -4,4 +4,8 @@ interface WebViewCallback { fun onStateChanged(newState: WebViewLoadingState) + fun onOverrideUrlLoading(url: String?): Boolean + + fun onPageCookiesLoaded(cookies: Map) + } From 45a4424679a3df663e9a4ef3161e9a0904cd0e7e Mon Sep 17 00:00:00 2001 From: Vladimir Date: Sun, 18 Oct 2020 16:50:51 +0300 Subject: [PATCH 2/3] fix --- .../ru/touchin/roboswag/webview/web_view/BaseWebViewClient.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 117806b..c50cef0 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 @@ -75,7 +75,7 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val this.split(";") .forEach { cookie -> val splittedCookie = cookie.trim().split("=") - cookiesMap[splittedCookie.first()] = splittedCookie.last() + cookiesMap[splittedCookie.first()] = if (splittedCookie.size != 3) "" else splittedCookie.last() } return cookiesMap } From b9c861878270c05bf16734545e3106445c8f6531 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 19 Oct 2020 11:15:03 +0300 Subject: [PATCH 3/3] fixed review --- .../ru/touchin/roboswag/webview/web_view/BaseWebViewClient.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c50cef0..117806b 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 @@ -75,7 +75,7 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val this.split(";") .forEach { cookie -> val splittedCookie = cookie.trim().split("=") - cookiesMap[splittedCookie.first()] = if (splittedCookie.size != 3) "" else splittedCookie.last() + cookiesMap[splittedCookie.first()] = splittedCookie.last() } return cookiesMap }