[Android] Playlists: fix deleting wrong indexes + avoid swipe to dismiss state issue

Nicolas Pomepuy git at videolan.org
Fri Nov 13 07:31:03 CET 2020


vlc-android | branch: 3.3.x | Nicolas Pomepuy <nicolas at videolabs.io> | Thu Nov  5 10:12:07 2020 +0100| [5029a9db269344449f52e02f6abf00ada15f3e54] | committer: Nicolas Pomepuy

Playlists: fix deleting wrong indexes + avoid swipe to dismiss state issue

Fixes #1520

(cherry picked from commit 22d2b379a389a62e8941294052eb717a99035e99)

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

 .../src/org/videolan/vlc/gui/PlaylistActivity.kt          | 15 +++++++++++----
 .../vlc/gui/helpers/SwipeDragItemTouchHelperCallback.kt   |  4 +++-
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/application/vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt b/application/vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt
index 2f6ce4926..d1e7c9b6e 100644
--- a/application/vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt
+++ b/application/vlc-android/src/org/videolan/vlc/gui/PlaylistActivity.kt
@@ -82,6 +82,7 @@ import java.util.*
 @ExperimentalCoroutinesApi
 open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler<MediaLibraryItem>, IListEventsHandler, ActionMode.Callback, View.OnClickListener, CtxActionReceiver {
 
+    private lateinit var itemTouchHelperCallback: SwipeDragItemTouchHelperCallback
     private lateinit var audioBrowserAdapter: AudioBrowserAdapter
     private val mediaLibrary = Medialibrary.getInstance()
     private lateinit var binding: PlaylistActivityBinding
@@ -115,6 +116,7 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler<Med
             @Suppress("UNCHECKED_CAST")
             (tracks as? PagedList<MediaLibraryItem>)?.let { audioBrowserAdapter.submitList(it) }
             menu.let { UiTools.updateSortTitles(it, viewModel.tracksProvider) }
+            itemTouchHelperCallback.swipeEnabled = true
         })
 
         viewModel.tracksProvider.liveHeaders.observe(this, {
@@ -122,7 +124,8 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler<Med
         })
         audioBrowserAdapter = AudioBrowserAdapter(MediaLibraryItem.TYPE_MEDIA, this, this, isPlaylist)
         if (isPlaylist) {
-            itemTouchHelper = ItemTouchHelper(SwipeDragItemTouchHelperCallback(audioBrowserAdapter))
+            itemTouchHelperCallback = SwipeDragItemTouchHelperCallback(audioBrowserAdapter)
+            itemTouchHelper = ItemTouchHelper(itemTouchHelperCallback)
             itemTouchHelper!!.attachToRecyclerView(binding.songs)
         } else {
             binding.songs.addItemDecoration(RecyclerSectionItemDecoration(resources.getDimensionPixelSize(R.dimen.recycler_section_header_height), true, viewModel.tracksProvider))
@@ -341,7 +344,6 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler<Med
         }
         val indexes = audioBrowserAdapter.multiSelectHelper.selectionMap
 
-        stopActionMode()
         when (item.itemId) {
             R.id.action_mode_audio_play -> MediaUtils.openList(this, tracks, 0)
             R.id.action_mode_audio_append -> MediaUtils.appendMedia(this, tracks)
@@ -349,9 +351,10 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler<Med
             R.id.action_mode_audio_info -> showInfoDialog(list[0] as MediaWrapper)
             R.id.action_mode_audio_share -> lifecycleScope.launch { share(list.map { it as MediaWrapper }) }
             R.id.action_mode_audio_set_song -> setRingtone(list[0] as MediaWrapper)
-            R.id.action_mode_audio_delete -> if (isPlaylist) removeFromPlaylist(tracks, indexes) else removeItems(tracks)
+            R.id.action_mode_audio_delete -> if (isPlaylist) removeFromPlaylist(tracks, indexes.toMutableList()) else removeItems(tracks)
             else -> return false
         }
+        stopActionMode()
         return true
     }
 
@@ -432,6 +435,8 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler<Med
         val itemsRemoved = HashMap<Int, Long>()
         val playlist = viewModel.playlist as? Playlist
                 ?: return
+
+        itemTouchHelperCallback.swipeEnabled = false
         lifecycleScope.launchWhenStarted {
             val tracks = withContext(Dispatchers.IO) { playlist.tracks }
             for (mediaItem in list) {
@@ -442,7 +447,9 @@ open class PlaylistActivity : AudioPlayerContainerActivity(), IEventsHandler<Med
                 }
             }
             withContext(Dispatchers.IO) {
-                for (index in indexes) playlist.remove(index)
+                for ((index, playlistIndex) in indexes.sortedBy { it }.withIndex()) {
+                    playlist.remove(playlistIndex - index)
+                }
             }
             UiTools.snackerWithCancel(findViewById(android.R.id.content), getString(R.string.removed_from_playlist_anonymous), null, {
                 for ((key, value) in itemsRemoved) {
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 2e0e4e99f..1a57b7d3a 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
@@ -30,6 +30,7 @@ import org.videolan.vlc.interfaces.SwipeDragHelperAdapter
 class SwipeDragItemTouchHelperCallback(private val mAdapter: SwipeDragHelperAdapter, private val longPressDragEnable: Boolean = false) : ItemTouchHelper.Callback() {
     private var dragFrom = -1
     private var dragTo = -1
+    var swipeEnabled = true
 
     override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int {
         val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
@@ -65,8 +66,9 @@ class SwipeDragItemTouchHelperCallback(private val mAdapter: SwipeDragHelperAdap
         super.clearView(recyclerView, viewHolder)
     }
 
+    override fun isItemViewSwipeEnabled() = swipeEnabled
+
     override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
         mAdapter.onItemDismiss(viewHolder.layoutPosition)
     }
-
 }



More information about the Android mailing list