diff --git a/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java b/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java index 7884159f..f87cd577 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java +++ b/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java @@ -81,20 +81,24 @@ public class PlaylistRepository { } public void addSongToPlaylist(String playlistId, ArrayList songsId) { - App.getSubsonicClientInstance(false) - .getPlaylistClient() - .updatePlaylist(playlistId, null, true, songsId, null) - .enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - Toast.makeText(App.getContext(), App.getContext().getString(R.string.playlist_chooser_dialog_toast_add_success), Toast.LENGTH_SHORT).show(); - } + if (songsId.isEmpty()) { + Toast.makeText(App.getContext(), App.getContext().getString(R.string.playlist_chooser_dialog_toast_all_skipped), Toast.LENGTH_SHORT).show(); + } else{ + App.getSubsonicClientInstance(false) + .getPlaylistClient() + .updatePlaylist(playlistId, null, true, songsId, null) + .enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) { + Toast.makeText(App.getContext(), App.getContext().getString(R.string.playlist_chooser_dialog_toast_add_success), Toast.LENGTH_SHORT).show(); + } - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - Toast.makeText(App.getContext(), App.getContext().getString(R.string.playlist_chooser_dialog_toast_add_failure), Toast.LENGTH_SHORT).show(); - } - }); + @Override + public void onFailure(@NonNull Call call, @NonNull Throwable t) { + Toast.makeText(App.getContext(), App.getContext().getString(R.string.playlist_chooser_dialog_toast_add_failure), Toast.LENGTH_SHORT).show(); + } + }); + } } public void createPlaylist(String playlistId, String name, ArrayList songsId) { @@ -131,23 +135,6 @@ public class PlaylistRepository { }); } - public void updatePlaylist(String playlistId, String name, boolean isPublic, ArrayList songIdToAdd, ArrayList songIndexToRemove) { - App.getSubsonicClientInstance(false) - .getPlaylistClient() - .updatePlaylist(playlistId, name, isPublic, songIdToAdd, songIndexToRemove) - .enqueue(new Callback() { - @Override - public void onResponse(@NonNull Call call, @NonNull Response response) { - - } - - @Override - public void onFailure(@NonNull Call call, @NonNull Throwable t) { - - } - }); - } - public void deletePlaylist(String playlistId) { App.getSubsonicClientInstance(false) .getPlaylistClient() 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..a6842512 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,7 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba private PlaylistDialogHorizontalAdapter playlistDialogHorizontalAdapter; + @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { @@ -100,8 +101,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()); } 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/util/Preferences.kt b/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt index f36c363b..7abb917f 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt @@ -72,6 +72,8 @@ object Preferences { private const val NEXT_UPDATE_CHECK = "next_update_check" private const val CONTINUOUS_PLAY = "continuous_play" private const val LAST_INSTANT_MIX = "last_instant_mix" + private const val ALLOW_PLAYLIST_DUPLICATES = "allow_playlist_duplicates" + private const val EQUALIZER_ENABLED = "equalizer_enabled" private const val EQUALIZER_BAND_LEVELS = "equalizer_band_levels" private const val MINI_SHUFFLE_BUTTON_VISIBILITY = "mini_shuffle_button_visibility" @@ -599,6 +601,16 @@ object Preferences { } @JvmStatic + fun setAllowPlaylistDuplicates(allowDuplicates: Boolean) { + return App.getInstance().preferences.edit().putString( + ALLOW_PLAYLIST_DUPLICATES, + allowDuplicates.toString() + ).apply() + } + + @JvmStatic + fun allowPlaylistDuplicates(): Boolean { + return App.getInstance().preferences.getBoolean(ALLOW_PLAYLIST_DUPLICATES, false) fun setEqualizerEnabled(enabled: Boolean) { App.getInstance().preferences.edit().putBoolean(EQUALIZER_ENABLED, enabled).apply() } 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..ca7af150 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,8 @@ package com.cappielloantonio.tempo.viewmodel; import android.app.Application; +import android.app.Dialog; +import android.content.SharedPreferences; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; @@ -11,10 +13,10 @@ import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.tempo.repository.PlaylistRepository; import com.cappielloantonio.tempo.subsonic.models.Child; import com.cappielloantonio.tempo.subsonic.models.Playlist; +import com.cappielloantonio.tempo.util.Preferences; 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 +36,21 @@ 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) { + List songIds = Lists.transform(toAdd, Child::getId); + if (Preferences.allowPlaylistDuplicates()) { + playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds)); + dialog.dismiss(); + } else { + playlistRepository.getPlaylistSongs(playlistId).observe(owner, playlistSongs -> { + if (playlistSongs != null) { + List playlistSongIds = Lists.transform(playlistSongs, Child::getId); + songIds.removeAll(playlistSongIds); + } + 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..3be03136 100644 --- a/app/src/main/res/layout/dialog_playlist_chooser.xml +++ b/app/src/main/res/layout/dialog_playlist_chooser.xml @@ -19,7 +19,8 @@ \ 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 37cfa414..57426526 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -225,8 +225,9 @@ Cancel Create Add to a playlist - Added song to playlist - Failed to add song to playlist + Added song(s) to playlist + Failed to add song(s) to playlist + All songs were skipped as duplicates %1$d tracks • %2$s Duration • %1$s Long press to delete @@ -293,6 +294,8 @@ Tempo is an open source and lightweight music client for Subsonic, designed and built natively for Android. About Always on display + Allow adding duplicates to playlist + If enabled, duplicates won\'t be checked while adding to a playlist. Transcode format If enabled, Tempo will not force download the track with the transcode settings below. Prioritize server settings used for streaming in downloads @@ -380,6 +383,7 @@ Theme Data General + Playlist Rating Replay Gain Scrobble diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index e607a79a..6f27bcdd 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -1,7 +1,7 @@ - @@ -22,12 +22,14 @@ + app:title="@string/settings_language" /> + android:title="@string/settings_rounded_corner" /> + android:title="@string/settings_audio_quality" /> + + + +