chg: Move the playlist duplicates option to preferences

As per the recommendation of @eddyizm
This commit is contained in:
SinTan1729 2025-10-06 21:47:57 -05:00
parent a22883fdde
commit 1c2f1aa061
No known key found for this signature in database
GPG key ID: 0538DD402EA50898
6 changed files with 43 additions and 28 deletions

View file

@ -27,7 +27,6 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba
private PlaylistDialogHorizontalAdapter playlistDialogHorizontalAdapter; private PlaylistDialogHorizontalAdapter playlistDialogHorizontalAdapter;
private boolean SkipDuplicates;
@NonNull @NonNull
@Override @Override
@ -80,15 +79,10 @@ 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()) {
@ -107,7 +101,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(this, getDialog(), playlist.getId(), SkipDuplicates); playlistChooserViewModel.addSongsToPlaylist(this, getDialog(), playlist.getId());
} 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

@ -69,6 +69,7 @@ object Preferences {
private const val NEXT_UPDATE_CHECK = "next_update_check" private const val NEXT_UPDATE_CHECK = "next_update_check"
private const val CONTINUOUS_PLAY = "continuous_play" private const val CONTINUOUS_PLAY = "continuous_play"
private const val LAST_INSTANT_MIX = "last_instant_mix" private const val LAST_INSTANT_MIX = "last_instant_mix"
private const val ALLOW_PLAYLIST_DUPLICATES = "allow_playlist_duplicates"
@JvmStatic @JvmStatic
@ -538,4 +539,17 @@ object Preferences {
LAST_INSTANT_MIX, 0 LAST_INSTANT_MIX, 0
) + 5000 < System.currentTimeMillis() ) + 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)
}
} }

View file

@ -2,6 +2,7 @@ package com.cappielloantonio.tempo.viewmodel;
import android.app.Application; import android.app.Application;
import android.app.Dialog; import android.app.Dialog;
import android.content.SharedPreferences;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.AndroidViewModel;
@ -12,6 +13,7 @@ import androidx.lifecycle.MutableLiveData;
import com.cappielloantonio.tempo.repository.PlaylistRepository; import com.cappielloantonio.tempo.repository.PlaylistRepository;
import com.cappielloantonio.tempo.subsonic.models.Child; import com.cappielloantonio.tempo.subsonic.models.Child;
import com.cappielloantonio.tempo.subsonic.models.Playlist; import com.cappielloantonio.tempo.subsonic.models.Playlist;
import com.cappielloantonio.tempo.util.Preferences;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.util.ArrayList; import java.util.ArrayList;
@ -34,9 +36,12 @@ public class PlaylistChooserViewModel extends AndroidViewModel {
return playlists; return playlists;
} }
public void addSongsToPlaylist(LifecycleOwner owner, Dialog dialog, String playlistId, boolean skipDuplicates) { public void addSongsToPlaylist(LifecycleOwner owner, Dialog dialog, String playlistId) {
List<String> songIds = Lists.transform(toAdd, Child::getId); List<String> 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 -> { playlistRepository.getPlaylistSongs(playlistId).observe(owner, playlistSongs -> {
if (playlistSongs != null) { if (playlistSongs != null) {
List<String> playlistSongIds = Lists.transform(playlistSongs, Child::getId); List<String> playlistSongIds = Lists.transform(playlistSongs, Child::getId);
@ -45,9 +50,6 @@ public class PlaylistChooserViewModel extends AndroidViewModel {
playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds)); playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds));
dialog.dismiss(); dialog.dismiss();
}); });
} else {
playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(songIds));
dialog.dismiss();
} }
} }

View file

@ -23,12 +23,4 @@
android:layout_weight="1" 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:layout_marginStart="20dp"
android:text="@string/playlist_chooser_dialog_skip_duplicates"
android:checked="true" />
</LinearLayout> </LinearLayout>

View file

