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;
}