Files
futbollibre-tv-android/app/src/main/java/com/futbollibre/tv/ChannelCardPresenter.kt
2026-03-10 16:28:04 -03:00

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)
}
}