diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistChooserDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistChooserDialog.java index 360a5ec5..7337e930 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistChooserDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistChooserDialog.java @@ -27,6 +27,8 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba private PlaylistDialogHorizontalAdapter playlistDialogHorizontalAdapter; + private boolean SkipDuplicates; + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -78,10 +80,15 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba private void initPlaylistView() { bind.playlistDialogRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.playlistDialogRecyclerView.setHasFixedSize(true); + SkipDuplicates = true; playlistDialogHorizontalAdapter = new PlaylistDialogHorizontalAdapter(this); bind.playlistDialogRecyclerView.setAdapter(playlistDialogHorizontalAdapter); + bind.playlistChooserDialogSkipDuplicates.setOnCheckedChangeListener((__, isChecked) -> { + SkipDuplicates = isChecked; + }); + playlistChooserViewModel.getPlaylistList(requireActivity()).observe(requireActivity(), playlists -> { if (playlists != null) { if (!playlists.isEmpty()) { @@ -100,8 +107,7 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba public void onPlaylistClick(Bundle bundle) { if (playlistChooserViewModel.getSongsToAdd() != null && !playlistChooserViewModel.getSongsToAdd().isEmpty()) { Playlist playlist = bundle.getParcelable(Constants.PLAYLIST_OBJECT); - playlistChooserViewModel.addSongsToPlaylist(playlist.getId()); - dismiss(); + playlistChooserViewModel.addSongsToPlaylist(this, getDialog(), playlist.getId(), SkipDuplicates); } else { Toast.makeText(requireContext(), R.string.playlist_chooser_dialog_toast_add_failure, Toast.LENGTH_SHORT).show(); } diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java index 2ec6c21f..82e0418b 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java @@ -1,6 +1,7 @@ package com.cappielloantonio.tempo.viewmodel; import android.app.Application; +import android.app.Dialog; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; @@ -14,7 +15,6 @@ import com.cappielloantonio.tempo.subsonic.models.Playlist; import com.google.common.collect.Lists; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class PlaylistChooserViewModel extends AndroidViewModel { @@ -34,8 +34,19 @@ public class PlaylistChooserViewModel extends AndroidViewModel { return playlists; } - public void addSongsToPlaylist(String playlistId) { - playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(Lists.transform(toAdd, Child::getId))); + public void addSongsToPlaylist(LifecycleOwner owner, Dialog dialog, String playlistId, boolean skipDuplicates) { + List songIds = Lists.transform(toAdd, Child::getId); + if (skipDuplicates) { + playlistRepository.getPlaylistSongs(playlistId).observe(owner, playlistSongs -> { + List playlistSongIds = Lists.transform(playlistSongs, Child::getId); + songIds.removeAll(playlistSongIds); + playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds)); + dialog.dismiss(); + }); + } else { + playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds)); + dialog.dismiss(); + } } public void setSongsToAdd(ArrayList songs) { diff --git a/app/src/main/res/layout/dialog_playlist_chooser.xml b/app/src/main/res/layout/dialog_playlist_chooser.xml index 80b4bfbe..1c7690e4 100644 --- a/app/src/main/res/layout/dialog_playlist_chooser.xml +++ b/app/src/main/res/layout/dialog_playlist_chooser.xml @@ -19,7 +19,15 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 619766d5..fbdcff4b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -207,6 +207,7 @@ Cancel Create Add to a playlist + Skip duplicates Added song to playlist Failed to add song to playlist %1$d tracks • %2$s