Upgrade detail sorting

Upgrade the detail sorting system to:
- Persist beyond the app lifecycle [as other sort modes do]
- Be used when creating a queue for a genre/artist/album
This commit is contained in:
OxygenCobalt 2021-04-28 18:30:49 -06:00
parent e72f448a89
commit e7d36311dd
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
3 changed files with 59 additions and 15 deletions

View file

@ -8,6 +8,7 @@ import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.BaseModel import org.oxycblt.auxio.music.BaseModel
import org.oxycblt.auxio.music.Genre import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.recycler.SortMode import org.oxycblt.auxio.recycler.SortMode
import org.oxycblt.auxio.settings.SettingsManager
/** /**
* ViewModel that stores data for the [DetailFragment]s, such as what they're showing & what * ViewModel that stores data for the [DetailFragment]s, such as what they're showing & what
@ -15,28 +16,35 @@ import org.oxycblt.auxio.recycler.SortMode
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class DetailViewModel : ViewModel() { class DetailViewModel : ViewModel() {
private val settingsManager = SettingsManager.getInstance()
// --- CURRENT VALUES ---
private val mCurrentGenre = MutableLiveData<Genre?>() private val mCurrentGenre = MutableLiveData<Genre?>()
val currentGenre: LiveData<Genre?> get() = mCurrentGenre val currentGenre: LiveData<Genre?> get() = mCurrentGenre
val mCurrentArtist = MutableLiveData<Artist?>() private val mCurrentArtist = MutableLiveData<Artist?>()
val currentArtist: LiveData<Artist?> get() = mCurrentArtist val currentArtist: LiveData<Artist?> get() = mCurrentArtist
private val mCurrentAlbum = MutableLiveData<Album?>() private val mCurrentAlbum = MutableLiveData<Album?>()
val currentAlbum: LiveData<Album?> get() = mCurrentAlbum val currentAlbum: LiveData<Album?> get() = mCurrentAlbum
private val mGenreSortMode = MutableLiveData(SortMode.ALPHA_DOWN) // --- SORT MODES ---
private val mGenreSortMode = MutableLiveData(settingsManager.genreSortMode)
val genreSortMode: LiveData<SortMode> get() = mGenreSortMode val genreSortMode: LiveData<SortMode> get() = mGenreSortMode
private val mArtistSortMode = MutableLiveData(SortMode.NUMERIC_DOWN) private val mArtistSortMode = MutableLiveData(settingsManager.artistSortMode)
val albumSortMode: LiveData<SortMode> get() = mAlbumSortMode val albumSortMode: LiveData<SortMode> get() = mAlbumSortMode
private val mAlbumSortMode = MutableLiveData(SortMode.NUMERIC_DOWN) private val mAlbumSortMode = MutableLiveData(settingsManager.albumSortMode)
val artistSortMode: LiveData<SortMode> get() = mArtistSortMode val artistSortMode: LiveData<SortMode> get() = mArtistSortMode
private var mIsNavigating = false private var mIsNavigating = false
val isNavigating: Boolean get() = mIsNavigating val isNavigating: Boolean get() = mIsNavigating
private val mNavToItem = MutableLiveData<BaseModel?>() private val mNavToItem = MutableLiveData<BaseModel?>()
/** Flag for unified navigation. Observe this to coordinate navigation to an item's UI. */ /** Flag for unified navigation. Observe this to coordinate navigation to an item's UI. */
val navToItem: LiveData<BaseModel?> get() = mNavToItem val navToItem: LiveData<BaseModel?> get() = mNavToItem
@ -56,19 +64,22 @@ class DetailViewModel : ViewModel() {
* Increment the sort mode of the genre artists * Increment the sort mode of the genre artists
*/ */
fun incrementGenreSortMode() { fun incrementGenreSortMode() {
mGenreSortMode.value = when (mGenreSortMode.value) { val mode = when (mGenreSortMode.value) {
SortMode.ALPHA_DOWN -> SortMode.ALPHA_UP SortMode.ALPHA_DOWN -> SortMode.ALPHA_UP
SortMode.ALPHA_UP -> SortMode.ALPHA_DOWN SortMode.ALPHA_UP -> SortMode.ALPHA_DOWN
else -> SortMode.ALPHA_DOWN else -> SortMode.ALPHA_DOWN
} }
mGenreSortMode.value = mode
settingsManager.genreSortMode = mode
} }
/** /**
* Increment the sort mode of the artist albums * Increment the sort mode of the artist albums
*/ */
fun incrementArtistSortMode() { fun incrementArtistSortMode() {
mArtistSortMode.value = when (mArtistSortMode.value) { val mode = when (mArtistSortMode.value) {
SortMode.NUMERIC_DOWN -> SortMode.NUMERIC_UP SortMode.NUMERIC_DOWN -> SortMode.NUMERIC_UP
SortMode.NUMERIC_UP -> SortMode.ALPHA_DOWN SortMode.NUMERIC_UP -> SortMode.ALPHA_DOWN
SortMode.ALPHA_DOWN -> SortMode.ALPHA_UP SortMode.ALPHA_DOWN -> SortMode.ALPHA_UP
@ -76,18 +87,24 @@ class DetailViewModel : ViewModel() {
else -> SortMode.NUMERIC_DOWN else -> SortMode.NUMERIC_DOWN
} }
mArtistSortMode.value = mode
settingsManager.artistSortMode = mode
} }
/** /**
* Increment the sort mode of the album song * Increment the sort mode of the album song
*/ */
fun incrementAlbumSortMode() { fun incrementAlbumSortMode() {
mAlbumSortMode.value = when (mAlbumSortMode.value) { val mode = when (mAlbumSortMode.value) {
SortMode.NUMERIC_DOWN -> SortMode.NUMERIC_UP SortMode.NUMERIC_DOWN -> SortMode.NUMERIC_UP
SortMode.NUMERIC_UP -> SortMode.NUMERIC_DOWN SortMode.NUMERIC_UP -> SortMode.NUMERIC_DOWN
else -> SortMode.NUMERIC_DOWN else -> SortMode.NUMERIC_DOWN
} }
mAlbumSortMode.value = mode
settingsManager.albumSortMode = mAlbumSortMode.value!!
} }
/** /**

View file

@ -14,7 +14,6 @@ import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.MusicStore import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Parent import org.oxycblt.auxio.music.Parent
import org.oxycblt.auxio.music.Song import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.recycler.SortMode
import org.oxycblt.auxio.settings.SettingsManager import org.oxycblt.auxio.settings.SettingsManager
/** /**
@ -25,8 +24,6 @@ import org.oxycblt.auxio.settings.SettingsManager
* - If you want to use the playback state with the ExoPlayer instance or system-side things, use [org.oxycblt.auxio.playback.system.PlaybackService]. * - If you want to use the playback state with the ExoPlayer instance or system-side things, use [org.oxycblt.auxio.playback.system.PlaybackService].
* *
* All access should be done with [PlaybackStateManager.getInstance]. * All access should be done with [PlaybackStateManager.getInstance].
*
* TODO: Queues should reflect sort mode
* @author OxygenCobalt * @author OxygenCobalt
*/ */
class PlaybackStateManager private constructor() { class PlaybackStateManager private constructor() {
@ -719,21 +716,21 @@ class PlaybackStateManager private constructor() {
* Create an ordered queue based on an [Album]. * Create an ordered queue based on an [Album].
*/ */
private fun orderSongsInAlbum(album: Album): MutableList<Song> { private fun orderSongsInAlbum(album: Album): MutableList<Song> {
return SortMode.NUMERIC_DOWN.getSortedSongList(album.songs).toMutableList() return settingsManager.albumSortMode.getSortedSongList(album.songs).toMutableList()
} }
/** /**
* Create an ordered queue based on an [Artist]. * Create an ordered queue based on an [Artist].
*/ */
private fun orderSongsInArtist(artist: Artist): MutableList<Song> { private fun orderSongsInArtist(artist: Artist): MutableList<Song> {
return SortMode.NUMERIC_DOWN.getSortedArtistSongList(artist.songs).toMutableList() return settingsManager.artistSortMode.getSortedArtistSongList(artist.songs).toMutableList()
} }
/** /**
* Create an ordered queue based on a [Genre]. * Create an ordered queue based on a [Genre].
*/ */
private fun orderSongsInGenre(genre: Genre): MutableList<Song> { private fun orderSongsInGenre(genre: Genre): MutableList<Song> {
return SortMode.ALPHA_DOWN.getSortedSongList(genre.songs).toMutableList() return settingsManager.genreSortMode.getSortedSongList(genre.songs).toMutableList()
} }
/** /**

View file

@ -95,8 +95,7 @@ class SettingsManager private constructor(context: Context) :
/** The current [SortMode] of the library. */ /** The current [SortMode] of the library. */
var librarySortMode: SortMode var librarySortMode: SortMode
get() = sharedPrefs.getData(KEY_LIB_SORT_MODE, SortMode::fromInt) get() = sharedPrefs.getData(KEY_LIB_SORT_MODE, SortMode::fromInt) ?: SortMode.ALPHA_DOWN
?: SortMode.ALPHA_DOWN
set(value) { set(value) {
sharedPrefs.edit { sharedPrefs.edit {
@ -105,6 +104,33 @@ class SettingsManager private constructor(context: Context) :
} }
} }
var albumSortMode: SortMode
get() = sharedPrefs.getData(KEY_ALBUM_SORT_MODE, SortMode::fromInt) ?: SortMode.NUMERIC_DOWN
set(value) {
sharedPrefs.edit {
putInt(KEY_ALBUM_SORT_MODE, value.toInt())
apply()
}
}
var artistSortMode: SortMode
get() = sharedPrefs.getData(KEY_ARTIST_SORT_MODE, SortMode::fromInt) ?: SortMode.NUMERIC_DOWN
set(value) {
sharedPrefs.edit {
putInt(KEY_ARTIST_SORT_MODE, value.toInt())
apply()
}
}
var genreSortMode: SortMode
get() = sharedPrefs.getData(KEY_GENRE_SORT_MODE, SortMode::fromInt) ?: SortMode.ALPHA_DOWN
set(value) {
sharedPrefs.edit {
putInt(KEY_GENRE_SORT_MODE, value.toInt())
apply()
}
}
/** The current filter mode of the search tab */ /** The current filter mode of the search tab */
var searchFilterMode: DisplayMode var searchFilterMode: DisplayMode
get() = handleSearchModeCompat(sharedPrefs) get() = handleSearchModeCompat(sharedPrefs)
@ -188,6 +214,10 @@ class SettingsManager private constructor(context: Context) :
const val KEY_BLACKLIST = "KEY_BLACKLIST" const val KEY_BLACKLIST = "KEY_BLACKLIST"
const val KEY_LIB_SORT_MODE = "KEY_LIBRARY_SORT_MODE" const val KEY_LIB_SORT_MODE = "KEY_LIBRARY_SORT_MODE"
const val KEY_ALBUM_SORT_MODE = "KEY_ALBUM_SORT"
const val KEY_ARTIST_SORT_MODE = "KEY_ARTIST_SORT"
const val KEY_GENRE_SORT_MODE = "KEY_GENRE_SORT"
const val KEY_SEARCH_FILTER_MODE = "KEY_SEARCH_FILTER" const val KEY_SEARCH_FILTER_MODE = "KEY_SEARCH_FILTER"
@Volatile @Volatile