From a2caba8bd1b49ff6c53d193b7eb40323338a1c1a Mon Sep 17 00:00:00 2001 From: Antoine POPINEAU Date: Sat, 13 Jun 2020 17:44:50 +0200 Subject: [PATCH] Added downloaded indicator on track rows. --- .../apognu/otter/adapters/DownloadsAdapter.kt | 6 ++-- .../apognu/otter/adapters/TracksAdapter.kt | 5 ++++ .../apognu/otter/fragments/TracksFragment.kt | 14 ++++++++-- .../apognu/otter/playback/PinService.kt | 16 +++++++---- .../apognu/otter/playback/PlayerService.kt | 1 + .../otter/repositories/TracksRepository.kt | 28 ++++++++++++++++--- .../com/github/apognu/otter/utils/EventBus.kt | 1 + .../com/github/apognu/otter/utils/Models.kt | 4 ++- app/src/main/res/drawable/downloaded.xml | 8 ++++++ app/src/main/res/layout/row_track.xml | 6 ++-- app/src/main/res/values-fr/strings.xml | 4 +++ app/src/main/res/values/strings.xml | 4 +++ 12 files changed, 80 insertions(+), 17 deletions(-) create mode 100644 app/src/main/res/drawable/downloaded.xml diff --git a/app/src/main/java/com/github/apognu/otter/adapters/DownloadsAdapter.kt b/app/src/main/java/com/github/apognu/otter/adapters/DownloadsAdapter.kt index 4ca065d..11f1b69 100644 --- a/app/src/main/java/com/github/apognu/otter/adapters/DownloadsAdapter.kt +++ b/app/src/main/java/com/github/apognu/otter/adapters/DownloadsAdapter.kt @@ -60,16 +60,16 @@ class DownloadsAdapter(private val context: Context, private val listener: OnRef holder.toggle.setOnClickListener { if (state.state == Download.STATE_DOWNLOADING) { - DownloadService.sendSetStopReason(context, PinService::class.java, download.id, 1, false) + DownloadService.sendSetStopReason(context, PinService::class.java, download.contentId, 1, false) } else { - DownloadService.sendSetStopReason(context, PinService::class.java, download.id, Download.STOP_REASON_NONE, false) + DownloadService.sendSetStopReason(context, PinService::class.java, download.contentId, Download.STOP_REASON_NONE, false) } listener.refresh() } holder.delete.setOnClickListener { - DownloadService.sendRemoveDownload(context, PinService::class.java, download.id, false) + DownloadService.sendRemoveDownload(context, PinService::class.java, download.contentId, false) listener.refresh() } 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 1969c9b..03eb570 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 @@ -94,6 +94,11 @@ class TracksAdapter(private val context: Context?, private val favoriteListener: notifyItemChanged(position) } } + + when (track.downloaded) { + true -> holder.title.setCompoundDrawablesWithIntrinsicBounds(R.drawable.downloaded, 0, 0, 0) + false -> holder.title.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0) + } } holder.actions.setOnClickListener { diff --git a/app/src/main/java/com/github/apognu/otter/fragments/TracksFragment.kt b/app/src/main/java/com/github/apognu/otter/fragments/TracksFragment.kt index 4ec930e..c18538d 100644 --- a/app/src/main/java/com/github/apognu/otter/fragments/TracksFragment.kt +++ b/app/src/main/java/com/github/apognu/otter/fragments/TracksFragment.kt @@ -2,8 +2,6 @@ package com.github.apognu.otter.fragments import android.os.Bundle import android.view.Gravity -import android.view.Menu -import android.view.MenuInflater import android.view.View import androidx.appcompat.widget.PopupMenu import androidx.core.os.bundleOf @@ -124,6 +122,18 @@ class TracksFragment : FunkwhaleFragment() { when (message) { is Event.TrackPlayed -> refreshCurrentTrack() is Event.RefreshTrack -> refreshCurrentTrack() + is Event.DownloadChanged -> { + (repository as? TracksRepository)?.let { repository -> + val downloaded = repository.getDownloadedIds() ?: listOf() + + adapter.data = adapter.data.map { + it.downloaded = downloaded.contains(it.id) + it + }.toMutableList() + + adapter.notifyDataSetChanged() + } + } } } } diff --git a/app/src/main/java/com/github/apognu/otter/playback/PinService.kt b/app/src/main/java/com/github/apognu/otter/playback/PinService.kt index 901ee17..8c4f7d9 100644 --- a/app/src/main/java/com/github/apognu/otter/playback/PinService.kt +++ b/app/src/main/java/com/github/apognu/otter/playback/PinService.kt @@ -4,10 +4,7 @@ import android.app.Notification import android.content.Intent import com.github.apognu.otter.Otter import com.github.apognu.otter.R -import com.github.apognu.otter.utils.AppContext -import com.github.apognu.otter.utils.Request -import com.github.apognu.otter.utils.RequestBus -import com.github.apognu.otter.utils.Response +import com.github.apognu.otter.utils.* import com.google.android.exoplayer2.offline.* import com.google.android.exoplayer2.scheduler.Scheduler import com.google.android.exoplayer2.ui.DownloadNotificationHelper @@ -44,7 +41,16 @@ class PinService : DownloadService(AppContext.NOTIFICATION_DOWNLOADS) { override fun getScheduler(): Scheduler? = null override fun getForegroundNotification(downloads: MutableList?): Notification { - return DownloadNotificationHelper(this, AppContext.NOTIFICATION_CHANNEL_DOWNLOADS).buildProgressNotification(R.drawable.downloads, null, "Hello, world", downloads) + val quantity = downloads?.size ?: 0 + val description = resources.getQuantityString(R.plurals.downloads_description, quantity, quantity) + + return DownloadNotificationHelper(this, AppContext.NOTIFICATION_CHANNEL_DOWNLOADS).buildProgressNotification(R.drawable.downloads, null, description, downloads) + } + + override fun onDownloadChanged(download: Download?) { + super.onDownloadChanged(download) + + EventBus.send(Event.DownloadChanged) } private fun getDownloads() = manager.downloadIndex.getDownloads() 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 ab2454c..06fe63b 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 @@ -345,6 +345,7 @@ class PlayerService : Service() { val url = mustNormalizeUrl(upload.listen_url) val data = Gson().toJson( DownloadInfo( + track.id, url, track.title, track.artist.name, diff --git a/app/src/main/java/com/github/apognu/otter/repositories/TracksRepository.kt b/app/src/main/java/com/github/apognu/otter/repositories/TracksRepository.kt index bfecace..6e596cb 100644 --- a/app/src/main/java/com/github/apognu/otter/repositories/TracksRepository.kt +++ b/app/src/main/java/com/github/apognu/otter/repositories/TracksRepository.kt @@ -1,11 +1,10 @@ package com.github.apognu.otter.repositories import android.content.Context -import com.github.apognu.otter.utils.FunkwhaleResponse -import com.github.apognu.otter.utils.Track -import com.github.apognu.otter.utils.TracksCache -import com.github.apognu.otter.utils.TracksResponse +import com.github.apognu.otter.utils.* import com.github.kittinunf.fuel.gson.gsonDeserializerOf +import com.google.android.exoplayer2.offline.Download +import com.google.gson.Gson import com.google.gson.reflect.TypeToken import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.toList @@ -25,9 +24,30 @@ class TracksRepository(override val context: Context?, albumId: Int) : Repositor .toList() .flatten() + val downloaded = getDownloadedIds() ?: listOf() + data.map { track -> track.favorite = favorites.contains(track.id) + track.downloaded = downloaded.contains(track.id) track }.sortedBy { it.position } } + + suspend fun getDownloadedIds(): List? { + return RequestBus.send(Request.GetDownloads).wait()?.let { response -> + val ids: MutableList = mutableListOf() + + while (response.cursor.moveToNext()) { + val download = response.cursor.download + + Gson().fromJson(String(download.request.data), DownloadInfo::class.java)?.let { + if (download.state == Download.STATE_COMPLETED) { + ids.add(it.id) + } + } + } + + ids + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt b/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt index ec33ac2..67b7639 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/EventBus.kt @@ -47,6 +47,7 @@ sealed class Event { object QueueChanged : Event() object RadioStarted : Event() object ListingsChanged : Event() + object DownloadChanged : Event() } sealed class Request(var channel: Channel? = null) { diff --git a/app/src/main/java/com/github/apognu/otter/utils/Models.kt b/app/src/main/java/com/github/apognu/otter/utils/Models.kt index 5f6aabc..a148a43 100644 --- a/app/src/main/java/com/github/apognu/otter/utils/Models.kt +++ b/app/src/main/java/com/github/apognu/otter/utils/Models.kt @@ -100,6 +100,7 @@ data class Track( ) : SearchResult { var current: Boolean = false var favorite: Boolean = false + var downloaded: Boolean = false data class Upload( val listen_url: String, @@ -149,7 +150,8 @@ data class Radio( ) data class DownloadInfo( - val id: String, + val id: Int, + val contentId: String, val title: String, val artist: String, var download: Download?) \ No newline at end of file diff --git a/app/src/main/res/drawable/downloaded.xml b/app/src/main/res/drawable/downloaded.xml new file mode 100644 index 0000000..fb8944e --- /dev/null +++ b/app/src/main/res/drawable/downloaded.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/row_track.xml b/app/src/main/res/layout/row_track.xml index 01c33ed..2e44cfa 100644 --- a/app/src/main/res/layout/row_track.xml +++ b/app/src/main/res/layout/row_track.xml @@ -39,9 +39,11 @@ diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 97374d9..052bbec 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -98,4 +98,8 @@ %1$d pistes • %2$s Ma musique seulement + + Téléchargement de %1$d piste + Téléchargement de %1$d pistes + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 29a0ec7..e298521 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,4 +99,8 @@ %1$d tracks • %2$s" Only my music + + Downloading %1$d track + Downloading %1$d tracks +