[Android] Audio player prevent reordering when in filter mode

Nicolas Pomepuy git at videolan.org
Tue Mar 25 14:59:34 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Wed Mar 19 12:07:15 2025 +0100| [50256a48330c3cff31ab5ec91ae0c22ae2e1ffe7] | committer: Duncan McNamara

Audio player prevent reordering when in filter mode

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

 application/vlc-android/res/layout/playlist_item.xml          |  6 ++++++
 .../vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt | 11 ++++++++++-
 .../src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt         |  4 ++--
 .../vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt       |  2 +-
 .../src/org/videolan/vlc/viewmodels/PlaylistModel.kt          | 11 ++++++++++-
 5 files changed, 29 insertions(+), 5 deletions(-)

diff --git a/application/vlc-android/res/layout/playlist_item.xml b/application/vlc-android/res/layout/playlist_item.xml
index 4ce37114e2..5f7afb290a 100644
--- a/application/vlc-android/res/layout/playlist_item.xml
+++ b/application/vlc-android/res/layout/playlist_item.xml
@@ -39,6 +39,10 @@
                 name="showTrackNumbers"
                 type="java.lang.Boolean" />
 
+        <variable
+                name="showReorderButtons"
+                type="java.lang.Boolean" />
+
         <variable
                 name="masked"
                 type="java.lang.Boolean" />
@@ -214,6 +218,7 @@
                 android:layout_gravity="center"
                 android:layout_marginEnd="8dp"
                 android:background="?attr/selectableItemBackgroundBorderless"
+                android:visibility="@{showReorderButtons ? View.VISIBLE : View.GONE}"
                 android:clickable="true"
                 android:focusable="true"
                 android:onClick="@{holder::onMoveDownClick}"
@@ -236,6 +241,7 @@
                 android:clickable="true"
                 android:focusable="true"
                 android:onClick="@{holder::onMoveUpClick}"
+                android:visibility="@{showReorderButtons ? View.VISIBLE : View.GONE}"
                 android:padding="8dp"
                 android:scaleType="center"
                 app:layout_constraintBottom_toBottomOf="parent"
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
index c56dcc147e..1c70ccb3d1 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/AudioPlayer.kt
@@ -68,6 +68,7 @@ import org.videolan.medialibrary.Tools
 import org.videolan.medialibrary.interfaces.media.Bookmark
 import org.videolan.medialibrary.interfaces.media.MediaWrapper
 import org.videolan.medialibrary.media.MediaLibraryItem
+import org.videolan.resources.AndroidDevices
 import org.videolan.resources.AppContextProvider
 import org.videolan.resources.TAG_ITEM
 import org.videolan.resources.util.parcelable
@@ -164,6 +165,7 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, IAudioPlay
     private var lastEndsAt = -1L
     private var isDragging = false
     private var currentChapters: Pair<MediaWrapper,  List<MediaPlayer.Chapter>?>? = null
+    private lateinit var callback: SwipeDragItemTouchHelperCallback
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
@@ -177,6 +179,13 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, IAudioPlay
         playlistModel = PlaylistModel.get(this)
         playlistModel.progress.observe(this at AudioPlayer) { it?.let { updateProgress(it) } }
         playlistModel.speed.observe(this at AudioPlayer) { showChips() }
+        playlistModel.filteringState.observe(this at AudioPlayer) {
+            callback.longPressDragEnable = !it
+            if (isTablet() || AndroidDevices.isTv) {
+                playlistAdapter.showReorderButtons = !it
+                playlistAdapter.notifyDataSetChanged()
+            }
+        }
         playlistAdapter.setModel(playlistModel)
         playlistModel.dataset.asFlow().conflate().onEach {
             doUpdate()
@@ -232,7 +241,7 @@ class AudioPlayer : Fragment(), PlaylistAdapter.IPlayer, TextWatcher, IAudioPlay
             coverMediaSwitcherListener.onChapterSwitching(false)
         }
 
-        val callback = SwipeDragItemTouchHelperCallback(playlistAdapter, true)
+        callback = SwipeDragItemTouchHelperCallback(playlistAdapter, true)
         val touchHelper = ItemTouchHelper(callback)
         touchHelper.attachToRecyclerView(binding.songsList)
 
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt b/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
index 7d341f3a20..820fd19421 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/audio/PlaylistAdapter.kt
@@ -72,6 +72,7 @@ private const val ACTION_MOVED = "action_moved"
 class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<MediaWrapper, PlaylistAdapter.ViewHolder>(), SwipeDragHelperAdapter, SchedulerCallback {
 
     var showTrackNumbers: Boolean = false
+    var showReorderButtons: Boolean = true
     private var defaultCoverVideo: BitmapDrawable
     private var defaultCoverAudio: BitmapDrawable
     private var model: PlaylistModel? = null
@@ -156,8 +157,7 @@ class PlaylistAdapter(private val player: IPlayer) : DiffUtilAdapter<MediaWrappe
 
         val tablet = holder.binding.itemDelete.context.isTablet() || AndroidDevices.isTv
         if (tablet) holder.binding.itemDelete.setVisible() else holder.binding.itemDelete.setGone()
-        if (tablet) holder.binding.itemMoveDown.setVisible() else holder.binding.itemMoveDown.setGone()
-        if (tablet) holder.binding.itemMoveUp.setVisible() else holder.binding.itemMoveUp.setGone()
+        holder.binding.showReorderButtons = showReorderButtons && tablet
 
         holder.binding.executePendingBindings()
     }
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt b/application/vlc-android/src/org/videolan/vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt
index 6fc4601cff..5c1f2f7fe5 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt
@@ -28,7 +28,7 @@ import androidx.recyclerview.widget.RecyclerView
 import org.videolan.vlc.gui.helpers.hf.PinCodeDelegate
 import org.videolan.vlc.interfaces.SwipeDragHelperAdapter
 
-class SwipeDragItemTouchHelperCallback(private val mAdapter: SwipeDragHelperAdapter, private val longPressDragEnable: Boolean = false, private val lockedInSafeMode: Boolean = false) : ItemTouchHelper.Callback() {
+class SwipeDragItemTouchHelperCallback(private val mAdapter: SwipeDragHelperAdapter, var longPressDragEnable: Boolean = false, private val lockedInSafeMode: Boolean = false) : ItemTouchHelper.Callback() {
     private var dragFrom = -1
     private var dragTo = -1
     var swipeEnabled = true
diff --git a/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt b/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
index ca046bb7fa..4943e43508 100644
--- a/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
+++ b/application/vlc-android/src/org/videolan/vlc/viewmodels/PlaylistModel.kt
@@ -24,7 +24,11 @@ import android.support.v4.media.session.PlaybackStateCompat
 import androidx.annotation.MainThread
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.*
+import androidx.lifecycle.MediatorLiveData
+import androidx.lifecycle.MutableLiveData
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.lifecycle.viewModelScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.ObsoleteCoroutinesApi
 import kotlinx.coroutines.channels.actor
@@ -48,6 +52,11 @@ class PlaylistModel : ViewModel(), PlaybackService.Callback by EmptyPBSCallback
     val selection : Int
         get() = if (filtering) -1 else service?.playlistManager?.currentIndex ?: -1
     private var filtering = false
+        set(value) {
+            field = value
+            filteringState.value = value
+        }
+    val filteringState = MutableLiveData<Boolean>()
     val progress = MediatorLiveData<PlaybackProgress>()
     val speed = MediatorLiveData<Float>()
     val playerState = MutableLiveData<PlayerState>()



More information about the Android mailing list