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