From df8088879adddea290d946c71c714c1e528d6e64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Mon, 24 May 2021 17:05:31 +0200 Subject: [PATCH 1/9] fix webview crashes fix crash webview when url is empty or invalid --- .../roboswag/webview/web_view/BaseWebView.kt | 4 +-- .../webview/web_view/BaseWebViewClient.kt | 25 ++++++++----------- .../webview/web_view/WebViewCallback.kt | 2 +- 3 files changed, 14 insertions(+), 17 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 8716804..aa38d3d 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,7 +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 onCookieLoaded: ((cookies: Map?) -> Unit)? = null var onJsConfirm: (() -> Unit)? = null var onJsAlert: (() -> Unit)? = null @@ -101,7 +101,7 @@ open class BaseWebView @JvmOverloads constructor( override fun onOverrideUrlLoading(url: String?): Boolean = isRedirectEnable - override fun onPageCookiesLoaded(cookies: Map) { + override fun onPageCookiesLoaded(cookies: Map?) { onCookieLoaded?.invoke(cookies) } 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..c683c1b 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,12 +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 -import android.webkit.WebView -import android.webkit.WebViewClient +import android.webkit.* import androidx.core.os.postDelayed open class BaseWebViewClient(private val callback: WebViewCallback, private val isSslPinningEnable: Boolean) : WebViewClient() { @@ -41,7 +36,9 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val override fun onPageFinished(view: WebView, url: String) { super.onPageFinished(view, url) isTimeout = false - callback.onPageCookiesLoaded(CookieManager.getInstance().getCookie(url).processCookies()) + if (!isError) { + callback.onPageCookiesLoaded(CookieManager.getInstance().getCookie(url).processCookies()) + } pageFinished() } @@ -60,7 +57,7 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val } override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { - if (!(error.errorCode == -10 && "about:blank" == request.url.toString())) { + if (!(error.errorCode == -10 && "about:blank" == request.url.toString()) || request.url.toString().isBlank()) { isError = true } pageFinished() @@ -70,13 +67,13 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val callback.onStateChanged(if (isError) WebViewLoadingState.ERROR else WebViewLoadingState.LOADED) } - private fun String.processCookies(): Map { + private fun String?.processCookies(): Map { val cookiesMap = mutableMapOf() - this.split(";") - .forEach { cookie -> - val splittedCookie = cookie.trim().split("=") - cookiesMap[splittedCookie.first()] = splittedCookie.last() - } + this?.split(";") + ?.forEach { cookie -> + val splittedCookie = cookie.trim().split("=") + cookiesMap[splittedCookie.first()] = splittedCookie.last() + } return cookiesMap } 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 59ddc11..299221d 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 @@ -6,6 +6,6 @@ interface WebViewCallback { fun onOverrideUrlLoading(url: String?): Boolean - fun onPageCookiesLoaded(cookies: Map) + fun onPageCookiesLoaded(cookies: Map?) } From dc0e6d63cf2ac5d37007a2252f2cecdcebb8e5d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Mon, 24 May 2021 21:21:11 +0200 Subject: [PATCH 2/9] fix webview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - фикс пропадающей ошибки об отстутствии интернета (вместо неё появлялся пустой error_layout) - фикс скролла + увеличение производительности --- .../touchin/roboswag/webview/web_view/BaseWebView.kt | 4 +++- .../roboswag/webview/web_view/BaseWebViewClient.kt | 12 ++++++++++-- 2 files changed, 13 insertions(+), 3 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 aa38d3d..a413203 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 @@ -128,12 +128,14 @@ open class BaseWebView @JvmOverloads constructor( open fun setWebViewPreferences() { binding.webView.apply { scrollBarStyle = View.SCROLLBARS_INSIDE_OVERLAY - setLayerType(View.LAYER_TYPE_SOFTWARE, null) + setLayerType(View.LAYER_TYPE_HARDWARE, null) with(settings) { loadsImagesAutomatically = true javaScriptEnabled = true domStorageEnabled = true loadWithOverviewMode = true + useWideViewPort = true + setInitialScale(1) } } } 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 c683c1b..98d21c2 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 @@ -33,12 +33,18 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val } } + /** + * onPageFinished calls always, but after onReceivedError + */ override fun onPageFinished(view: WebView, url: String) { super.onPageFinished(view, url) isTimeout = false if (!isError) { callback.onPageCookiesLoaded(CookieManager.getInstance().getCookie(url).processCookies()) } + if (url == "about:blank") { + isError = true + } pageFinished() } @@ -56,11 +62,13 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val } } + /** + * onReceivedError don't calls when url is "about:blank" (url string isBlank) + */ override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { - if (!(error.errorCode == -10 && "about:blank" == request.url.toString()) || request.url.toString().isBlank()) { + if (error.errorCode != -10) { isError = true } - pageFinished() } private fun pageFinished() { From 18bdc27d595f19cee17700798766362ee2b0a58c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Tue, 25 May 2021 18:22:44 +0200 Subject: [PATCH 3/9] fix commen, add description --- .../ru/touchin/roboswag/webview/web_view/BaseWebView.kt | 6 ++++++ .../touchin/roboswag/webview/web_view/BaseWebViewClient.kt | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) 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 a413203..f81fa32 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 @@ -124,6 +124,12 @@ open class BaseWebView @JvmOverloads constructor( binding.webView.onWebViewDisplayedContent = action } + /** + * loadWithOverviewMode loads the WebView completely zoomed out + * useWideViewPort sets page size to fit screen + * setInitialScale(1) prevents horizontal scrolling when + * page has horizontal paddings + */ @SuppressLint("SetJavaScriptEnabled") open fun setWebViewPreferences() { binding.webView.apply { 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 98d21c2..51d886b 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 @@ -63,7 +63,7 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val } /** - * onReceivedError don't calls when url is "about:blank" (url string isBlank) + * onReceivedError isn't called when url is "about:blank" (url string isBlank) */ override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { if (error.errorCode != -10) { From f5712a3de087054e391b2ba50eed48067fc690b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Tue, 25 May 2021 20:44:26 +0200 Subject: [PATCH 4/9] fix loadUrl method when url is null MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Когда ссылка null, она становится пустой строкой, тогда в onPageFinished опрелеляется как "about:blank" и отобразится errorLayout, иначе попадает в бесконечную загрузку --- .../ru/touchin/roboswag/webview/web_view/BaseWebView.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 f81fa32..968aa1c 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 @@ -112,8 +112,12 @@ open class BaseWebView @JvmOverloads constructor( fun getWebView() = binding.webView + /** + * if url is null it changes to empty string + * to prevent infinite LOADING state + */ fun loadUrl(url: String?) { - binding.webView.loadUrl(url) + binding.webView.loadUrl(url ?: String()) } fun setState(newState: WebViewLoadingState) { From 0923e6110e80332d7d6b89b2d59c4a6b735715be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Wed, 26 May 2021 01:43:43 +0200 Subject: [PATCH 5/9] add no_internet error code check --- .../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 51d886b..64eb295 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 @@ -66,7 +66,7 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val * onReceivedError isn't called when url is "about:blank" (url string isBlank) */ override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { - if (error.errorCode != -10) { + if (error.errorCode != -10 || error.errorCode == -2) { isError = true } } From 9894630cc5d553b1502a6ca915ae82630219cc47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Wed, 26 May 2021 10:54:28 +0200 Subject: [PATCH 6/9] change new string to empty string --- .../java/ru/touchin/roboswag/webview/web_view/BaseWebView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 968aa1c..800b442 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 @@ -117,7 +117,7 @@ open class BaseWebView @JvmOverloads constructor( * to prevent infinite LOADING state */ fun loadUrl(url: String?) { - binding.webView.loadUrl(url ?: String()) + binding.webView.loadUrl(url ?: "") } fun setState(newState: WebViewLoadingState) { From 430a4e4ae8f46ec30a2c33ef23c3d3d17bed0ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Wed, 26 May 2021 11:52:14 +0200 Subject: [PATCH 7/9] fix comment and check url --- .../webview/web_view/BaseWebViewClient.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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 64eb295..f0d62a0 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,7 +4,12 @@ import android.graphics.Bitmap import android.net.http.SslError import android.os.Handler import android.os.Looper -import android.webkit.* +import android.webkit.CookieManager +import android.webkit.SslErrorHandler +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +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() { @@ -34,17 +39,18 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val } /** - * onPageFinished calls always, but after onReceivedError + * onPageFinished вызывается всегда после onReceivedError, + * кроме случая, когда в кэше есть страница для ошибки -2 и сначала вызывается onReceivedError */ override fun onPageFinished(view: WebView, url: String) { super.onPageFinished(view, url) isTimeout = false - if (!isError) { - callback.onPageCookiesLoaded(CookieManager.getInstance().getCookie(url).processCookies()) - } if (url == "about:blank") { isError = true } + if (!isError) { + callback.onPageCookiesLoaded(CookieManager.getInstance().getCookie(url).processCookies()) + } pageFinished() } From b28840df8759547a7c9b14413a36778b32ee51b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Wed, 26 May 2021 14:58:17 +0200 Subject: [PATCH 8/9] fix comment and onReceivedError useless check error code --- .../webview/web_view/BaseWebViewClient.kt | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) 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 f0d62a0..5e5f7a2 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,12 +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 -import android.webkit.WebView -import android.webkit.WebViewClient +import android.webkit.* import androidx.core.os.postDelayed open class BaseWebViewClient(private val callback: WebViewCallback, private val isSslPinningEnable: Boolean) : WebViewClient() { @@ -39,8 +34,8 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val } /** - * onPageFinished вызывается всегда после onReceivedError, - * кроме случая, когда в кэше есть страница для ошибки -2 и сначала вызывается onReceivedError + * onPageFinished is always called after onReceivedError, + * except when there is a error page in the cache and onReceivedError is called first */ override fun onPageFinished(view: WebView, url: String) { super.onPageFinished(view, url) @@ -72,9 +67,7 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val * onReceivedError isn't called when url is "about:blank" (url string isBlank) */ override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { - if (error.errorCode != -10 || error.errorCode == -2) { - isError = true - } + isError = true } private fun pageFinished() { From 88c7eb35d822da632a4c8bb5f0466e8b23a5eb6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=BA=D0=B2=D0=B0=D0=BB=D1=8C=D0=B4=20?= =?UTF-8?q?=D0=94=D1=8D=D0=BD=D0=B8=D1=81?= Date: Wed, 26 May 2021 14:59:39 +0200 Subject: [PATCH 9/9] fix imports --- .../touchin/roboswag/webview/web_view/BaseWebViewClient.kt | 7 ++++++- 1 file changed, 6 insertions(+), 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 5e5f7a2..06f79da 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,7 +4,12 @@ import android.graphics.Bitmap import android.net.http.SslError import android.os.Handler import android.os.Looper -import android.webkit.* +import android.webkit.CookieManager +import android.webkit.SslErrorHandler +import android.webkit.WebResourceError +import android.webkit.WebResourceRequest +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() {