From 156f5ecd3c4c74e89bc2c6299ad849944f7fc434 Mon Sep 17 00:00:00 2001 From: Gwilherm Folliot Date: Fri, 5 Jan 2024 01:17:13 +0100 Subject: [PATCH] Fix crash when DISPLAY_CONTENT while playing When a video is playing and on another device you browse libraries on a casting device it cause the app to crash The onDisplayContent method is trying to read ExoPlayer state but from the socket thread and not the main thread java.lang.IllegalStateException: Player is accessed on the wrong thread. Current thread: 'DefaultDispatcher-worker-4' Expected thread: 'main' See https://developer.android.com/guide/topics/media/issues/player-accessed-on-wrong-thread at androidx.media3.exoplayer.ExoPlayerImpl.verifyApplicationThread(ExoPlayerImpl.java:2842) at androidx.media3.exoplayer.ExoPlayerImpl.getPlaybackState(ExoPlayerImpl.java:514) at androidx.media3.common.BasePlayer.isPlaying(BasePlayer.java:124) at org.jellyfin.androidtv.ui.playback.VideoManager.isPlaying(VideoManager.java:341) at org.jellyfin.androidtv.ui.playback.PlaybackController.isPlaying(PlaybackController.java:262) at org.jellyfin.androidtv.data.eventhandling.SocketHandler.onDisplayContent(SocketHandler.kt:184) at org.jellyfin.androidtv.data.eventhandling.SocketHandler.lambda$13$lambda$8(SocketHandler.kt:103) at org.jellyfin.androidtv.data.eventhandling.SocketHandler$$ExternalSyntheticLambda3.onReceive(Unknown Source:4) at org.jellyfin.androidtv.data.eventhandling.SocketHandler$_init_$lambda$13$$inlined$addGeneralCommandsListener$default$1.onReceive(ListenerRegistrationExtensions.kt:68) at org.jellyfin.sdk.api.sockets.helper.ListenerHelper.forwardMessage(ListenerHelper.kt:37) at org.jellyfin.sdk.api.sockets.SocketInstance.forwardMessage(SocketInstance.kt:283) at org.jellyfin.sdk.api.sockets.SocketInstance.access$forwardMessage(SocketInstance.kt:35) at org.jellyfin.sdk.api.sockets.SocketInstance$connectAndBind$2.invokeSuspend(SocketInstance.kt:220) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697) at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684) (cherry picked from commit 01165307947e37033c3ba5f5749383a1798e4f59) --- CONTRIBUTORS.md | 1 + .../jellyfin/androidtv/data/eventhandling/SocketHandler.kt | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 56ae2cb8b..94d8905fa 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -12,6 +12,7 @@ - [GodTamIt](https://github.com/GodTamIt) - [sparky3387](https://github.com/sparky3387) - [mohd-akram](https://github.com/mohd-akram) + - [3l0w](https://github.com/3l0w) # Emby Contributors diff --git a/app/src/main/java/org/jellyfin/androidtv/data/eventhandling/SocketHandler.kt b/app/src/main/java/org/jellyfin/androidtv/data/eventhandling/SocketHandler.kt index aff9cd3f2..f4619cdaf 100644 --- a/app/src/main/java/org/jellyfin/androidtv/data/eventhandling/SocketHandler.kt +++ b/app/src/main/java/org/jellyfin/androidtv/data/eventhandling/SocketHandler.kt @@ -178,12 +178,12 @@ class SocketHandler( } } - private fun onDisplayContent(itemId: UUID, itemKind: BaseItemKind) { + private fun onDisplayContent(itemId: UUID, itemKind: BaseItemKind) = coroutineScope.launch(Dispatchers.Main) { val playbackController = playbackControllerContainer.playbackController if (playbackController?.isPlaying == true || playbackController?.isPaused == true) { Timber.i("Not launching $itemId: playback in progress") - return + return@launch } Timber.i("Launching $itemId")