aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt
diff options
context:
space:
mode:
authorAllan Wang <me@allanwang.ca>2017-12-21 02:16:34 -0500
committerGitHub <noreply@github.com>2017-12-21 02:16:34 -0500
commitd683cae6ffe644a9f63eea6cf3b7e59d2bde617b (patch)
tree517fe1d44c27084ccd87507d9804ba28f15c1647 /app/src/main/kotlin/com/pitchedapps/frost/views/FrostWebView.kt
parent82f9aca96493316bc62008f2b3167d34a6029b38 (diff)
downloadfrost-d683cae6ffe644a9f63eea6cf3b7e59d2bde617b.tar.gz
frost-d683cae6ffe644a9f63eea6cf3b7e59d2bde617b.tar.bz2
frost-d683cae6ffe644a9f63eea6cf3b7e59d2bde617b.zip
Enhancement/fragment interface (#564)
* Begin fragment interfaces and themable contracts * Prepare swiperefresh interface * Snapshot * Add compilable version * Revamp once more * Finalize layouts * Cleanup
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.kt144
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