From e95fb80cbaf4c038f7eeabf52bb126ee274e9b17 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 14 Aug 2026 17:34:19 +0200 Subject: [PATCH] fix(cast): handle end events --- android/src/main/java/dev/zoriya/omni/EventMap.kt | 12 +++++++++++- android/src/main/java/dev/zoriya/omni/OmniPlayer.kt | 4 +++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/dev/zoriya/omni/EventMap.kt b/android/src/main/java/dev/zoriya/omni/EventMap.kt index a339606..ad99142 100644 --- a/android/src/main/java/dev/zoriya/omni/EventMap.kt +++ b/android/src/main/java/dev/zoriya/omni/EventMap.kt @@ -15,6 +15,8 @@ import androidx.media3.common.Player.STATE_READY import androidx.media3.common.Timeline import androidx.media3.common.Tracks import androidx.media3.common.VideoSize +import com.google.android.gms.cast.MediaStatus +import com.google.android.gms.cast.framework.media.RemoteMediaClient import com.margelo.nitro.omni.BoolProperty import com.margelo.nitro.omni.CastStatus import com.margelo.nitro.omni.HybridOmniEventMapSpec @@ -103,6 +105,8 @@ class EventMap(private val tracks: TrackProvider) : HybridOmniEventMapSpec(), Pl onTracksChanged(value.currentTracks) } + var remote: RemoteMediaClient? = null + fun emitCastStatus(status: CastStatus) { castStatusListeners.forEach { it(status) } } @@ -200,7 +204,13 @@ class EventMap(private val tracks: TrackProvider) : HybridOmniEventMapSpec(), Pl override fun onPlaybackStateChanged(playbackState: Int) { val state = when (player.playbackState) { - STATE_IDLE -> PlayerStatus.IDLE + STATE_IDLE -> { + // cast doesn't have STATE_ENDED, so handle this manually + if (remote?.mediaStatus?.idleReason == MediaStatus.IDLE_REASON_FINISHED) + onEndListeners.forEach { it() } + PlayerStatus.IDLE + } + STATE_BUFFERING -> PlayerStatus.LOADING STATE_READY -> PlayerStatus.READYTOPLAY STATE_ENDED -> { diff --git a/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt b/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt index cb29cbc..4dfdf19 100644 --- a/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt +++ b/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt @@ -111,7 +111,9 @@ class OmniPlayer( // their own), so they ask us to do it when something else - google home, the // assistant, ... - requests a prev/next. same path as our own buttons. private fun listenToReceiver() { - val session = castContext?.sessionManager?.currentCastSession ?: return + val session = castContext?.sessionManager?.currentCastSession + eventMap.remote = session?.remoteMediaClient + if (session == null) return try { session.setMessageReceivedCallbacks(OMNI_NAMESPACE) { _, _, message -> when (JSONObject(message).optString("action")) {