From 994bebd8c4976bde75af91fd298370f05303e20b Mon Sep 17 00:00:00 2001 From: Bnyro Date: Tue, 19 Nov 2024 10:23:59 +0100 Subject: [PATCH] fix: crash when starting other video --- .../services/AbstractPlayerService.kt | 44 +++++++++++-------- .../ui/fragments/AudioPlayerFragment.kt | 2 + .../libretube/ui/fragments/PlayerFragment.kt | 1 + 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/github/libretube/services/AbstractPlayerService.kt b/app/src/main/java/com/github/libretube/services/AbstractPlayerService.kt index f01daaa13..2b4c37a55 100644 --- a/app/src/main/java/com/github/libretube/services/AbstractPlayerService.kt +++ b/app/src/main/java/com/github/libretube/services/AbstractPlayerService.kt @@ -6,6 +6,7 @@ import android.os.Handler import android.os.Looper import androidx.annotation.OptIn import androidx.core.app.ServiceCompat +import androidx.core.os.postDelayed import androidx.media3.common.C import androidx.media3.common.PlaybackException import androidx.media3.common.Player @@ -293,29 +294,36 @@ abstract class AbstractPlayerService : MediaLibraryService(), MediaLibrarySessio } override fun onDestroy() { - PlayingQueue.resetToDefaults() + // wait for a short time before killing the mediaSession + // as the playerController must be released before we finish the session + // otherwise there would be a + // java.lang.SecurityException: Session rejected the connection request. + // because there can't be two active playerControllers at the same time. + handler.postDelayed(50) { + PlayingQueue.resetToDefaults() - saveWatchPosition() + saveWatchPosition() - notificationProvider = null - watchPositionTimer.destroy() + notificationProvider = null + watchPositionTimer.destroy() - handler.removeCallbacksAndMessages(null) + handler.removeCallbacksAndMessages(null) - runCatching { - exoPlayer?.stop() - exoPlayer?.release() + runCatching { + exoPlayer?.stop() + exoPlayer?.release() + } + + kotlin.runCatching { + mediaLibrarySession?.release() + mediaLibrarySession = null + } + + ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE) + stopSelf() + + super.onDestroy() } - - kotlin.runCatching { - mediaLibrarySession?.release() - mediaLibrarySession = null - } - - ServiceCompat.stopForeground(this, ServiceCompat.STOP_FOREGROUND_REMOVE) - stopSelf() - - super.onDestroy() } fun isVideoIdInitialized() = this::videoId.isInitialized diff --git a/app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt index 65ae40b1e..defd18f6e 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/AudioPlayerFragment.kt @@ -232,6 +232,8 @@ class AudioPlayerFragment : Fragment(), AudioPlayerOptions { private fun killFragment() { playerController?.sendCustomCommand(AbstractPlayerService.stopServiceCommand, Bundle.EMPTY) + playerController?.release() + playerController = null viewModel.isFullscreen.value = false binding.playerMotionLayout.transitionToEnd() diff --git a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt index f22ba88c4..fd45e59b5 100644 --- a/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt +++ b/app/src/main/java/com/github/libretube/ui/fragments/PlayerFragment.kt @@ -851,6 +851,7 @@ class PlayerFragment : Fragment(), OnlinePlayerOptions { playerController.pause() playerController.sendCustomCommand(AbstractPlayerService.stopServiceCommand, Bundle.EMPTY) + playerController.release() if (PlayerHelper.pipEnabled) { // disable the auto PiP mode for SDK >= 32