diff options
author | Allan Wang <me@allanwang.ca> | 2017-12-21 02:16:34 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-21 02:16:34 -0500 |
commit | d683cae6ffe644a9f63eea6cf3b7e59d2bde617b (patch) | |
tree | 517fe1d44c27084ccd87507d9804ba28f15c1647 /app/src/main/kotlin/com/pitchedapps/frost/views/FrostRecyclerView.kt | |
parent | 82f9aca96493316bc62008f2b3167d34a6029b38 (diff) | |
download | frost-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.kt | 103 |
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 |