[Android] HeaderMediaList: reclaim the space when hiding track numbers

Nicolas Pomepuy git at videolan.org
Wed Feb 5 15:07:14 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Mon Feb  3 08:11:21 2025 +0100| [df1627f345f21e572271cd78438550cd770f67eb] | committer: Duncan McNamara

HeaderMediaList: reclaim the space when hiding track numbers

Fixes #3135

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

 .../res/layout/audio_album_track_item.xml          |  1 +
 .../vlc/gui/audio/AudioAlbumTracksAdapter.kt       | 41 +++++++++++++++++-----
 .../videolan/vlc/gui/audio/AudioBrowserAdapter.kt  |  3 ++
 3 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/application/vlc-android/res/layout/audio_album_track_item.xml b/application/vlc-android/res/layout/audio_album_track_item.xml
index f12be4219b..d37aef7d05 100644
--- a/application/vlc-android/res/layout/audio_album_track_item.xml
+++ b/application/vlc-android/res/layout/audio_album_track_item.xml
@@ -77,6 +77,7 @@
                 android:layout_marginStart="@dimen/default_margin"
                 android:contentDescription="@{TalkbackUtil.INSTANCE.getTrackNumber(context, item)}"
                 android:minWidth="20dp"
+                android:visibility="@{holder.shouldShowTrackNumber()}"
                 tools:text="1."
                 vlc:layout_constraintBaseline_toBaselineOf="@id/title"
                 vlc:layout_constraintStart_toStartOf="parent"/>
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumTracksAdapter.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumTracksAdapter.kt
index c09ca12c1f..b45908dc85 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumTracksAdapter.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioAlbumTracksAdapter.kt
@@ -32,6 +32,7 @@ import android.view.ViewGroup
 import android.widget.TextView
 import androidx.core.view.MotionEventCompat
 import androidx.databinding.ViewDataBinding
+import androidx.paging.PagedList
 import org.videolan.libvlc.util.AndroidUtil
 import org.videolan.medialibrary.interfaces.media.MediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
@@ -48,6 +49,8 @@ class AudioAlbumTracksAdapter @JvmOverloads constructor(
     ) : AudioBrowserAdapter(type, eventsHandler, listEventsHandler)
 {
 
+    var forceNoTracks = false
+
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AbstractMediaItemViewHolder<ViewDataBinding> {
         if (!inflaterInitialized()) {
             inflater = LayoutInflater.from(parent.context)
@@ -57,6 +60,24 @@ class AudioAlbumTracksAdapter @JvmOverloads constructor(
         return TrackItemViewHolder(binding) as AbstractMediaItemViewHolder<ViewDataBinding>
     }
 
+    override fun submitList(pagedList: PagedList<MediaLibraryItem>?) {
+        super.submitList(pagedList)
+        forceNoTracks = pagedList?.any { ((it as? MediaWrapper)?.trackNumber ?: 0) > 0 } == false
+    }
+
+    override fun playbackStateChanged(former: MediaWrapper?, currentMedia: MediaWrapper?) {
+        super.playbackStateChanged(former, super.currentMedia)
+        // The current song has changed.
+        // If we want to hide the track numbers but the current playback is in this list, show the track number (with no value)
+        if (!Settings.showTrackNumber || forceNoTracks) {
+                if (currentList?.contains(former) == false && currentList?.contains(currentMedia) == true) {
+                    notifyItemRangeChanged(0, itemCount)
+                }
+                //playback just stopped
+                if (currentList?.contains(former) == true || currentMedia == null) notifyItemRangeChanged(0, itemCount)
+            }
+    }
+
     @TargetApi(Build.VERSION_CODES.M)
     inner class TrackItemViewHolder(binding: AudioAlbumTrackItemBinding) : AbstractMediaItemViewHolder<AudioAlbumTrackItemBinding>(binding) {
         var onTouchListener: View.OnTouchListener
@@ -97,15 +118,19 @@ class AudioAlbumTracksAdapter @JvmOverloads constructor(
 
         override fun setItem(item: MediaLibraryItem?) {
             binding.item = item as MediaWrapper
-            if (item.trackNumber > 0 && Settings.showTrackNumber) {
-                binding.trackNumber.text = "${item.trackNumber}."
-                binding.trackNumber.visibility = View.VISIBLE
-            }
-            else
-                binding.trackNumber.visibility = View.GONE
+            binding.trackNumber.text = if (item.trackNumber > 0 && Settings.showTrackNumber)  "${item.trackNumber}." else ""
             binding.subtitle.text = MediaUtils.getMediaSubtitle(item)
         }
 
+        fun shouldShowTrackNumber() : Int {
+            return when {
+                currentMedia == binding.item -> View.INVISIBLE
+                Settings.showTrackNumber && !forceNoTracks -> View.VISIBLE
+                currentMedia != null && currentList?.contains(currentMedia) == true -> View.INVISIBLE
+                else -> View.GONE
+            }
+        }
+
         override fun recycle() {
             binding.cover = defaultCover
             binding.title.isSelected = false
@@ -114,9 +139,7 @@ class AudioAlbumTracksAdapter @JvmOverloads constructor(
 
         override fun getMiniVisu() = binding.playing
 
-        override fun changePlayingVisibility(isCurrent: Boolean) {
-            binding.trackNumber.visibility = if (isCurrent) View.INVISIBLE else View.VISIBLE
-        }
+        override fun changePlayingVisibility(isCurrent: Boolean) { }
 
     }
 }
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserAdapter.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserAdapter.kt
index a69daed9ad..a8be20509d 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserAdapter.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioBrowserAdapter.kt
@@ -112,9 +112,12 @@ open class AudioBrowserAdapter @JvmOverloads constructor(
                     notifyItemChanged(it)
                 }
             }
+            playbackStateChanged(former, currentMedia)
         }
     protected fun inflaterInitialized() = ::inflater.isInitialized
 
+    open fun playbackStateChanged(former: MediaWrapper?, currentMedia: MediaWrapper?) {}
+
     val isEmpty: Boolean
         get() = currentList.isNullOrEmpty()
 



More information about the Android mailing list