[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