From f3a2d94086bf2afa8aec27f43d3d103f3391c7ff Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Wed, 22 Mar 2023 17:21:28 -0600 Subject: [PATCH] music: add playlist song sorting Add the internal sort modes for playlist songs. Theoretically this might be better as playlist-specific, but it's harder to integrate that currently. --- .../org/oxycblt/auxio/music/MusicSettings.kt | 16 ++++++++++++++-- .../oxycblt/auxio/playback/PlaybackViewModel.kt | 10 ++++++---- app/src/main/res/values/settings.xml | 1 + 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicSettings.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicSettings.kt index 94d7e9968..23ce121ad 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicSettings.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicSettings.kt @@ -60,9 +60,11 @@ interface MusicSettings : Settings { var albumSongSort: Sort /** The [Sort] mode used in an [Artist]'s [Song] list. */ var artistSongSort: Sort - /** The [Sort] mode used in an [Genre]'s [Song] list. */ + /** The [Sort] mode used in a [Genre]'s [Song] list. */ var genreSongSort: Sort - /** The [] */ + /** The [Sort] mode used in a [Playlist]'s [Song] list, or null if sorting by original ordering. */ + var playlistSongSort: Sort? + interface Listener { /** Called when a setting controlling how music is loaded has changed. */ fun onIndexingSettingChanged() {} @@ -222,6 +224,16 @@ class MusicSettingsImpl @Inject constructor(@ApplicationContext context: Context } } + override var playlistSongSort: Sort? + get() = Sort.fromIntCode(sharedPreferences.getInt( + getString(R.string.set_key_playlist_songs_sort), Int.MIN_VALUE)) + set(value) { + sharedPreferences.edit { + putInt(getString(R.string.lbl_playlist), value?.intCode ?: -1) + apply() + } + } + override fun onSettingChanged(key: String, listener: MusicSettings.Listener) { // TODO: Differentiate "hard reloads" (Need the cache) and "Soft reloads" // (just need to manipulate data) diff --git a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt index f5f177005..f000a02b5 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/PlaybackViewModel.kt @@ -20,6 +20,7 @@ package org.oxycblt.auxio.playback import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import androidx.room.util.query import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.Job @@ -288,10 +289,11 @@ constructor( is Genre -> musicSettings.genreSongSort is Artist -> musicSettings.artistSongSort is Album -> musicSettings.albumSongSort - is Playlist -> TODO("handle this") + is Playlist -> musicSettings.playlistSongSort null -> musicSettings.songSort } - val queue = sort.songs(parent?.songs ?: deviceLibrary.songs) + val songs = parent?.songs ?: deviceLibrary.songs + val queue = sort?.songs(songs) ?: songs playbackManager.play(song, parent, queue, shuffled) } @@ -489,11 +491,11 @@ constructor( private fun selectionToSongs(selection: List): List { return selection.flatMap { when (it) { + is Song -> listOf(it) is Album -> musicSettings.albumSongSort.songs(it.songs) is Artist -> musicSettings.artistSongSort.songs(it.songs) is Genre -> musicSettings.genreSongSort.songs(it.songs) - is Song -> listOf(it) - is Playlist -> TODO("handle this") + is Playlist -> musicSettings.playlistSongSort?.songs(it.songs) ?: it.songs } } } diff --git a/app/src/main/res/values/settings.xml b/app/src/main/res/values/settings.xml index faab5d5cd..e9e9d5f2b 100644 --- a/app/src/main/res/values/settings.xml +++ b/app/src/main/res/values/settings.xml @@ -52,6 +52,7 @@ auxio_album_sort auxio_artist_sort auxio_genre_sort + auxio_playlist_sort @string/set_theme_auto