[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