From 72877f77eecd8b1993d7e4a4838361e8331ef331 Mon Sep 17 00:00:00 2001 From: OxygenCobalt Date: Tue, 9 Mar 2021 09:04:48 -0700 Subject: [PATCH] Fix parent restore bug Fix a bug where PlaybackStateManager would try to restore the parent from a full list of items, which raises the possibility for the incorrect parent to be chosen. --- .../org/oxycblt/auxio/music/MusicStore.kt | 20 +++++---------- .../playback/state/PlaybackStateManager.kt | 25 ++++++++++++++++--- .../oxycblt/auxio/settings/SettingsManager.kt | 5 ++-- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt index ecc3310e9..5a4a15fdf 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicStore.kt @@ -27,15 +27,6 @@ class MusicStore private constructor() { private var mSongs = listOf() val songs: List get() = mSongs - /** All parent models (ex Albums, Artists) loaded by Auxio */ - val parents: List by lazy { - mutableListOf().apply { - addAll(mGenres) - addAll(mArtists) - addAll(mAlbums) - } - } - /** Marker for whether the music loading process has successfully completed. */ var loaded = false private set @@ -88,12 +79,13 @@ class MusicStore private constructor() { * @return The corresponding [Song] for this [uri], null if there isnt one. */ fun getSongForUri(uri: Uri, resolver: ContentResolver): Song? { - resolver.query(uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null)?.use { cursor -> - cursor.moveToFirst() - val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) + resolver.query(uri, arrayOf(OpenableColumns.DISPLAY_NAME), null, null, null) + ?.use { cursor -> + cursor.moveToFirst() + val fileName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)) - return songs.find { it.fileName == fileName } - } + return songs.find { it.fileName == fileName } + } return null } diff --git a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt index dcbd7626f..d6a97fa3d 100644 --- a/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/playback/state/PlaybackStateManager.kt @@ -667,14 +667,18 @@ class PlaybackStateManager private constructor() { * Unpack a [playbackState] into this instance. */ private fun unpackFromPlaybackState(playbackState: PlaybackState) { - // Turn the simplified information from PlaybackState into values that can be used - mSong = musicStore.songs.find { it.name == playbackState.songName } - mParent = musicStore.parents.find { it.name == playbackState.parentName } + // Turn the simplified information from PlaybackState into usable data. + + // Do queue setup first mMode = PlaybackMode.fromInt(playbackState.mode) ?: PlaybackMode.ALL_SONGS + mParent = findParent(playbackState.parentName, mMode) + mIndex = playbackState.index + + // Then set up the current state + mSong = musicStore.songs.find { it.name == playbackState.songName } mLoopMode = LoopMode.fromInt(playbackState.loopMode) ?: LoopMode.NONE mIsShuffling = playbackState.isShuffling mIsInUserQueue = playbackState.inUserQueue - mIndex = playbackState.index seekTo(playbackState.position) } @@ -734,6 +738,19 @@ class PlaybackStateManager private constructor() { forceUserQueueUpdate() } + /** + * Get a [Parent] from music store given a [name] and playback [mode]. + */ + private fun findParent(name: String, mode: PlaybackMode): Parent? { + return when (mode) { + PlaybackMode.IN_GENRE -> musicStore.genres.find { it.name == name } + PlaybackMode.IN_ARTIST -> musicStore.artists.find { it.name == name } + PlaybackMode.IN_ALBUM -> musicStore.albums.find { it.name == name } + + else -> null + } + } + /** * Do the sanity check to make sure the parent was not lost in the restore process. */ diff --git a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt index 93d2ef682..5aa83289e 100644 --- a/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt +++ b/app/src/main/java/org/oxycblt/auxio/settings/SettingsManager.kt @@ -2,7 +2,6 @@ package org.oxycblt.auxio.settings import android.content.Context import android.content.SharedPreferences -import androidx.core.content.edit import androidx.preference.PreferenceManager import org.oxycblt.auxio.logD import org.oxycblt.auxio.playback.state.PlaybackMode @@ -71,7 +70,7 @@ class SettingsManager private constructor(context: Context) : get() = sharedPrefs.getBoolean(Keys.KEY_USE_ALT_NOTIFICATION_ACTION, false) /** What to display on the library. */ - val libraryDisplayMode: DisplayMode + val libraryDisplayMode: org.oxycblt.auxio.recycler.DisplayMode get() = DisplayMode.valueOfOrFallback( sharedPrefs.getString( Keys.KEY_LIBRARY_DISPLAY_MODE, @@ -264,7 +263,7 @@ class SettingsManager private constructor(context: Context) : interface Callback { fun onColorizeNotifUpdate(doColorize: Boolean) {} fun onNotifActionUpdate(useAltAction: Boolean) {} - fun onLibDisplayModeUpdate(displayMode: DisplayMode) {} + fun onLibDisplayModeUpdate(displayMode: org.oxycblt.auxio.recycler.DisplayMode) {} fun onShowCoverUpdate(showCovers: Boolean) {} fun onQualityCoverUpdate(doQualityCovers: Boolean) {} }