From 86b7ef8d5c9f7c055bca51f9cb035c8fe79f7c2b Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Mon, 26 Feb 2024 15:26:23 -0700 Subject: [PATCH] music: fix crash on playlist add Caused by the new state restoration code being bugged and applying on playlist changes, then combined with the playlist code not properly switching to the main context when dispatching a library update. --- .../java/org/oxycblt/auxio/music/MusicRepository.kt | 10 +++++----- .../auxio/playback/state/PlaybackStateManager.kt | 7 +------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt index e1b6e2442..4ae1d962f 100644 --- a/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt +++ b/app/src/main/java/org/oxycblt/auxio/music/MusicRepository.kt @@ -305,35 +305,35 @@ constructor( val userLibrary = synchronized(this) { userLibrary ?: return } logD("Creating playlist $name with ${songs.size} songs") userLibrary.createPlaylist(name, songs) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } override suspend fun renamePlaylist(playlist: Playlist, name: String) { val userLibrary = synchronized(this) { userLibrary ?: return } logD("Renaming $playlist to $name") userLibrary.renamePlaylist(playlist, name) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } override suspend fun deletePlaylist(playlist: Playlist) { val userLibrary = synchronized(this) { userLibrary ?: return } logD("Deleting $playlist") userLibrary.deletePlaylist(playlist) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } override suspend fun addToPlaylist(songs: List, playlist: Playlist) { val userLibrary = synchronized(this) { userLibrary ?: return } logD("Adding ${songs.size} songs to $playlist") userLibrary.addToPlaylist(playlist, songs) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } override suspend fun rewritePlaylist(playlist: Playlist, songs: List) { val userLibrary = synchronized(this) { userLibrary ?: return } logD("Rewriting $playlist with ${songs.size} songs") userLibrary.rewritePlaylist(playlist, songs) - dispatchLibraryChange(device = false, user = true) + withContext(Dispatchers.Main) { dispatchLibraryChange(device = false, user = true) } } @Synchronized 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 7498c8e0b..315642fd0 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 @@ -780,14 +780,9 @@ class PlaybackStateManagerImpl @Inject constructor() : PlaybackStateManager { val oldStateMirror = stateMirror if (oldStateMirror.rawQueue != rawQueue) { logD("Queue changed, must reload player") + stateHolder?.playing(false) stateHolder?.applySavedState(parent, rawQueue, StateAck.NewPlayback) - stateHolder?.playing(false) - } - - if (oldStateMirror.progression.calculateElapsedPositionMs() != savedState.positionMs) { - logD("Seeking to saved position ${savedState.positionMs}ms") stateHolder?.seekTo(savedState.positionMs) - stateHolder?.playing(false) } }