From 3076d9a97c203497aec1415d8ac6037d10eebb46 Mon Sep 17 00:00:00 2001 From: Allan Wang Date: Sun, 31 Dec 2017 00:42:49 -0500 Subject: feature/menu-parser (#582) * Test menu parser * Add menu fragment implementation * Test proguard * Clean up * Use async * Use invoke * Try without proguard * Try 2 * Add fallback logic * Use normal notification event * Add custom event flag * Add rest of menu fragment data * Ensure fallback works * Update docs --- .../frost/fragments/RecyclerFragmentBase.kt | 149 +++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt (limited to 'app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt') diff --git a/app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt b/app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt new file mode 100644 index 00000000..c490de60 --- /dev/null +++ b/app/src/main/kotlin/com/pitchedapps/frost/fragments/RecyclerFragmentBase.kt @@ -0,0 +1,149 @@ +package com.pitchedapps.frost.fragments + +import ca.allanwang.kau.adapters.fastAdapter +import com.mikepenz.fastadapter.FastAdapter +import com.mikepenz.fastadapter.IItem +import com.mikepenz.fastadapter.adapters.ItemAdapter +import com.mikepenz.fastadapter.adapters.ModelAdapter +import com.mikepenz.fastadapter_extensions.items.ProgressItem +import com.pitchedapps.frost.R +import com.pitchedapps.frost.facebook.FbCookie +import com.pitchedapps.frost.parsers.FrostParser +import com.pitchedapps.frost.parsers.ParseResponse +import com.pitchedapps.frost.utils.L +import com.pitchedapps.frost.utils.Prefs +import com.pitchedapps.frost.utils.frostJsoup +import com.pitchedapps.frost.views.FrostRecyclerView +import org.jetbrains.anko.doAsync +import org.jetbrains.anko.toast +import org.jetbrains.anko.uiThread + +/** + * Created by Allan Wang on 27/12/17. + */ +abstract class RecyclerFragment : BaseFragment(), RecyclerContentContract { + + override val layoutRes: Int = R.layout.view_content_recycler + + override fun firstLoadRequest() { + val core = core ?: return + if (firstLoad) { + core.reloadBase(true) + firstLoad = false + } + } + + override final fun reload(progress: (Int) -> Unit, callback: (Boolean) -> Unit) { + reloadImpl(progress) { + if (it) + callback(it) + else + valid = false + } + } + + protected abstract fun reloadImpl(progress: (Int) -> Unit, callback: (Boolean) -> Unit) +} + +abstract class GenericRecyclerFragment> : RecyclerFragment() { + + abstract fun mapper(data: T): Item + + val adapter: ModelAdapter = ModelAdapter(this::mapper) + + override final fun bind(recyclerView: FrostRecyclerView) { + recyclerView.adapter = getAdapter() + recyclerView.onReloadClear = { adapter.clear() } + bindImpl(recyclerView) + } + + /** + * Anything to call for one time bindings + * At this stage, all adapters will have FastAdapter references + */ + open fun bindImpl(recyclerView: FrostRecyclerView) = Unit + + /** + * Create the fast adapter to bind to the recyclerview + */ + open fun getAdapter(): FastAdapter> = fastAdapter(this.adapter) + +} + +abstract class FrostParserFragment> : RecyclerFragment() { + + /** + * The parser to make this all happen + */ + abstract val parser: FrostParser + + open fun getDoc(cookie: String?) = frostJsoup(cookie, parser.url) + + abstract fun toItems(response: ParseResponse): List + + val adapter: ItemAdapter = ItemAdapter() + + override final fun bind(recyclerView: FrostRecyclerView) { + recyclerView.adapter = getAdapter() + recyclerView.onReloadClear = { adapter.clear() } + bindImpl(recyclerView) + } + + /** + * Anything to call for one time bindings + * At this stage, all adapters will have FastAdapter references + */ + open fun bindImpl(recyclerView: FrostRecyclerView) = Unit + + /** + * Create the fast adapter to bind to the recyclerview + */ + open fun getAdapter(): FastAdapter> = fastAdapter(this.adapter) + + override fun reloadImpl(progress: (Int) -> Unit, callback: (Boolean) -> Unit) { + doAsync { + progress(10) + val cookie = FbCookie.webCookie + val doc = getDoc(cookie) + progress(60) + val response = parser.parse(cookie, doc) + if (response == null) { + L.eThrow("RecyclerFragment failed for ${baseEnum.name}") + return@doAsync callback(false) + } + progress(80) + val items = toItems(response) + progress(97) + uiThread { adapter.setNewList(items) } + callback(true) + } + } +} + +//abstract class PagedRecyclerFragment> : RecyclerFragment() { +// +// var allowPagedLoading = true +// +// val footerAdapter = ItemAdapter() +// +// val footerScrollListener = object : EndlessRecyclerOnScrollListener(footerAdapter) { +// override fun onLoadMore(currentPage: Int) { +// TODO("not implemented") +// +// } +// +// } +// +// override fun getAdapter() = fastAdapter(adapter, footerAdapter) +// +// override fun bindImpl(recyclerView: FrostRecyclerView) { +// recyclerView.addOnScrollListener(footerScrollListener) +// } +// +// override fun reload(progress: (Int) -> Unit, callback: (Boolean) -> Unit) { +// footerScrollListener. +// super.reload(progress, callback) +// } +//} + +class FrostProgress : ProgressItem() -- cgit v1.2.3