feat: Support skipping duplicates

This commit is contained in:
SinTan1729 2025-09-26 16:24:21 -05:00
parent 1223062388
commit e1d63a9eef
No known key found for this signature in database
GPG key ID: 0538DD402EA50898
4 changed files with 32 additions and 6 deletions

View file

@ -27,6 +27,8 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba
private PlaylistDialogHorizontalAdapter playlistDialogHorizontalAdapter; private PlaylistDialogHorizontalAdapter playlistDialogHorizontalAdapter;
private boolean SkipDuplicates;
@NonNull @NonNull
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
@ -78,10 +80,15 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba
private void initPlaylistView() { private void initPlaylistView() {
bind.playlistDialogRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.playlistDialogRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
bind.playlistDialogRecyclerView.setHasFixedSize(true); bind.playlistDialogRecyclerView.setHasFixedSize(true);
SkipDuplicates = true;
playlistDialogHorizontalAdapter = new PlaylistDialogHorizontalAdapter(this); playlistDialogHorizontalAdapter = new PlaylistDialogHorizontalAdapter(this);
bind.playlistDialogRecyclerView.setAdapter(playlistDialogHorizontalAdapter); bind.playlistDialogRecyclerView.setAdapter(playlistDialogHorizontalAdapter);
bind.playlistChooserDialogSkipDuplicates.setOnCheckedChangeListener((__, isChecked) -> {
SkipDuplicates = isChecked;
});
playlistChooserViewModel.getPlaylistList(requireActivity()).observe(requireActivity(), playlists -> { playlistChooserViewModel.getPlaylistList(requireActivity()).observe(requireActivity(), playlists -> {
if (playlists != null) { if (playlists != null) {
if (!playlists.isEmpty()) { if (!playlists.isEmpty()) {
@ -100,8 +107,7 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba
public void onPlaylistClick(Bundle bundle) { public void onPlaylistClick(Bundle bundle) {
if (playlistChooserViewModel.getSongsToAdd() != null && !playlistChooserViewModel.getSongsToAdd().isEmpty()) { if (playlistChooserViewModel.getSongsToAdd() != null && !playlistChooserViewModel.getSongsToAdd().isEmpty()) {
Playlist playlist = bundle.getParcelable(Constants.PLAYLIST_OBJECT); Playlist playlist = bundle.getParcelable(Constants.PLAYLIST_OBJECT);
playlistChooserViewModel.addSongsToPlaylist(playlist.getId()); playlistChooserViewModel.addSongsToPlaylist(this, getDialog(), playlist.getId(), SkipDuplicates);
dismiss();
} else { } else {
Toast.makeText(requireContext(), R.string.playlist_chooser_dialog_toast_add_failure, Toast.LENGTH_SHORT).show(); Toast.makeText(requireContext(), R.string.playlist_chooser_dialog_toast_add_failure, Toast.LENGTH_SHORT).show();
} }

View file

@ -1,6 +1,7 @@
package com.cappielloantonio.tempo.viewmodel; package com.cappielloantonio.tempo.viewmodel;
import android.app.Application; import android.app.Application;
import android.app.Dialog;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.AndroidViewModel;
@ -14,7 +15,6 @@ import com.cappielloantonio.tempo.subsonic.models.Playlist;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
public class PlaylistChooserViewModel extends AndroidViewModel { public class PlaylistChooserViewModel extends AndroidViewModel {
@ -34,8 +34,19 @@ public class PlaylistChooserViewModel extends AndroidViewModel {
return playlists; return playlists;
} }
public void addSongsToPlaylist(String playlistId) { public void addSongsToPlaylist(LifecycleOwner owner, Dialog dialog, String playlistId, boolean skipDuplicates) {
playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(Lists.transform(toAdd, Child::getId))); List<String> songIds = Lists.transform(toAdd, Child::getId);
if (skipDuplicates) {
playlistRepository.getPlaylistSongs(playlistId).observe(owner, playlistSongs -> {
List<String> 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<Child> songs) { public void setSongsToAdd(ArrayList<Child> songs) {

View file

@ -19,7 +19,15 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/playlist_dialog_recycler_view" android:id="@+id/playlist_dialog_recycler_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:clipToPadding="false" /> android:clipToPadding="false" />
<CheckBox
android:id="@+id/playlist_chooser_dialog_skip_duplicates"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/playlist_chooser_dialog_skip_duplicates"
android:checked="true" />
</LinearLayout> </LinearLayout>

View file

@ -207,6 +207,7 @@
<string name="playlist_chooser_dialog_negative_button">Cancel</string> <string name="playlist_chooser_dialog_negative_button">Cancel</string>
<string name="playlist_chooser_dialog_neutral_button">Create</string> <string name="playlist_chooser_dialog_neutral_button">Create</string>
<string name="playlist_chooser_dialog_title">Add to a playlist</string> <string name="playlist_chooser_dialog_title">Add to a playlist</string>
<string name="playlist_chooser_dialog_skip_duplicates">Skip duplicates</string>
<string name="playlist_chooser_dialog_toast_add_success">Added song to playlist</string> <string name="playlist_chooser_dialog_toast_add_success">Added song to playlist</string>
<string name="playlist_chooser_dialog_toast_add_failure">Failed to add song to playlist</string> <string name="playlist_chooser_dialog_toast_add_failure">Failed to add song to playlist</string>
<string name="playlist_counted_tracks">%1$d tracks • %2$s</string> <string name="playlist_counted_tracks">%1$d tracks • %2$s</string>