2021-07-12 10:14:26 +02:00
|
|
|
package audio.funkwhale.ffa.adapters
|
2020-05-30 21:16:28 +02:00
|
|
|
|
|
|
|
import android.content.Context
|
|
|
|
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.RowRadioBinding
|
|
|
|
import audio.funkwhale.ffa.databinding.RowRadioHeaderBinding
|
|
|
|
import audio.funkwhale.ffa.fragments.FFAAdapter
|
2021-09-09 09:56:15 +02:00
|
|
|
import audio.funkwhale.ffa.model.Radio
|
2021-07-12 10:14:26 +02:00
|
|
|
import audio.funkwhale.ffa.utils.AppContext
|
|
|
|
import audio.funkwhale.ffa.utils.Event
|
|
|
|
import audio.funkwhale.ffa.utils.EventBus
|
|
|
|
import audio.funkwhale.ffa.views.LoadingImageView
|
2020-06-21 13:36:42 +02:00
|
|
|
import com.preference.PowerPreference
|
2020-06-25 01:26:15 +02:00
|
|
|
import kotlinx.coroutines.CoroutineScope
|
2020-06-02 18:50:46 +02:00
|
|
|
import kotlinx.coroutines.Dispatchers.Main
|
|
|
|
import kotlinx.coroutines.flow.collect
|
|
|
|
import kotlinx.coroutines.launch
|
2020-05-30 21:16:28 +02:00
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
class RadiosAdapter(
|
|
|
|
private val layoutInflater: LayoutInflater,
|
|
|
|
private val context: Context?,
|
|
|
|
private val scope: CoroutineScope,
|
|
|
|
private val listener: OnRadioClickListener
|
|
|
|
) : FFAAdapter<Radio, RadiosAdapter.ViewHolder>() {
|
|
|
|
|
2021-09-10 09:44:36 +02:00
|
|
|
init {
|
|
|
|
this.stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY
|
|
|
|
}
|
|
|
|
|
2020-05-30 21:16:28 +02:00
|
|
|
interface OnRadioClickListener {
|
2021-07-16 10:03:52 +02:00
|
|
|
fun onClick(holder: RowRadioViewHolder, radio: Radio)
|
2020-05-30 21:16:28 +02:00
|
|
|
}
|
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
private lateinit var rowRadioBinding: RowRadioBinding
|
|
|
|
private lateinit var rowRadioHeaderBinding: RowRadioHeaderBinding
|
|
|
|
|
2020-06-21 13:36:42 +02:00
|
|
|
enum class RowType {
|
|
|
|
Header,
|
|
|
|
InstanceRadio,
|
|
|
|
UserRadio
|
|
|
|
}
|
|
|
|
|
|
|
|
private val instanceRadios: List<Radio> by lazy {
|
|
|
|
context?.let {
|
2021-09-09 09:56:15 +02:00
|
|
|
return@lazy when (
|
|
|
|
val username =
|
|
|
|
PowerPreference.getFileByName(AppContext.PREFS_CREDENTIALS).getString("actor_username")
|
|
|
|
) {
|
2020-06-21 13:36:42 +02:00
|
|
|
"" -> listOf(
|
2021-07-16 10:03:52 +02:00
|
|
|
Radio(
|
|
|
|
0,
|
|
|
|
"random",
|
|
|
|
context.getString(R.string.radio_random_title),
|
|
|
|
context.getString(R.string.radio_random_description)
|
|
|
|
)
|
2020-06-21 13:36:42 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
else -> listOf(
|
2021-07-16 10:03:52 +02:00
|
|
|
Radio(
|
|
|
|
0,
|
2021-09-08 09:51:49 +02:00
|
|
|
"actor-content",
|
2021-07-16 10:03:52 +02:00
|
|
|
context.getString(R.string.radio_your_content_title),
|
|
|
|
context.getString(R.string.radio_your_content_description),
|
|
|
|
username
|
|
|
|
),
|
|
|
|
Radio(
|
|
|
|
0,
|
|
|
|
"random",
|
|
|
|
context.getString(R.string.radio_random_title),
|
|
|
|
context.getString(R.string.radio_random_description)
|
|
|
|
),
|
|
|
|
Radio(
|
|
|
|
0,
|
|
|
|
"favorites",
|
|
|
|
context.getString(R.string.favorites),
|
|
|
|
context.getString(R.string.radio_favorites_description)
|
|
|
|
),
|
|
|
|
Radio(
|
|
|
|
0,
|
|
|
|
"less-listened",
|
|
|
|
context.getString(R.string.radio_less_listened_title),
|
|
|
|
context.getString(R.string.radio_less_listened_description)
|
|
|
|
)
|
2020-06-21 13:36:42 +02:00
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
listOf<Radio>()
|
|
|
|
}
|
|
|
|
|
|
|
|
private fun getRadioAt(position: Int): Radio {
|
|
|
|
return when (getItemViewType(position)) {
|
|
|
|
RowType.InstanceRadio.ordinal -> instanceRadios[position - 1]
|
|
|
|
else -> data[position - instanceRadios.size - 2]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-11 18:15:40 +02:00
|
|
|
override fun getItemId(position: Int) = when (getItemViewType(position)) {
|
|
|
|
RowType.InstanceRadio.ordinal -> (-position - 1).toLong()
|
|
|
|
RowType.Header.ordinal -> Long.MIN_VALUE
|
|
|
|
else -> getRadioAt(position).id.toLong()
|
|
|
|
}
|
2020-05-30 21:16:28 +02:00
|
|
|
|
2020-07-11 18:15:40 +02:00
|
|
|
override fun getItemCount() = instanceRadios.size + data.size + 2
|
2020-05-30 21:16:28 +02:00
|
|
|
|
2020-06-21 13:36:42 +02:00
|
|
|
override fun getItemViewType(position: Int): Int {
|
|
|
|
return when {
|
|
|
|
position == 0 || position == instanceRadios.size + 1 -> RowType.Header.ordinal
|
|
|
|
position <= instanceRadios.size -> RowType.InstanceRadio.ordinal
|
|
|
|
else -> RowType.UserRadio.ordinal
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-30 21:16:28 +02:00
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RadiosAdapter.ViewHolder {
|
2020-06-21 13:36:42 +02:00
|
|
|
return when (viewType) {
|
|
|
|
RowType.InstanceRadio.ordinal, RowType.UserRadio.ordinal -> {
|
2021-07-16 10:03:52 +02:00
|
|
|
rowRadioBinding = RowRadioBinding.inflate(layoutInflater, parent, false)
|
2020-06-21 13:36:42 +02:00
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
RowRadioViewHolder(rowRadioBinding, listener).also {
|
|
|
|
rowRadioBinding.root.setOnClickListener(it)
|
2020-06-21 13:36:42 +02:00
|
|
|
}
|
|
|
|
}
|
2020-05-30 21:16:28 +02:00
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
else -> {
|
|
|
|
rowRadioHeaderBinding = RowRadioHeaderBinding.inflate(layoutInflater, parent, false)
|
|
|
|
RowRadioHeaderViewHolder(rowRadioHeaderBinding)
|
|
|
|
}
|
2020-05-30 21:16:28 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
override fun onBindViewHolder(holder: RadiosAdapter.ViewHolder, position: Int) {
|
2020-06-21 13:36:42 +02:00
|
|
|
when (getItemViewType(position)) {
|
|
|
|
RowType.Header.ordinal -> {
|
2021-07-16 10:03:52 +02:00
|
|
|
holder as RowRadioHeaderViewHolder
|
2020-06-21 13:36:42 +02:00
|
|
|
context?.let {
|
|
|
|
when (position) {
|
|
|
|
0 -> holder.label.text = context.getString(R.string.radio_instance_radios)
|
2021-09-09 09:56:15 +02:00
|
|
|
instanceRadios.size + 1 ->
|
|
|
|
holder.label.text =
|
|
|
|
context.getString(R.string.radio_user_radios)
|
2020-06-21 13:36:42 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-05-30 21:16:28 +02:00
|
|
|
|
2020-06-21 13:36:42 +02:00
|
|
|
RowType.InstanceRadio.ordinal, RowType.UserRadio.ordinal -> {
|
|
|
|
val radio = getRadioAt(position)
|
2021-07-16 10:03:52 +02:00
|
|
|
holder as RowRadioViewHolder
|
2020-06-21 13:36:42 +02:00
|
|
|
holder.art.visibility = View.VISIBLE
|
|
|
|
holder.name.text = radio.name
|
|
|
|
holder.description.text = radio.description
|
|
|
|
|
|
|
|
context?.let { context ->
|
|
|
|
val icon = when (radio.radio_type) {
|
|
|
|
"actor_content" -> R.drawable.library
|
|
|
|
"favorites" -> R.drawable.favorite
|
|
|
|
"random" -> R.drawable.shuffle
|
|
|
|
"less-listened" -> R.drawable.sad
|
|
|
|
else -> null
|
|
|
|
}
|
2020-06-01 17:05:13 +02:00
|
|
|
|
2020-06-21 13:36:42 +02:00
|
|
|
icon?.let {
|
|
|
|
holder.native = true
|
2020-06-01 17:05:13 +02:00
|
|
|
|
2020-06-21 13:36:42 +02:00
|
|
|
holder.art.setImageDrawable(context.getDrawable(icon))
|
|
|
|
holder.art.alpha = 0.7f
|
|
|
|
holder.art.setColorFilter(context.getColor(R.color.controlForeground))
|
|
|
|
}
|
|
|
|
}
|
2020-06-01 14:38:50 +02:00
|
|
|
}
|
|
|
|
}
|
2020-05-30 21:16:28 +02:00
|
|
|
}
|
|
|
|
|
2021-07-16 10:03:52 +02:00
|
|
|
inner class RowRadioViewHolder(binding: RowRadioBinding, val listener: OnRadioClickListener) :
|
|
|
|
ViewHolder(binding.root),
|
|
|
|
View.OnClickListener {
|
|
|
|
val art = binding.art
|
|
|
|
val name = binding.name
|
|
|
|
val description = binding.description
|
2020-06-02 18:50:46 +02:00
|
|
|
|
|
|
|
fun spin() {
|
|
|
|
context?.let {
|
|
|
|
val originalDrawable = art.drawable
|
|
|
|
val originalColorFilter = art.colorFilter
|
|
|
|
val imageAnimator = LoadingImageView.start(context, art)
|
|
|
|
|
|
|
|
art.setColorFilter(context.getColor(R.color.controlForeground))
|
|
|
|
|
2020-06-25 01:26:15 +02:00
|
|
|
scope.launch(Main) {
|
2020-06-02 18:50:46 +02:00
|
|
|
EventBus.get().collect { message ->
|
|
|
|
when (message) {
|
|
|
|
is Event.RadioStarted -> {
|
|
|
|
art.colorFilter = originalColorFilter
|
|
|
|
LoadingImageView.stop(context, originalDrawable, art, imageAnimator)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-05-30 21:16:28 +02:00
|
|
|
}
|
2021-07-16 10:03:52 +02:00
|
|
|
|
|
|
|
override fun onClick(view: View?) {
|
|
|
|
listener.onClick(this, getRadioAt(layoutPosition))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inner class RowRadioHeaderViewHolder(
|
|
|
|
binding: RowRadioHeaderBinding
|
|
|
|
) : ViewHolder(
|
|
|
|
binding.root
|
|
|
|
) {
|
|
|
|
val label = binding.label
|
|
|
|
}
|
|
|
|
|
|
|
|
abstract inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
|
|
|
|
var native = false
|
2020-05-30 21:16:28 +02:00
|
|
|
}
|
2021-07-02 13:55:49 +02:00
|
|
|
}
|