Fix playback progress updates on exit

This commit is contained in:
Balogh Barnabás
2026-03-24 20:54:07 +01:00
parent ada0e9600a
commit 2e8c864522
5 changed files with 44 additions and 33 deletions

View File

@@ -235,6 +235,16 @@ class PlayerManager @Inject constructor(
_playbackState.update { it.copy(error = null) }
}
fun snapshotProgress(): PlaybackProgressSnapshot {
val duration = player.duration.takeIf { it > 0 } ?: _progress.value.durationMs
return PlaybackProgressSnapshot(
durationMs = duration,
positionMs = player.currentPosition,
bufferedMs = player.bufferedPosition,
isLive = player.isCurrentMediaItemLive
)
}
private suspend fun applyTrackPreferences() {
val context = currentMediaContext ?: return
val preferences = trackPreferencesRepository.getMediaPreferences(context.preferenceKey).firstOrNull() ?: return
@@ -307,15 +317,7 @@ class PlayerManager @Inject constructor(
private fun startProgressLoop() {
scope.launch {
while (isActive) {
val duration = player.duration.takeIf { it > 0 } ?: _progress.value.durationMs
val position = player.currentPosition
val buffered = player.bufferedPosition
_progress.value = PlaybackProgressSnapshot(
durationMs = duration,
positionMs = position,
bufferedMs = buffered,
isLive = player.isCurrentMediaItemLive
)
_progress.value = snapshotProgress()
delay(500)
}
}

View File

@@ -29,6 +29,11 @@ class ProgressManager @Inject constructor(
private var lastDurationMs: Long = 0L
private var isPaused: Boolean = false
fun syncProgress(snapshot: PlaybackProgressSnapshot) {
lastPositionMs = snapshot.positionMs
lastDurationMs = snapshot.durationMs
}
fun bind(
playbackState: StateFlow<PlaybackStateSnapshot>,
progress: StateFlow<PlaybackProgressSnapshot>,

View File

@@ -251,6 +251,7 @@ class PlayerViewModel @Inject constructor(
override fun onCleared() {
super.onCleared()
autoHideJob?.cancel()
progressManager.syncProgress(playerManager.snapshotProgress())
progressManager.release()
playerManager.release()
}