[Android] Display the images in the cards and backdrop for images files on TV

Nicolas Pomepuy git at videolan.org
Tue Dec 3 17:57:43 UTC 2024


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Tue Dec  3 12:46:05 2024 +0100| [1b5f2fa2463d3d9c415e8a72d34d63f9d3dca80b] | committer: Nicolas Pomepuy

Display the images in the cards and backdrop for images files on TV

> https://code.videolan.org/videolan/vlc-android/commit/1b5f2fa2463d3d9c415e8a72d34d63f9d3dca80b
---

 .../org/videolan/television/ui/CardPresenter.kt    | 27 +++++++++++++++++++---
 .../main/java/org/videolan/television/ui/TvUtil.kt |  9 ++++++++
 2 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/application/television/src/main/java/org/videolan/television/ui/CardPresenter.kt b/application/television/src/main/java/org/videolan/television/ui/CardPresenter.kt
index 0932ad0e33..45f2bf810c 100644
--- a/application/television/src/main/java/org/videolan/television/ui/CardPresenter.kt
+++ b/application/television/src/main/java/org/videolan/television/ui/CardPresenter.kt
@@ -32,11 +32,16 @@ import android.view.View
 import android.view.ViewGroup
 import android.widget.ImageView
 import androidx.core.content.ContextCompat
+import androidx.fragment.app.FragmentActivity
 import androidx.leanback.widget.ImageCardView
 import androidx.leanback.widget.Presenter
+import androidx.lifecycle.lifecycleScope
 import androidx.vectordrawable.graphics.drawable.Animatable2Compat
 import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat
 import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
 import org.videolan.medialibrary.Tools
 import org.videolan.medialibrary.interfaces.media.MediaWrapper
 import org.videolan.medialibrary.media.DummyItem
@@ -52,7 +57,7 @@ import org.videolan.vlc.gui.helpers.*
 
 public const val FAVORITE_FLAG = 1000
 @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
-class CardPresenter(private val context: Activity, private val isPoster: Boolean = false, private val fromHistory:Boolean = false) : Presenter() {
+class CardPresenter(private val context: FragmentActivity, private val isPoster: Boolean = false, private val fromHistory:Boolean = false) : Presenter() {
 
     private var seenMediaMarkerVisible = true
     private var sDefaultCardImage: Drawable? = VectorDrawableCompat.create(context.resources, R.drawable.ic_default_cone, context.theme)
@@ -94,8 +99,24 @@ class CardPresenter(private val context: Activity, private val isPoster: Boolean
                     loadPlaylistImageWithWidth(cardView.mainImageView, item, imageDefaultWidth.toInt(), true)
                 }
                 noArt -> {
-                    cardView.mainImageView.scaleType = ImageView.ScaleType.CENTER_INSIDE
-                    cardView.mainImage = BitmapDrawable(cardView.resources, getDefaultImage(item))
+                    if (item is MediaWrapper) {
+                        context.lifecycleScope.launch {
+                            val bitmap = withContext(Dispatchers.IO) {
+                                AudioUtil.fetchCoverBitmap(item.uri.toString(), 512)
+                            }?.let { BitmapDrawable(cardView.resources, it) }
+                            if (bitmap != null) {
+                                cardView.mainImageView.scaleType = ImageView.ScaleType.CENTER_INSIDE
+                                cardView.mainImage = bitmap
+                            } else {
+                                cardView.mainImageView.scaleType = ImageView.ScaleType.CENTER_INSIDE
+                                cardView.mainImage = BitmapDrawable(cardView.resources, getDefaultImage(item))
+                            }
+                        }
+                    } else {
+                        cardView.mainImageView.scaleType = ImageView.ScaleType.CENTER_INSIDE
+                        cardView.mainImage =
+                            BitmapDrawable(cardView.resources, getDefaultImage(item))
+                    }
                 }
                 else -> loadImage(cardView, item)
             }
diff --git a/application/television/src/main/java/org/videolan/television/ui/TvUtil.kt b/application/television/src/main/java/org/videolan/television/ui/TvUtil.kt
index 3a598dc9f0..c897e01f8f 100644
--- a/application/television/src/main/java/org/videolan/television/ui/TvUtil.kt
+++ b/application/television/src/main/java/org/videolan/television/ui/TvUtil.kt
@@ -311,6 +311,15 @@ fun CoroutineScope.updateBackground(activity: Activity, bm: BackgroundManager?,
             }
             if (!isActive) return at launch
             blurred?.let { bm.drawable = BitmapDrawable(activity.resources, it) }
+        } else if (item is MediaWrapper && item.type == MediaWrapper.TYPE_ALL) {
+           val blurred = withContext(Dispatchers.IO) {
+                var cover: Bitmap? = AudioUtil.fetchCoverBitmap(item.uri.toString(), 512)
+                        ?: return at withContext null
+                cover = cover?.let { BitmapUtil.centerCrop(it, it.width, (it.width / screenRatio).toInt()) }
+                UiTools.blurBitmap(cover, 10f)
+            }
+            if (!isActive) return at launch
+            blurred?.let { bm.drawable = BitmapDrawable(activity.resources, it) }
         }
     } else if (item is MediaMetadataWithImages) launch {
         val blurred = withContext(Dispatchers.IO) {



More information about the Android mailing list