diff options
Diffstat (limited to 'app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt')
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt b/app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt new file mode 100644 index 00000000..e6e1f0e2 --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt @@ -0,0 +1,144 @@ +package com.pitchedapps.frost.views + +import android.animation.ValueAnimator +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.View +import android.view.animation.DecelerateInterpolator +import com.pitchedapps.frost.contracts.FrostContentContainer +import com.pitchedapps.frost.contracts.FrostContentCore +import com.pitchedapps.frost.contracts.FrostContentParent +import com.pitchedapps.frost.facebook.USER_AGENT_BASIC +import com.pitchedapps.frost.fragments.WebFragment +import com.pitchedapps.frost.utils.Prefs +import com.pitchedapps.frost.utils.frostDownload +import com.pitchedapps.frost.web.* + +/** + * Created by Allan Wang on 2017-05-29. + * + */ +class FrostWebView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 +) : NestedWebView(context, attrs, defStyleAttr), + FrostContentCore { + + override fun reload(animate: Boolean) { + parent.registerTransition(animate) + super.reload() + } + + override lateinit var parent: FrostContentParent + + internal lateinit var frostWebClient: FrostWebViewClient + + override val currentUrl: String + get() = url ?: "" + + @SuppressLint("SetJavaScriptEnabled") + override fun bind(container: FrostContentContainer): View { + with(settings) { + javaScriptEnabled = true + if (parent.baseUrl.shouldUseBasicAgent) + userAgentString = USER_AGENT_BASIC + allowFileAccess = true + textZoom = Prefs.webTextScaling + } + setLayerType(LAYER_TYPE_HARDWARE, null) + // attempt to get custom client; otherwise fallback to original + frostWebClient = (container as? WebFragment)?.client(this) ?: FrostWebViewClient(this) + webViewClient = frostWebClient + webChromeClient = FrostChromeClient(this) + addJavascriptInterface(FrostJSI(this), "Frost") + setBackgroundColor(Color.TRANSPARENT) + setDownloadListener(context::frostDownload) + return this + } + + + /** + * Wrapper to the main userAgentString to cache it. + * This decouples it from the UiThread + * + * Note that this defaults to null, but the main purpose is to + * check if we've set our own agent. + * + * A null value may be interpreted as the default value + */ + var userAgentString: String? = null + set(value) { + field = value + settings.userAgentString = value + } + + init { + isNestedScrollingEnabled = true + } + + fun loadUrl(url: String?, animate: Boolean) { + if (url == null) return + parent.registerTransition(animate) + super.loadUrl(url) + } + + override fun reloadBase(animate: Boolean) { + loadUrl(parent.baseUrl, animate) + } + + override fun onBackPressed(): Boolean { + if (canGoBack()) { + goBack() + return true + } + return false + } + + /** + * If webview is already at the top, refresh + * Otherwise scroll to top + */ + override fun onTabClicked() { + if (scrollY < 5) reloadBase(true) + else scrollToTop() + } + + private fun scrollToTop() { + flingScroll(0, 0) // stop fling + if (scrollY > 10000) { + scrollTo(0, 0) + } else { + ValueAnimator.ofInt(scrollY, 0).apply { + duration = Math.min(scrollY, 500).toLong() + interpolator = DecelerateInterpolator() + addUpdateListener { scrollY = it.animatedValue as Int } + start() + } + } + } + + override var active: Boolean = true + set(value) { + if (field == value) return + field = value + // todo + } + + override fun reloadTheme() { + reloadThemeSelf() + } + + override fun reloadThemeSelf() { + reload(false) // todo see if there's a better solution + } + + override fun reloadTextSize() { + reloadTextSizeSelf() + } + + override fun reloadTextSizeSelf() { + settings.textZoom = Prefs.webTextScaling + } + +}
\ No newline at end of file |