[Android] Fix the playlist list selection state in the SavePlaylistDialog

Nicolas Pomepuy git at videolan.org
Fri Mar 14 09:31:18 UTC 2025


vlc-android | branch: master | Nicolas Pomepuy <nicolas at videolabs.io> | Thu Mar 13 15:28:46 2025 +0100| [61aa4149bc053bc05b93b848ed2774a6457b196c] | committer: Nicolas Pomepuy

Fix the playlist list selection state in the SavePlaylistDialog

This is in fact a workaround. Any list that is using the MultiSelectHelper
and can be updated through diffutil is affected. A proper solution would be to handle
the selection replacement directly in the MultiSelectHelper using a RecyclerView.AdapterDataObserver

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

 .../src/main/java/org/videolan/tools/MultiSelectHelper.kt    |  9 +++++++++
 .../src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt   | 12 +++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/application/tools/src/main/java/org/videolan/tools/MultiSelectHelper.kt b/application/tools/src/main/java/org/videolan/tools/MultiSelectHelper.kt
index 233af067b0..b712d4ef64 100644
--- a/application/tools/src/main/java/org/videolan/tools/MultiSelectHelper.kt
+++ b/application/tools/src/main/java/org/videolan/tools/MultiSelectHelper.kt
@@ -48,6 +48,15 @@ class MultiSelectHelper<T>(val adapter: MultiSelectAdapter<T>, private val paylo
         adapter.notifyItemChanged(position, payloadvalue)
     }
 
+    fun replaceSelection(positions: List<Int>) {
+        val min = min(positions.minOrNull() ?: -1, selectionMap.minOrNull() ?: -1)
+        val max = max(positions.maxOrNull() ?: Int.MAX_VALUE, selectionMap.maxOrNull() ?: Int.MAX_VALUE)
+
+        selectionMap.clear()
+        positions.forEach { selectionMap.add(it) }
+        adapter.notifyItemRangeChanged(min, 1 + max - min, payloadvalue)
+    }
+
     fun clearSelection() {
         if (selectionMap.size == 0) return
         val start = selectionMap.minOrNull()
diff --git a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt
index 6abe456f50..e57a721786 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/dialogs/SavePlaylistDialog.kt
@@ -82,6 +82,8 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
     var nonDuplicateTracks: Array<MediaWrapper>? = null
     private lateinit var currentPlaylist: Playlist
     private lateinit var currentTracks: Array<MediaWrapper>
+    private var lastAddedPlaylist: MediaLibraryItem? = null
+    private var oldSelection: List<MediaLibraryItem>? = null
 
     private var isLoading: Boolean = false
         set(value) {
@@ -119,6 +121,13 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
         adapter = SimpleAdapter(this)
         dataObserver = adapter.onAnyChange {
             updateEmptyView()
+            if (lastAddedPlaylist != null) {
+                val newSelection = ArrayList(oldSelection ?: listOf()).apply {
+                    add(lastAddedPlaylist)
+                }
+                lastAddedPlaylist = null
+                adapter.multiSelectHelper.replaceSelection(newSelection.map { adapter.currentList.indexOf(it) })
+            }
         }
         adapter.defaultCover = UiTools.getDefaultPlaylistDrawable(requireActivity())
         newTracks = try {
@@ -279,10 +288,11 @@ class SavePlaylistDialog : VLCBottomSheetDialogFragment(), View.OnClickListener,
             }
             val playlist = medialibrary.createPlaylist(name, Settings.includeMissing, false)
             binding.dialogPlaylistName.editText?.text?.clear()
+            oldSelection = adapter.multiSelectHelper.getSelection()
             val newList = listOf<MediaLibraryItem>(
                 *medialibrary.getPlaylists(Playlist.Type.All, false).apply { forEach { it.description = resources.getQuantityString(R.plurals.media_quantity, it.tracksCount, it.tracksCount) } })
             adapter.submitList(newList)
-            onClick(newList.indexOf(playlist))
+            lastAddedPlaylist = playlist
             alreadyAdding.set(false)
             binding.dialogPlaylistName.error = null
 



More information about the Android mailing list