Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions modules.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ include ':views'
include ':recyclerview-adapters'
include ':kotlin-extensions'
include ':templates'
include ':webview-delegate'

project(':utils').projectDir = new File(rootDir, 'utils')
project(':logging').projectDir = new File(rootDir, 'logging')
Expand All @@ -31,3 +32,4 @@ project(':views').projectDir = new File(rootDir, 'views')
project(':recyclerview-adapters').projectDir = new File(rootDir, 'recyclerview-adapters')
project(':kotlin-extensions').projectDir = new File(rootDir, 'kotlin-extensions')
project(':templates').projectDir = new File(rootDir, 'templates')
project(':webview-delegate').projectDir = new File(rootDir, 'webview-delegate')
1 change: 1 addition & 0 deletions webview-delegate/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
26 changes: 26 additions & 0 deletions webview-delegate/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import org.jetbrains.kotlin.config.KotlinCompilerVersion

plugins {
id("com.android.library")
kotlin("android")
}

val versions: Map<String, *> by rootProject.extra
android {
compileSdkVersion(versions["compileSdk"] as Int)

defaultConfig {
minSdkVersion(16)
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}

dependencies {
implementation(kotlin("stdlib", KotlinCompilerVersion.VERSION))
implementation("androidx.core:core-ktx:${versions["coreKtx"]}")
implementation("androidx.annotation:annotation:${versions["androidx"]}")
}
1 change: 1 addition & 0 deletions webview-delegate/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<manifest package="ru.touchin.roboswag.webview_delegate" />
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.touchin.roboswag.webview_delegate

enum class LoadingState {
LOADING,
ERROR,
LOADED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package ru.touchin.roboswag.webview_delegate

import android.annotation.TargetApi
import android.graphics.Bitmap
import android.net.http.SslError
import android.os.Build
import android.webkit.SslErrorHandler
import android.webkit.WebResourceError
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient

open class SimpleWebViewClient(private val callback: WebViewCallback) : WebViewClient() {

var isError = false

override fun onPageStarted(view: WebView, url: String, favicon: Bitmap?) {
super.onPageStarted(view, url, favicon)
isError = false
callback.onStateChanged(LoadingState.LOADING)
}

override fun onPageFinished(view: WebView, url: String) {
super.onPageFinished(view, url)
pageFinished(view)
}

override fun shouldOverrideUrlLoading(view: WebView, url: String?): Boolean {
val shouldOverride = callback.onOverrideUrlLoading(url)
if (!shouldOverride) {
view.loadUrl(url)
}
return shouldOverride
}

override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
return shouldOverrideUrlLoading(view, request.url.toString())
}

override fun onReceivedSslError(view: WebView, handler: SslErrorHandler, error: SslError) {
handler.proceed()
}

private fun pageFinished(view: WebView) {
callback.onStateChanged(if (isError) LoadingState.ERROR else LoadingState.LOADED)
callback.clearCacheAndData(view)
}

@TargetApi(Build.VERSION_CODES.M)
override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) {
onReceivedError(view, error.errorCode, error.description.toString(), request.url.toString())
}

override fun onReceivedError(view: WebView, errorCode: Int, description: String?, failingUrl: String) {
super.onReceivedError(view, errorCode, description, failingUrl)
if (!(errorCode == -10 && "about:blank" == failingUrl)) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Magic number

isError = true
}
pageFinished(view)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package ru.touchin.roboswag.webview_delegate

import android.content.pm.ApplicationInfo
import android.view.View
import android.webkit.WebView
import androidx.annotation.CallSuper
import androidx.core.view.isInvisible
import androidx.core.view.isVisible

open class SimpleWebViewDelegate(
protected val webView: WebView,
protected open val errorView: View,
protected open val loadingView: View
) : WebViewCallback {

init {
if (0 != webView.context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) {
WebView.setWebContentsDebuggingEnabled(true)
}
webView.webViewClient = getWebViewClient()

webView.scrollBarStyle = View.SCROLLBARS_INSIDE_OVERLAY
with(webView.settings) {
loadsImagesAutomatically = true
javaScriptEnabled = true
domStorageEnabled = true
useWideViewPort = true
loadWithOverviewMode = true
}
}

open fun getWebViewClient() = SimpleWebViewClient(this)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это не get, это create


open override fun clearCacheAndData(view: WebView) {
with(view) {
clearMatches()
clearFormData()
clearCache(true)
}
}

@CallSuper
open override fun onStateChanged(newState: LoadingState) {
when (newState) {
LoadingState.LOADED -> {
webView.isVisible = true
errorView.isVisible = false
loadingView.isVisible = false
}
LoadingState.LOADING -> {
webView.isInvisible = true
errorView.isVisible = false
loadingView.isVisible = true
}
LoadingState.ERROR -> {
webView.isInvisible = true
errorView.isVisible = true
loadingView.isVisible = false
}
}
}

open fun loadUrl(url: String?) {
webView.loadUrl(url)
}

open fun onBackPressed(): Boolean {
if (webView.canGoBack()) {
webView.goBack()
return true
}
return false
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.touchin.roboswag.webview_delegate

import android.webkit.WebView

interface WebViewCallback {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

onInterceptRequest и onStartPageLoading нигде не вызывается :(


fun onOverrideUrlLoading(url: String?): Boolean = false

fun onInterceptRequest(url: String) {}

fun onStartPageLoading(url: String) {}

fun clearCacheAndData(view: WebView)

fun onStateChanged(newState: LoadingState)

}