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..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 @@ -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) } @@ -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 ?: "") } fun setState(newState: WebViewLoadingState) { @@ -124,16 +128,24 @@ 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 { 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 117806b..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 @@ -38,10 +38,19 @@ open class BaseWebViewClient(private val callback: WebViewCallback, private val } } + /** + * 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) isTimeout = false - callback.onPageCookiesLoaded(CookieManager.getInstance().getCookie(url).processCookies()) + if (url == "about:blank") { + isError = true + } + if (!isError) { + callback.onPageCookiesLoaded(CookieManager.getInstance().getCookie(url).processCookies()) + } pageFinished() } @@ -59,24 +68,24 @@ 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 && "about:blank" == request.url.toString())) { - isError = true - } - pageFinished() + isError = true } private fun pageFinished() { 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?) }