From 3739e760cf01e16f75d177e5b2d73d69f7458f24 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 27 Jul 2026 17:58:16 +0200 Subject: [PATCH] fix(cast): use modern cast menus --- android/build.gradle | 2 +- .../dev/zoriya/omni/OmniCastOptionsProvider.kt | 1 + .../src/main/java/dev/zoriya/omni/OmniPlayer.kt | 4 ++++ .../android/app/src/main/AndroidManifest.xml | 3 +++ plugin/src/withCast.ts | 17 +++++++++++++++++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/android/build.gradle b/android/build.gradle index 6ae880c..65bbc8e 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -151,7 +151,7 @@ dependencies { implementation("androidx.media3:media3-exoplayer-hls:1.10.0") implementation("androidx.media3:media3-cast:1.10.0") - implementation("com.google.android.gms:play-services-cast-framework:21.5.0") + implementation("com.google.android.gms:play-services-cast-framework:22.3.1") implementation("androidx.mediarouter:mediarouter:1.7.0") } diff --git a/android/src/main/java/dev/zoriya/omni/OmniCastOptionsProvider.kt b/android/src/main/java/dev/zoriya/omni/OmniCastOptionsProvider.kt index 4750bbb..8a3b4a5 100644 --- a/android/src/main/java/dev/zoriya/omni/OmniCastOptionsProvider.kt +++ b/android/src/main/java/dev/zoriya/omni/OmniCastOptionsProvider.kt @@ -13,6 +13,7 @@ class OmniCastOptionsProvider : OptionsProvider { return CastOptions.Builder() .setReceiverApplicationId(appId) + .setShowSystemOutputSwitcherOnCastIconClick(true) .build() } diff --git a/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt b/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt index b1bf619..d88c4d1 100644 --- a/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt +++ b/android/src/main/java/dev/zoriya/omni/OmniPlayer.kt @@ -37,6 +37,7 @@ import androidx.media3.session.DefaultMediaNotificationProvider import androidx.media3.session.MediaSession import androidx.media3.session.MediaSessionService import androidx.mediarouter.app.MediaRouteChooserDialog +import androidx.mediarouter.app.SystemOutputSwitcherDialogController import com.google.android.gms.cast.framework.CastContext import com.google.android.gms.cast.framework.CastState import com.google.android.gms.cast.framework.CastStateListener @@ -147,6 +148,9 @@ class OmniPlayer( return@runOnMainThread } val activity = ctx.currentActivity ?: return@runOnMainThread + if (SystemOutputSwitcherDialogController.showDialog(activity)) { + return@runOnMainThread + } val selector = cc.mergedSelector ?: return@runOnMainThread MediaRouteChooserDialog(activity).apply { routeSelector = selector }.show() } diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index a1f0936..2775b3f 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -28,5 +28,8 @@ + diff --git a/plugin/src/withCast.ts b/plugin/src/withCast.ts index 23c2da9..4920129 100644 --- a/plugin/src/withCast.ts +++ b/plugin/src/withCast.ts @@ -7,6 +7,8 @@ import { const OPTIONS_PROVIDER_NAME = "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"; const OPTIONS_PROVIDER_VALUE = "dev.zoriya.omni.OmniCastOptionsProvider"; +const MEDIA_TRANSFER_RECEIVER_NAME = + "androidx.mediarouter.media.MediaTransferReceiver"; function patchManifestForCast( androidManifest: AndroidConfig.Manifest.AndroidManifest, @@ -36,6 +38,21 @@ function patchManifestForCast( } mainApplication["meta-data"] = metaData; + const receivers = mainApplication.receiver ?? []; + if ( + !receivers.some( + (item) => item.$["android:name"] === MEDIA_TRANSFER_RECEIVER_NAME, + ) + ) { + receivers.push({ + $: { + "android:name": MEDIA_TRANSFER_RECEIVER_NAME, + "android:exported": "true", + }, + }); + } + mainApplication.receiver = receivers; + return androidManifest; }