Initial release
This commit is contained in:
120
app/src/main/java/com/futbollibre/tv/ChannelCardPresenter.kt
Normal file
120
app/src/main/java/com/futbollibre/tv/ChannelCardPresenter.kt
Normal file
@@ -0,0 +1,120 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user