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
|
2021-07-16 10:03:52 +02:00
|
|
|
import audio.funkwhale.ffa.databinding.RowDownloadBinding
|
2021-08-22 09:48:33 +02:00
|
|
|
import audio.funkwhale.ffa.model.DownloadInfo
|
|
|
|
import audio.funkwhale.ffa.model.Track
|
2021-09-09 09:56:15 +02:00
|
|
|
import audio.funkwhale.ffa.playback.PinService
|
2020-06-13 16:09:48 +02:00
|
|
|
import com.google.android.exoplayer2.offline.Download
|
|
|
|
import com.google.android.exoplayer2.offline.DownloadService
|
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
class DownloadsAdapter(
|
|
|
|
private val layoutInflater: LayoutInflater,
|
|
|
|
private val context: Context,
|
|
|
|
private val listener: OnDownloadChangedListener
|
|
|
|
) : RecyclerView.Adapter<DownloadsAdapter.ViewHolder>() {
|
|
|
|
|
2020-06-14 14:59:50 +02:00
|
|
|
interface OnDownloadChangedListener {
|
|
|
|
fun onItemRemoved(index: Int)
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
private lateinit var binding: RowDownloadBinding
|
|
|
|
|
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 {
|
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
binding = RowDownloadBinding.inflate(layoutInflater, parent, false)
|
|
|
|
|
|
|
|
return ViewHolder(binding)
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
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) {
|
2021-07-16 10:03:52 +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
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
else -> DownloadService.sendSetStopReason(
|
|
|
|
context,
|
|
|
|
PinService::class.java,
|
|
|
|
download.contentId,
|
|
|
|
Download.STOP_REASON_NONE,
|
|
|
|
false
|
|
|
|
)
|
2020-06-14 14:59:50 +02:00
|
|
|
}
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
holder.delete.setOnClickListener {
|
2020-06-14 14:59:50 +02:00
|
|
|
listener.onItemRemoved(position)
|
2021-07-16 10:03:52 +02:00
|
|
|
DownloadService.sendRemoveDownload(
|
|
|
|
context,
|
|
|
|
PinService::class.java,
|
|
|
|
download.contentId,
|
|
|
|
false
|
|
|
|
)
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
inner class ViewHolder(binding: RowDownloadBinding) : RecyclerView.ViewHolder(binding.root) {
|
|
|
|
val title = binding.title
|
|
|
|
val artist = binding.artist
|
|
|
|
val progress = binding.progress
|
|
|
|
val toggle = binding.toggle
|
|
|
|
val delete = binding.delete
|
2020-06-13 16:09:48 +02:00
|
|
|
}
|
2021-07-02 13:55:49 +02:00
|
|
|
}
|