diff --git a/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt index 2d61c0d..8e11ece 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/TracksAdapter.kt @@ -82,8 +82,8 @@ class TracksAdapter(private val context: Context?, private val favoriteListener: context?.let { when (track.favorite) { - true -> holder.favorite.setColorFilter(context.resources.getColor(R.color.colorFavorite)) - false -> holder.favorite.setColorFilter(context.resources.getColor(R.color.colorSelected)) + true -> holder.favorite.setColorFilter(context.getColor(R.color.colorFavorite)) + false -> holder.favorite.setColorFilter(context.getColor(R.color.colorSelected)) } holder.favorite.setOnClickListener { diff --git a/app/src/main/java/com/github/apognu/otter/fragments/FunkwhaleFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/FunkwhaleFragment.kt index 745fe0f..3a6c0a8 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/FunkwhaleFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/FunkwhaleFragment.kt @@ -10,7 +10,6 @@ import androidx.recyclerview.widget.RecyclerView import com.github.apognu.otter.repositories.HttpUpstream import com.github.apognu.otter.repositories.Repository import com.github.apognu.otter.utils.Cache -import com.github.apognu.otter.utils.log import com.github.apognu.otter.utils.untilNetwork import com.google.gson.Gson import kotlinx.android.synthetic.main.fragment_artists.* @@ -45,8 +44,8 @@ abstract class FunkwhaleFragment> : Fragment (repository.upstream as? HttpUpstream<*, *>)?.let { upstream -> if (upstream.behavior == HttpUpstream.Behavior.Progressive) { - recycler.setOnScrollChangeListener { _, _, y, _, _ -> - if (y > 0 && !recycler.canScrollVertically(1)) { + recycler.setOnScrollChangeListener { _, _, _, _, _ -> + if (recycler.computeVerticalScrollOffset() > 0 && !recycler.canScrollVertically(1)) { fetch(Repository.Origin.Network.origin, adapter.data.size) } } @@ -67,41 +66,47 @@ abstract class FunkwhaleFragment> : Fragment open fun onDataFetched(data: List) {} 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 repository.fetch(upstreams, size).untilNetwork(IO) { data, isCache, hasMore -> - if (isCache) { - adapter.data = data.toMutableList() - adapter.notifyDataSetChanged() - - return@untilNetwork - } - - if (first) { - first = false - - adapter.data.clear() - } - - onDataFetched(data) - - adapter.data.addAll(data) - - if (!hasMore) { - swiper?.isRefreshing = false - - repository.cacheId?.let { cacheId -> - Cache.set( - context, - cacheId, - Gson().toJson(repository.cache(adapter.data)).toByteArray() - ) - } - } - GlobalScope.launch(Main) { + if (isCache) { + adapter.data = data.toMutableList() + adapter.notifyDataSetChanged() + + return@launch + } + + if (first && data.isNotEmpty()) { + first = false + + adapter.data.clear() + } + + onDataFetched(data) + + adapter.data.addAll(data) + + 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) {} + } + } + } + when (first) { true -> { adapter.notifyDataSetChanged() diff --git a/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt index cdef053..a3c3817 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/PlaylistTracksFragment.kt @@ -100,10 +100,12 @@ class PlaylistTracksFragment : FunkwhaleFragment cover_top_left } - GlobalScope.launch(Main) { - Picasso.get() - .maybeLoad(maybeNormalizeUrl(url)) - .into(imageView) + imageView?.let { view -> + GlobalScope.launch(Main) { + Picasso.get() + .maybeLoad(maybeNormalizeUrl(url)) + .into(view) + } } } } diff --git a/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt b/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt index f72a940..971266f 100644 --- a/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt +++ b/app/src/main/java/com/github/apognu/otter/playback/PlayerService.kt @@ -413,6 +413,7 @@ class PlayerService : Service() { ) player.next() + player.playWhenReady = true } } diff --git a/app/src/main/java/com/github/apognu/otter/repositories/HttpUpstream.kt b/app/src/main/java/com/github/apognu/otter/repositories/HttpUpstream.kt index 8818cb6..bcd4fb6 100644 --- a/app/src/main/java/com/github/apognu/otter/repositories/HttpUpstream.kt +++ b/app/src/main/java/com/github/apognu/otter/repositories/HttpUpstream.kt @@ -12,6 +12,7 @@ import com.google.gson.Gson import com.preference.PowerPreference import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn import java.io.Reader @@ -45,7 +46,7 @@ class HttpUpstream>(val behavior: Behavior, pr } else { emit(Repository.Response(Repository.Origin.Network, data, true)) - fetch(size + data.size) + fetch(size + data.size).collect { emit(it) } } }, { error ->