121 lines
3.7 KiB
Kotlin
121 lines
3.7 KiB
Kotlin
package com.futbollibre.tv
|
|
|
|
import android.content.Context
|
|
import android.graphics.drawable.Drawable
|
|
import android.view.ViewGroup
|
|
import androidx.core.content.ContextCompat
|
|
import androidx.leanback.widget.ImageCardView
|
|
import androidx.leanback.widget.Presenter
|
|
import coil.imageLoader
|
|
import coil.request.ImageRequest
|
|
import com.futbollibre.tv.model.Channel
|
|
|
|
/**
|
|
* Presenter for displaying agenda items as cards in the Leanback UI.
|
|
*/
|
|
class ChannelCardPresenter(
|
|
private val context: Context,
|
|
private val cardWidth: Int = 300,
|
|
private val cardHeight: Int = 200
|
|
) : Presenter() {
|
|
|
|
companion object {
|
|
private const val TAG = "ChannelCardPresenter"
|
|
}
|
|
|
|
private var defaultCardImage: Drawable? = null
|
|
private var selectedBackgroundColor: Int = 0
|
|
private var defaultBackgroundColor: Int = 0
|
|
|
|
init {
|
|
initColors()
|
|
}
|
|
|
|
private fun initColors() {
|
|
defaultBackgroundColor = ContextCompat.getColor(context, R.color.card_background)
|
|
selectedBackgroundColor = ContextCompat.getColor(context, R.color.card_selected_background)
|
|
defaultCardImage = ContextCompat.getDrawable(context, R.drawable.ic_channel_default)
|
|
}
|
|
|
|
override fun onCreateViewHolder(parent: ViewGroup): ViewHolder {
|
|
val cardView = ImageCardView(context).apply {
|
|
cardType = ImageCardView.CARD_TYPE_INFO_UNDER
|
|
isFocusable = true
|
|
isFocusableInTouchMode = true
|
|
setMainImageDimensions(cardWidth, cardHeight)
|
|
|
|
// Set background colors
|
|
setBackgroundColor(defaultBackgroundColor)
|
|
}
|
|
|
|
return ViewHolder(cardView)
|
|
}
|
|
|
|
override fun onBindViewHolder(viewHolder: ViewHolder, item: Any) {
|
|
val channel = item as Channel
|
|
val cardView = viewHolder.view as ImageCardView
|
|
|
|
cardView.titleText = channel.name
|
|
|
|
val contentText = channel.summary ?: if (channel.streamUrls.isNotEmpty()) {
|
|
"${channel.streamUrls.size} opciones"
|
|
} else {
|
|
"Sin opciones"
|
|
}
|
|
cardView.contentText = contentText
|
|
|
|
cardView.setBackgroundColor(defaultBackgroundColor)
|
|
|
|
if (!channel.logoUrl.isNullOrEmpty()) {
|
|
loadChannelLogo(cardView, channel.logoUrl)
|
|
} else {
|
|
cardView.mainImage = defaultCardImage
|
|
}
|
|
}
|
|
|
|
override fun onUnbindViewHolder(viewHolder: ViewHolder) {
|
|
val cardView = viewHolder.view as ImageCardView
|
|
cardView.badgeImage = null
|
|
cardView.mainImage = null
|
|
}
|
|
|
|
override fun onViewAttachedToWindow(viewHolder: ViewHolder) {
|
|
super.onViewAttachedToWindow(viewHolder)
|
|
}
|
|
|
|
private fun loadChannelLogo(cardView: ImageCardView, logoUrl: String) {
|
|
cardView.mainImage = defaultCardImage
|
|
loadImageAsync(cardView, logoUrl)
|
|
}
|
|
|
|
private fun loadImageAsync(cardView: ImageCardView, url: String) {
|
|
val imageLoader = context.imageLoader
|
|
val request = ImageRequest.Builder(context)
|
|
.data(url)
|
|
.target(
|
|
onStart = {
|
|
cardView.mainImage = defaultCardImage
|
|
},
|
|
onSuccess = { drawable ->
|
|
cardView.mainImage = drawable
|
|
},
|
|
onError = {
|
|
cardView.mainImage = defaultCardImage
|
|
}
|
|
)
|
|
.build()
|
|
|
|
imageLoader.enqueue(request)
|
|
}
|
|
|
|
fun onItemSelected(viewHolder: ViewHolder) {
|
|
val cardView = viewHolder.view as ImageCardView
|
|
cardView.setBackgroundColor(selectedBackgroundColor)
|
|
}
|
|
|
|
fun onItemUnselected(viewHolder: ViewHolder) {
|
|
val cardView = viewHolder.view as ImageCardView
|
|
cardView.setBackgroundColor(defaultBackgroundColor)
|
|
}
|
|
}
|