2021-07-12 10:14:26 +02:00
|
|
|
package audio.funkwhale.ffa.adapters
|
2020-06-13 16:09:48 +02:00
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
import android.graphics.drawable.Icon
|
|
|
|
import android.view.LayoutInflater
|
|
|
|
import android.view.View
|
|
|
|
import android.view.ViewGroup
|
|
|
|
import androidx.recyclerview.widget.RecyclerView
|
2021-07-12 10:14:26 +02:00
|
|
|
import audio.funkwhale.ffa.R
|
|
|
|
import audio.funkwhale.ffa.playback.PinService
|
|
|
|
import audio.funkwhale.ffa.utils.*
|
2020-06-13 16:09:48 +02:00
|
|
|
import com.google.android.exoplayer2.offline.Download
|
|
|
|
import com.google.android.exoplayer2.offline.DownloadService
|
|
|
|
import kotlinx.android.synthetic.main.row_download.view.*
|
|
|
|
|
2020-06-14 14:59:50 +02:00
|
|
|
class DownloadsAdapter(private val context: Context, private val listener: OnDownloadChangedListener) : RecyclerView.Adapter<DownloadsAdapter.ViewHolder>() {
|
|
|
|
interface OnDownloadChangedListener {
|
|
|
|
fun onItemRemoved(index: Int)
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
var downloads: MutableList<DownloadInfo> = mutableListOf()
|
|
|
|
|
|
|
|
override fun getItemCount() = downloads.size
|
|
|
|
|
2020-06-22 22:24:34 +02:00
|
|
|
override fun getItemId(position: Int) = downloads[position].id.toLong()
|
|
|
|
|
2020-06-13 16:09:48 +02:00
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
|
|
|
val view = LayoutInflater.from(context).inflate(R.layout.row_download, parent, false)
|
|
|
|
|
|
|
|
return ViewHolder(view)
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
|
|
|
val download = downloads[position]
|
|
|
|
|
|
|
|
holder.title.text = download.title
|
|
|
|
holder.artist.text = download.artist
|
|
|
|
|
|
|
|
download.download?.let { state ->
|
|
|
|
when (state.isTerminalState) {
|
|
|
|
true -> {
|
2020-06-22 22:24:34 +02:00
|
|
|
holder.progress.visibility = View.INVISIBLE
|
2020-06-14 14:59:50 +02:00
|
|
|
|
|
|
|
when (state.state) {
|
|
|
|
Download.STATE_FAILED -> {
|
|
|
|
holder.toggle.setImageDrawable(context.getDrawable(R.drawable.retry))
|
2020-06-22 22:24:34 +02:00
|
|
|
holder.progress.visibility = View.INVISIBLE
|
2020-06-14 14:59:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
else -> holder.toggle.visibility = View.GONE
|
|
|
|
}
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
false -> {
|
|
|
|
holder.progress.visibility = View.VISIBLE
|
|
|
|
holder.toggle.visibility = View.VISIBLE
|
2020-06-14 21:15:13 +02:00
|
|
|
holder.progress.isIndeterminate = false
|
2020-06-13 16:09:48 +02:00
|
|
|
holder.progress.progress = state.percentDownloaded.toInt()
|
|
|
|
|
|
|
|
when (state.state) {
|
2020-06-14 21:15:13 +02:00
|
|
|
Download.STATE_QUEUED -> {
|
|
|
|
holder.progress.isIndeterminate = true
|
|
|
|
}
|
|
|
|
|
2020-06-13 16:09:48 +02:00
|
|
|
Download.STATE_REMOVING -> {
|
|
|
|
holder.progress.visibility = View.GONE
|
|
|
|
holder.toggle.visibility = View.GONE
|
|
|
|
}
|
|
|
|
|
|
|
|
Download.STATE_STOPPED -> holder.toggle.setImageIcon(Icon.createWithResource(context, R.drawable.play))
|
2020-06-14 14:59:50 +02:00
|
|
|
|
2020-06-13 16:09:48 +02:00
|
|
|
else -> holder.toggle.setImageIcon(Icon.createWithResource(context, R.drawable.pause))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
holder.toggle.setOnClickListener {
|
2020-06-14 14:59:50 +02:00
|
|
|
when (state.state) {
|
2020-06-14 21:15:13 +02:00
|
|
|
Download.STATE_QUEUED, Download.STATE_DOWNLOADING -> DownloadService.sendSetStopReason(context, PinService::class.java, download.contentId, 1, false)
|
2020-06-14 14:59:50 +02:00
|
|
|
|
|
|
|
Download.STATE_FAILED -> {
|
2020-07-10 20:25:35 +02:00
|
|
|
Track.fromDownload(download).also {
|
2020-06-14 14:59:50 +02:00
|
|
|
PinService.download(context, it)
|
|
|
|
}
|
|
|
|
}
|
2020-06-13 16:09:48 +02:00
|
|
|
|
2020-06-14 14:59:50 +02:00
|
|
|
else -> DownloadService.sendSetStopReason(context, PinService::class.java, download.contentId, Download.STOP_REASON_NONE, false)
|
|
|
|
}
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
holder.delete.setOnClickListener {
|
2020-06-14 14:59:50 +02:00
|
|
|
listener.onItemRemoved(position)
|
2020-06-13 17:44:50 +02:00
|
|
|
DownloadService.sendRemoveDownload(context, PinService::class.java, download.contentId, false)
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
|
|
|
val title = view.title
|
|
|
|
val artist = view.artist
|
|
|
|
val progress = view.progress
|
|
|
|
val toggle = view.toggle
|
|
|
|
val delete = view.delete
|
|
|
|
}
|
2021-07-02 13:55:49 +02:00
|
|
|
}
|