From 7a3b67f64b2680bdac939fed70a32c377cdde0f9 Mon Sep 17 00:00:00 2001 From: Jarne Demeulemeester Date: Sun, 9 Jul 2023 15:15:15 +0200 Subject: [PATCH] fix(player): playback position reset on process death and playback continues playing when the device is locked Closes #389 #390 --- app/phone/src/main/AndroidManifest.xml | 1 + .../dev/jdtech/jellyfin/BasePlayerActivity.kt | 1 + .../dev/jdtech/jellyfin/PlayerActivity.kt | 2 -- .../viewmodels/PlayerActivityViewModel.kt | 26 ++++++++++++++----- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/phone/src/main/AndroidManifest.xml b/app/phone/src/main/AndroidManifest.xml index b3509ff5..57840a31 100644 --- a/app/phone/src/main/AndroidManifest.xml +++ b/app/phone/src/main/AndroidManifest.xml @@ -24,6 +24,7 @@ , ) { + // Skip initialization when there are already items + if (this.items.isNotEmpty()) { + return + } this.items = items player.addListener(this) @@ -156,10 +162,16 @@ constructor( Timber.e(e) } + val startPosition = if (playbackPosition == 0L) { + items.getOrNull(currentMediaItemIndex)?.playbackPosition ?: C.TIME_UNSET + } else { + playbackPosition + } + player.setMediaItems( mediaItems, currentMediaItemIndex, - items.getOrNull(currentMediaItemIndex)?.playbackPosition ?: C.TIME_UNSET, + startPosition, ) if (appPreferences.playerMpv) { // For some reason, adding a 1ms delay between these two lines fixes a crash when playing with mpv from downloads withContext(Dispatchers.IO) { @@ -191,9 +203,9 @@ constructor( } _currentTrickPlay.value = null - playWhenReady = player.playWhenReady - playbackPosition = position - currentMediaItemIndex = player.currentMediaItemIndex + playWhenReady = false + playbackPosition = 0L + currentMediaItemIndex = 0 player.removeListener(this) player.release() } @@ -201,6 +213,7 @@ constructor( private fun pollPosition(player: Player) { val playbackProgressRunnable = object : Runnable { override fun run() { + savedStateHandle["position"] = player.currentPosition viewModelScope.launch { if (player.currentMediaItem != null && player.currentMediaItem!!.mediaId.isNotEmpty()) { val itemId = UUID.fromString(player.currentMediaItem!!.mediaId) @@ -240,6 +253,7 @@ constructor( override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) { Timber.d("Playing MediaItem: ${mediaItem?.mediaId}") + savedStateHandle["mediaItemIndex"] = player.currentMediaItemIndex viewModelScope.launch { try { items.first { it.itemId.toString() == player.currentMediaItem?.mediaId }