From ed30198c8d8dfa0bb0304ba5f101df065e120930 Mon Sep 17 00:00:00 2001 From: antonio Date: Wed, 11 Oct 2023 21:48:04 +0200 Subject: [PATCH] feat: implemented playlist deletion starting from current track --- .../tempo/service/MediaManager.java | 23 +++++++++++ .../ui/fragment/PlayerQueueFragment.java | 11 ++++++ .../layout/inner_fragment_player_queue.xml | 39 ++++++++++++++----- app/src/main/res/values/strings.xml | 1 + 4 files changed, 64 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java b/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java index 2ee4e55e..d595947e 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java +++ b/app/src/main/java/com/cappielloantonio/tempo/service/MediaManager.java @@ -254,6 +254,21 @@ public class MediaManager { } } + public static void removeRange(ListenableFuture mediaBrowserListenableFuture, List media, int fromItem, int toItem) { + if (mediaBrowserListenableFuture != null) { + mediaBrowserListenableFuture.addListener(() -> { + try { + if (mediaBrowserListenableFuture.isDone()) { + mediaBrowserListenableFuture.get().removeMediaItems(fromItem, toItem); + removeRangeDatabase(media, fromItem, toItem); + } + } catch (ExecutionException | InterruptedException e) { + e.printStackTrace(); + } + }, MoreExecutors.directExecutor()); + } + } + public static void getCurrentIndex(ListenableFuture mediaBrowserListenableFuture, MediaIndexCallback callback) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { @@ -320,6 +335,14 @@ public class MediaManager { } } + private static void removeRangeDatabase(List media, int fromItem, int toItem) { + List toRemove = media.subList(fromItem, toItem); + + media.removeAll(toRemove); + + getQueueRepository().insertAll(media, true, 0); + } + public static void clearDatabase() { getQueueRepository().deleteAll(); } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerQueueFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerQueueFragment.java index 8fd5f3b5..f53a2247 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerQueueFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/PlayerQueueFragment.java @@ -93,6 +93,7 @@ public class PlayerQueueFragment extends Fragment implements ClickCallback { try { MediaBrowser mediaBrowser = mediaBrowserListenableFuture.get(); initShuffleButton(mediaBrowser); + initCleanButton(mediaBrowser); } catch (Exception exception) { exception.printStackTrace(); } @@ -197,6 +198,16 @@ public class PlayerQueueFragment extends Fragment implements ClickCallback { }); } + private void initCleanButton(MediaBrowser mediaBrowser) { + bind.playerCleanQueueButton.setOnClickListener(view -> { + int startPosition = mediaBrowser.getCurrentMediaItemIndex() + 1; + int endPosition = playerSongQueueAdapter.getItems().size(); + + MediaManager.removeRange(mediaBrowserListenableFuture, playerSongQueueAdapter.getItems(), startPosition, endPosition); + bind.playerQueueRecyclerView.getAdapter().notifyItemRangeRemoved(startPosition, endPosition); + }); + } + private void updateNowPlayingItem() { playerSongQueueAdapter.notifyDataSetChanged(); } diff --git a/app/src/main/res/layout/inner_fragment_player_queue.xml b/app/src/main/res/layout/inner_fragment_player_queue.xml index 9a88d9a2..cd7b224a 100644 --- a/app/src/main/res/layout/inner_fragment_player_queue.xml +++ b/app/src/main/res/layout/inner_fragment_player_queue.xml @@ -1,6 +1,5 @@ - @@ -10,14 +9,34 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:layout_height="match_parent"> + + + + + + + + + + app:srcCompat="@drawable/ic_shuffle" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 574c3dc5..2c7f37c1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -123,6 +123,7 @@ Search Settings %1$.2fx + Clean play queue Server Priority Playlist Catalogue Browse Playlists