|
|
@ -10,7 +10,6 @@ import androidx.recyclerview.widget.RecyclerView |
|
|
|
import com.github.apognu.otter.repositories.HttpUpstream |
|
|
|
import com.github.apognu.otter.repositories.HttpUpstream |
|
|
|
import com.github.apognu.otter.repositories.Repository |
|
|
|
import com.github.apognu.otter.repositories.Repository |
|
|
|
import com.github.apognu.otter.utils.Cache |
|
|
|
import com.github.apognu.otter.utils.Cache |
|
|
|
import com.github.apognu.otter.utils.log |
|
|
|
|
|
|
|
import com.github.apognu.otter.utils.untilNetwork |
|
|
|
import com.github.apognu.otter.utils.untilNetwork |
|
|
|
import com.google.gson.Gson |
|
|
|
import com.google.gson.Gson |
|
|
|
import kotlinx.android.synthetic.main.fragment_artists.* |
|
|
|
import kotlinx.android.synthetic.main.fragment_artists.* |
|
|
@ -45,8 +44,8 @@ abstract class FunkwhaleFragment<D : Any, A : FunkwhaleAdapter<D, *>> : Fragment |
|
|
|
|
|
|
|
|
|
|
|
(repository.upstream as? HttpUpstream<*, *>)?.let { upstream -> |
|
|
|
(repository.upstream as? HttpUpstream<*, *>)?.let { upstream -> |
|
|
|
if (upstream.behavior == HttpUpstream.Behavior.Progressive) { |
|
|
|
if (upstream.behavior == HttpUpstream.Behavior.Progressive) { |
|
|
|
recycler.setOnScrollChangeListener { _, _, y, _, _ -> |
|
|
|
recycler.setOnScrollChangeListener { _, _, _, _, _ -> |
|
|
|
if (y > 0 && !recycler.canScrollVertically(1)) { |
|
|
|
if (recycler.computeVerticalScrollOffset() > 0 && !recycler.canScrollVertically(1)) { |
|
|
|
fetch(Repository.Origin.Network.origin, adapter.data.size) |
|
|
|
fetch(Repository.Origin.Network.origin, adapter.data.size) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -67,41 +66,47 @@ abstract class FunkwhaleFragment<D : Any, A : FunkwhaleAdapter<D, *>> : Fragment |
|
|
|
open fun onDataFetched(data: List<D>) {} |
|
|
|
open fun onDataFetched(data: List<D>) {} |
|
|
|
|
|
|
|
|
|
|
|
private fun fetch(upstreams: Int = (Repository.Origin.Network.origin and Repository.Origin.Cache.origin), size: Int = 0) { |
|
|
|
private fun fetch(upstreams: Int = (Repository.Origin.Network.origin and Repository.Origin.Cache.origin), size: Int = 0) { |
|
|
|
var first = true |
|
|
|
var first = size == 0 |
|
|
|
|
|
|
|
|
|
|
|
swiper?.isRefreshing = true |
|
|
|
swiper?.isRefreshing = true |
|
|
|
|
|
|
|
|
|
|
|
repository.fetch(upstreams, size).untilNetwork(IO) { data, isCache, hasMore -> |
|
|
|
repository.fetch(upstreams, size).untilNetwork(IO) { data, isCache, hasMore -> |
|
|
|
if (isCache) { |
|
|
|
GlobalScope.launch(Main) { |
|
|
|
adapter.data = data.toMutableList() |
|
|
|
if (isCache) { |
|
|
|
adapter.notifyDataSetChanged() |
|
|
|
adapter.data = data.toMutableList() |
|
|
|
|
|
|
|
adapter.notifyDataSetChanged() |
|
|
|
return@untilNetwork |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (first) { |
|
|
|
|
|
|
|
first = false |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
adapter.data.clear() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onDataFetched(data) |
|
|
|
return@launch |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
adapter.data.addAll(data) |
|
|
|
if (first && data.isNotEmpty()) { |
|
|
|
|
|
|
|
first = false |
|
|
|
|
|
|
|
|
|
|
|
if (!hasMore) { |
|
|
|
adapter.data.clear() |
|
|
|
swiper?.isRefreshing = false |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
repository.cacheId?.let { cacheId -> |
|
|
|
onDataFetched(data) |
|
|
|
Cache.set( |
|
|
|
|
|
|
|
context, |
|
|
|
adapter.data.addAll(data) |
|
|
|
cacheId, |
|
|
|
|
|
|
|
Gson().toJson(repository.cache(adapter.data)).toByteArray() |
|
|
|
if (!hasMore) { |
|
|
|
) |
|
|
|
swiper?.isRefreshing = false |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GlobalScope.launch(IO) { |
|
|
|
|
|
|
|
if (adapter.data.isNotEmpty()) { |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
repository.cacheId?.let { cacheId -> |
|
|
|
|
|
|
|
Cache.set( |
|
|
|
|
|
|
|
context, |
|
|
|
|
|
|
|
cacheId, |
|
|
|
|
|
|
|
Gson().toJson(repository.cache(adapter.data)).toByteArray() |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} catch (e: ConcurrentModificationException) {} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GlobalScope.launch(Main) { |
|
|
|
|
|
|
|
when (first) { |
|
|
|
when (first) { |
|
|
|
true -> { |
|
|
|
true -> { |
|
|
|
adapter.notifyDataSetChanged() |
|
|
|
adapter.notifyDataSetChanged() |
|
|
|