@ -207,7 +207,6 @@
<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>
@ -276,6 +275,8 @@
<string name="settings_about_summary">Tempo is an open source and lightweight music client for Subsonic, designed and built natively for Android.</string> <string name="settings_about_summary">Tempo is an open source and lightweight music client for Subsonic, designed and built natively for Android.</string>
<string name="settings_about_title">About</string> <string name="settings_about_title">About</string>
<string name="settings_always_on_display">Always on display</string> <string name="settings_always_on_display">Always on display</string>
<string name="settings_allow_playlist_duplicates">Allow adding duplicates to playlist</string>
<string name="settings_allow_playlist_duplicates_summary">If enabled, duplicates won\'t be checked while adding to a playlist.</string>
<string name="settings_audio_transcode_download_format">Transcode format</string> <string name="settings_audio_transcode_download_format">Transcode format</string>
<string name="settings_audio_transcode_download_priority_summary">If enabled, Tempo will not force download the track with the transcode settings below.</string> <string name="settings_audio_transcode_download_priority_summary">If enabled, Tempo will not force download the track with the transcode settings below.</string>
<string name="settings_audio_transcode_download_priority_title">Prioritize server settings used for streaming in downloads</string> <string name="settings_audio_transcode_download_priority_title">Prioritize server settings used for streaming in downloads</string>

View file

@ -2,9 +2,10 @@
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory app:title="@string/settings_title_general"> <PreferenceCategory app:title="@string/settings_title_general">
<Preference <Preference
android:layout_height="match_parent"
android:key="equalizer" android:key="equalizer"
android:title="@string/settings_equalizer_title" android:summary="@string/settings_equalizer_summary"
android:summary="@string/settings_equalizer_summary" /> android:title="@string/settings_equalizer_title" />
<Preference <Preference
android:key="scan_library" android:key="scan_library"
@ -17,10 +18,11 @@
<PreferenceCategory app:title="@string/settings_title_ui"> <PreferenceCategory app:title="@string/settings_title_ui">
<ListPreference <ListPreference
android:layout_height="match_parent"
app:defaultValue="default" app:defaultValue="default"
app:dialogTitle="@string/settings_language" app:dialogTitle="@string/settings_language"
app:key="language" app:key="language"
app:title="@string/settings_language"/> app:title="@string/settings_language" />
<ListPreference <ListPreference
app:defaultValue="default" app:defaultValue="default"
@ -37,10 +39,11 @@
android:key="always_on_display" /> android:key="always_on_display" />
<SwitchPreference <SwitchPreference
android:title="@string/settings_rounded_corner" android:layout_height="match_parent"
android:defaultValue="true" android:defaultValue="true"
android:key="rounded_corner"
android:summary="@string/settings_rounded_corner_summary" android:summary="@string/settings_rounded_corner_summary"
android:key="rounded_corner" /> android:title="@string/settings_rounded_corner" />
<ListPreference <ListPreference
app:defaultValue="6" app:defaultValue="6"
@ -52,10 +55,11 @@
app:useSimpleSummaryProvider="true" /> app:useSimpleSummaryProvider="true" />
<SwitchPreference <SwitchPreference
android:title="@string/settings_audio_quality" android:layout_height="wrap_content"
android:defaultValue="false" android:defaultValue="false"
android:key="audio_quality_per_item"
android:summary="@string/settings_audio_quality_summary" android:summary="@string/settings_audio_quality_summary"
android:key="audio_quality_per_item" /> android:title="@string/settings_audio_quality" />
<SwitchPreference <SwitchPreference
android:title="@string/settings_song_rating" android:title="@string/settings_song_rating"
@ -88,6 +92,14 @@
android:key="music_directory_section_visibility" /> android:key="music_directory_section_visibility" />
</PreferenceCategory> </PreferenceCategory>
<PreferenceCategory app:title="Playlist">
<SwitchPreference
android:title="@string/settings_allow_playlist_duplicates"
android:defaultValue="false"
android:summary="@string/settings_allow_playlist_duplicates_summary"
android:key="allow_playlist_duplicates" />
</PreferenceCategory>
<PreferenceCategory app:title="@string/settings_title_data"> <PreferenceCategory app:title="@string/settings_title_data">
<ListPreference <ListPreference
app:defaultValue="256" app:defaultValue="256"