playback: make state db sync

Add synchronized calls to PlaybackStateDatabase to resolve future race
conditions.
This commit is contained in:
OxygenCobalt 2022-06-23 15:27:41 -06:00
parent d5c0ccfce0
commit 149da883fe
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
2 changed files with 26 additions and 25 deletions

View file

@ -188,33 +188,35 @@ class PlaybackStateDatabase(context: Context) :
fun write(state: SavedState) { fun write(state: SavedState) {
requireBackgroundThread() requireBackgroundThread()
val song = state.queue.getOrNull(state.index) synchronized(this) {
val song = state.queue.getOrNull(state.index)
if (song != null) { if (song != null) {
val rawState = val rawState =
RawState( RawState(
index = state.index, index = state.index,
positionMs = state.positionMs, positionMs = state.positionMs,
repeatMode = state.repeatMode, repeatMode = state.repeatMode,
isShuffled = state.isShuffled, isShuffled = state.isShuffled,
songId = song.id, songId = song.id,
parentId = state.parent?.id, parentId = state.parent?.id,
playbackMode = playbackMode =
when (state.parent) { when (state.parent) {
null -> PlaybackMode.ALL_SONGS null -> PlaybackMode.ALL_SONGS
is Album -> PlaybackMode.IN_ALBUM is Album -> PlaybackMode.IN_ALBUM
is Artist -> PlaybackMode.IN_ARTIST is Artist -> PlaybackMode.IN_ARTIST
is Genre -> PlaybackMode.IN_GENRE is Genre -> PlaybackMode.IN_GENRE
}) })
writeRawState(rawState) writeRawState(rawState)
writeQueue(state.queue) writeQueue(state.queue)
} else { } else {
writeRawState(null) writeRawState(null)
writeQueue(null) writeQueue(null)
}
logD("Wrote state to database")
} }
logD("Wrote state to database")
} }
private fun writeRawState(rawState: RawState?) { private fun writeRawState(rawState: RawState?) {

View file

@ -15,7 +15,6 @@
app:liftOnScroll="true" app:liftOnScroll="true"
app:liftOnScrollTargetViewId="@id/detail_recycler"> app:liftOnScrollTargetViewId="@id/detail_recycler">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@+id/detail_toolbar" android:id="@+id/detail_toolbar"
style="@style/Widget.Auxio.Toolbar.Icon.Actions" /> style="@style/Widget.Auxio.Toolbar.Icon.Actions" />