From e1d63a9eef146fba6d4338d50df33bb283085d25 Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Fri, 26 Sep 2025 16:24:21 -0500 Subject: [PATCH 01/11] feat: Support skipping duplicates --- .../tempo/ui/dialog/PlaylistChooserDialog.java | 10 ++++++++-- .../viewmodel/PlaylistChooserViewModel.java | 17 ++++++++++++++--- .../main/res/layout/dialog_playlist_chooser.xml | 10 +++++++++- app/src/main/res/values/strings.xml | 1 + 4 files changed, 32 insertions(+), 6 deletions(-) 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 From e790bf3eb62403b70b68578f90d7c8d006227cd0 Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Fri, 26 Sep 2025 16:39:46 -0500 Subject: [PATCH 02/11] chg: Comment out unused code --- .../tempo/repository/PlaylistRepository.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) 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..2be53b56 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java +++ b/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java @@ -131,22 +131,22 @@ 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 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) From 9736890e3c20a394867baaf8cab60d6fee95fe2f Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Fri, 26 Sep 2025 16:48:56 -0500 Subject: [PATCH 03/11] fix: Show proper number in add to playlist dialog toast --- .../cappielloantonio/tempo/repository/PlaylistRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2be53b56..0970bbb1 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java +++ b/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java @@ -87,7 +87,7 @@ public class PlaylistRepository { .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(); + Toast.makeText(App.getContext(), App.getContext().getString(R.string.playlist_chooser_dialog_toast_add_success) + " x " + songsId.toArray().length, Toast.LENGTH_SHORT).show(); } @Override From 2acf11023af5934894dba9b1c6dfd028987c5024 Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Fri, 26 Sep 2025 19:19:23 -0500 Subject: [PATCH 04/11] fix: Crash when trying to add to an empty playlist --- .../tempo/viewmodel/PlaylistChooserViewModel.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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 82e0418b..89a948e4 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java @@ -38,8 +38,10 @@ public class PlaylistChooserViewModel extends AndroidViewModel { 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); + if (playlistSongs != null) { + List playlistSongIds = Lists.transform(playlistSongs, Child::getId); + songIds.removeAll(playlistSongIds); + } playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds)); dialog.dismiss(); }); From a22883fdde2210adc01a2baca208e626718fcd9d Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Fri, 26 Sep 2025 22:51:52 -0500 Subject: [PATCH 05/11] fix: The layout should be more in line with the playlist entries --- app/src/main/res/layout/dialog_playlist_chooser.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/layout/dialog_playlist_chooser.xml b/app/src/main/res/layout/dialog_playlist_chooser.xml index 1c7690e4..76a44147 100644 --- a/app/src/main/res/layout/dialog_playlist_chooser.xml +++ b/app/src/main/res/layout/dialog_playlist_chooser.xml @@ -28,6 +28,7 @@ android:id="@+id/playlist_chooser_dialog_skip_duplicates" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginStart="20dp" android:text="@string/playlist_chooser_dialog_skip_duplicates" android:checked="true" /> \ No newline at end of file From 1c2f1aa061d33788cbed00542f12ae4291dceb17 Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Mon, 6 Oct 2025 21:47:57 -0500 Subject: [PATCH 06/11] chg: Move the playlist duplicates option to preferences As per the recommendation of @eddyizm --- .../ui/dialog/PlaylistChooserDialog.java | 8 +----- .../tempo/util/Preferences.kt | 14 ++++++++++ .../viewmodel/PlaylistChooserViewModel.java | 12 +++++---- .../res/layout/dialog_playlist_chooser.xml | 8 ------ app/src/main/res/values/strings.xml | 3 ++- app/src/main/res/xml/global_preferences.xml | 26 ++++++++++++++----- 6 files changed, 43 insertions(+), 28 deletions(-) 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 7337e930..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,7 +27,6 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba private PlaylistDialogHorizontalAdapter playlistDialogHorizontalAdapter; - private boolean SkipDuplicates; @NonNull @Override @@ -80,15 +79,10 @@ 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()) { @@ -107,7 +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(this, getDialog(), playlist.getId(), SkipDuplicates); + 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 8c77ab13..81197abe 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt @@ -69,6 +69,7 @@ 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" @JvmStatic @@ -538,4 +539,17 @@ object Preferences { LAST_INSTANT_MIX, 0 ) + 5000 < System.currentTimeMillis() } + + @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) + } } \ No newline at end of file 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 89a948e4..ca7af150 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java @@ -2,6 +2,7 @@ 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; @@ -12,6 +13,7 @@ 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; @@ -34,9 +36,12 @@ public class PlaylistChooserViewModel extends AndroidViewModel { return playlists; } - public void addSongsToPlaylist(LifecycleOwner owner, Dialog dialog, String playlistId, boolean skipDuplicates) { + public void addSongsToPlaylist(LifecycleOwner owner, Dialog dialog, String playlistId) { List songIds = Lists.transform(toAdd, Child::getId); - if (skipDuplicates) { + 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); @@ -45,9 +50,6 @@ public class PlaylistChooserViewModel extends AndroidViewModel { playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds)); dialog.dismiss(); }); - } else { - playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds)); - dialog.dismiss(); } } diff --git a/app/src/main/res/layout/dialog_playlist_chooser.xml b/app/src/main/res/layout/dialog_playlist_chooser.xml index 76a44147..3be03136 100644 --- a/app/src/main/res/layout/dialog_playlist_chooser.xml +++ b/app/src/main/res/layout/dialog_playlist_chooser.xml @@ -23,12 +23,4 @@ android:layout_weight="1" android:layout_marginTop="8dp" android:clipToPadding="false" /> - - \ 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 fbdcff4b..eb8abbc4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -207,7 +207,6 @@ Cancel Create Add to a playlist - Skip duplicates Added song to playlist Failed to add song to playlist %1$d tracks • %2$s @@ -276,6 +275,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 diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index 09afcb1d..81ce41df 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -2,9 +2,10 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + android:summary="@string/settings_equalizer_summary" + android:title="@string/settings_equalizer_title" /> + app:title="@string/settings_language" /> + android:title="@string/settings_rounded_corner" /> + android:title="@string/settings_audio_quality" /> + + + + Date: Mon, 6 Oct 2025 21:48:42 -0500 Subject: [PATCH 07/11] fix: Removed unnecessary code --- .../tempo/repository/PlaylistRepository.java | 17 ----------------- 1 file changed, 17 deletions(-) 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 0970bbb1..675fc1f8 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java +++ b/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java @@ -131,23 +131,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() From cd8b06f544f46b5788904df42d115c06fbcaccf3 Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Mon, 6 Oct 2025 21:50:00 -0500 Subject: [PATCH 08/11] fix: Reverted old toast while adding to playlist --- .../cappielloantonio/tempo/repository/PlaylistRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 675fc1f8..9a8369a1 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java +++ b/app/src/main/java/com/cappielloantonio/tempo/repository/PlaylistRepository.java @@ -87,7 +87,7 @@ public class PlaylistRepository { .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) + " x " + songsId.toArray().length, Toast.LENGTH_SHORT).show(); + Toast.makeText(App.getContext(), App.getContext().getString(R.string.playlist_chooser_dialog_toast_add_success), Toast.LENGTH_SHORT).show(); } @Override From 9d5d89d6483a296bee5b4a5c5cb6099e63a6264a Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Mon, 6 Oct 2025 21:58:41 -0500 Subject: [PATCH 09/11] new: Separate toast for when all songs were skipped Also, fixed grammatical issue in toast where they were all singular. --- .../tempo/repository/PlaylistRepository.java | 30 +++++++++++-------- app/src/main/res/values/strings.xml | 5 ++-- 2 files changed, 20 insertions(+), 15 deletions(-) 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 9a8369a1..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) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index eb8abbc4..48ad3cd7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -207,8 +207,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 From 328beaff9035f0a2f3106204c025100c7255b2de Mon Sep 17 00:00:00 2001 From: SinTan1729 Date: Mon, 6 Oct 2025 22:04:23 -0500 Subject: [PATCH 10/11] fix: Use string for settings section name --- app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/global_preferences.xml | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 48ad3cd7..8dc6a5ef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -356,6 +356,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 81ce41df..96aa6093 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -25,6 +25,7 @@ app:title="@string/settings_language" /> - + Date: Mon, 6 Oct 2025 21:43:30 -0700 Subject: [PATCH 11/11] fix: updated settings stitles, merge conflict --- app/src/main/res/values-pl/strings.xml | 4 ++-- app/src/main/res/xml/global_preferences.xml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 759a0106..1dc81873 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -304,8 +304,8 @@ Zatwierdzenie nieodwracalnie usunie wszystkie zapisane elementy Usuń zapisane elementy Pamięć do pobierania - Zmień ustawienia audio - Korektor systemowy + Zmień ustawienia audio + Korektor systemowy https://github.com/eddyizm/tempo Śledź tworzenie aplikacji GitHub diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index fbde33eb..a9d0591a 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -4,8 +4,8 @@ + android:summary="@string/settings_system_equalizer_summary" + android:title="@string/settings_system_equalizer_title" />