From 3cd5843c4bc14dae0a9bfd436ec703b269685d1f Mon Sep 17 00:00:00 2001 From: eddyizm Date: Sun, 18 Jan 2026 16:39:28 -0800 Subject: [PATCH] feat: sort preference for playlists (#370) --- .../com/cappielloantonio/tempo/util/Preferences.kt | 12 ++++++++++++ .../tempo/viewmodel/HomeViewModel.java | 14 +++++++++++--- app/src/main/res/values/arrays.xml | 10 ++++++++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/global_preferences.xml | 8 ++++++++ 5 files changed, 42 insertions(+), 3 deletions(-) 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 542adc8f..14e33e39 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt +++ b/app/src/main/java/com/cappielloantonio/tempo/util/Preferences.kt @@ -74,6 +74,8 @@ object Preferences { 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 HOME_SORT_PLAYLISTS = "home_sort_playlists" + private const val DEFAULT_HOME_SORT_PLAYLISTS_SORT_ORDER = Constants.PLAYLIST_ORDER_BY_RANDOM 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" @@ -625,6 +627,16 @@ object Preferences { return App.getInstance().preferences.getBoolean(ALLOW_PLAYLIST_DUPLICATES, false) } + @JvmStatic + fun getHomeSortPlaylists(): String { + return App.getInstance().preferences.getString(HOME_SORT_PLAYLISTS, DEFAULT_HOME_SORT_PLAYLISTS_SORT_ORDER) ?: DEFAULT_HOME_SORT_PLAYLISTS_SORT_ORDER + } + + @JvmStatic + fun getHomeSortPlaylists(sortOrder: String) { + App.getInstance().preferences.edit().putString(HOME_SORT_PLAYLISTS, sortOrder).apply() + } + @JvmStatic fun setEqualizerEnabled(enabled: Boolean) { App.getInstance().preferences.edit().putBoolean(EQUALIZER_ENABLED, enabled).apply() diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/HomeViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/HomeViewModel.java index 86d1f456..42ff0b25 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/HomeViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/HomeViewModel.java @@ -24,6 +24,7 @@ import com.cappielloantonio.tempo.subsonic.models.ArtistID3; import com.cappielloantonio.tempo.subsonic.models.Child; import com.cappielloantonio.tempo.subsonic.models.Playlist; import com.cappielloantonio.tempo.subsonic.models.Share; +import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.Constants.SeedType; import com.cappielloantonio.tempo.util.Preferences; import com.google.common.reflect.TypeToken; @@ -250,12 +251,19 @@ public class HomeViewModel extends AndroidViewModel { playlistRepository.getPlaylists(false, -1).observe(owner, remotes -> { if (remotes != null && !remotes.isEmpty()) { List playlists = new ArrayList<>(remotes); - Collections.shuffle(playlists); - List randomPlaylists = playlists.size() > 5 + String result = Preferences.getHomeSortPlaylists(); + if (Preferences.getHomeSortPlaylists().equals(Constants.PLAYLIST_ORDER_BY_RANDOM)) + { + Collections.shuffle(playlists); + } + else { + playlists.sort(Comparator.comparing(Playlist::getName)); + } + List subsetPlaylists = playlists.size() > 5 ? playlists.subList(0, 5) : playlists; - pinnedPlaylists.setValue(randomPlaylists); + pinnedPlaylists.setValue(subsetPlaylists); } }); diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index b5713e03..2850cd63 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -240,6 +240,16 @@ 8 + + Name + Random + + + ORDER_BY_NAME + ORDER_BY_RANDOM + + + 0 star minimum 1 star minimum diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ed75e158..ff7840c7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -361,6 +361,7 @@ If enabled, show the music directory section. Please note that for folder navigation to work properly, the server must support this feature. Show podcast If enabled, show the podcast section. Restart the app for it to take full effect. + Playlist sorting Show audio quality The bitrate and audio format will be shown for each audio track. Show song star rating diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index 0f5c71ea..fdf6938a 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -136,6 +136,14 @@ android:defaultValue="false" android:summary="@string/settings_allow_playlist_duplicates_summary" android:key="allow_playlist_duplicates" /> +