aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.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/FrostRecyclerView.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/FrostRecyclerView.kt')
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt103
1 files changed, 103 insertions, 0 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt b/app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt
new file mode 100644
index 00000000..436f8b00
--- /dev/null
+++ b/app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt
@@ -0,0 +1,103 @@
+package com.pitchedapps.frost.views
+
+import android.content.Context
+import android.support.v7.widget.RecyclerView
+import android.util.AttributeSet
+import android.view.View
+import com.pitchedapps.frost.contracts.FrostContentContainer
+import com.pitchedapps.frost.contracts.FrostContentCore
+import com.pitchedapps.frost.contracts.FrostContentParent
+import com.pitchedapps.frost.fragments.RecyclerContentContract
+import com.pitchedapps.frost.utils.L
+import java.lang.ref.WeakReference
+
+/**
+ * Created by Allan Wang on 2017-05-29.
+ *
+ */
+class FrostRecyclerView @JvmOverloads constructor(
+ context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
+) : RecyclerView(context, attrs, defStyleAttr),
+ FrostContentCore {
+
+ override fun reload(animate: Boolean) = reloadBase(animate)
+
+ override lateinit var parent: FrostContentParent
+
+ override val currentUrl: String
+ get() = parent.baseUrl
+
+ lateinit var recyclerContract: WeakReference<RecyclerContentContract>
+
+ override fun bind(container: FrostContentContainer): View {
+ if (container !is RecyclerContentContract)
+ throw IllegalStateException("FrostRecyclerView must bind to a container that is a RecyclerContentContract")
+ this.recyclerContract = WeakReference(container)
+ container.bind(this)
+ return this
+ }
+
+ init {
+ isNestedScrollingEnabled = true
+ }
+
+ override fun reloadBase(animate: Boolean) {
+ val contract = recyclerContract.get()
+ if (contract == null) {
+ L.eThrow("Attempted to reload with invalid contract")
+ return
+ }
+ contract.reload({ parent.progressObservable.onNext(it) }) {
+ parent.progressObservable.onNext(100)
+ parent.refreshObservable.onNext(false)
+ }
+ }
+
+ override fun clearHistory() {
+ // intentionally blank
+ }
+
+ override fun destroy() {
+ // todo see if any
+ }
+
+ override fun onBackPressed() = 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() {
+ stopScroll()
+ smoothScrollToPosition(0)
+ }
+
+ 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() {
+ // todo
+ }
+
+} \ No newline at end of file