diff --git a/packages/player/android/build.gradle b/packages/player/android/build.gradle
index 96ffe242..9d5c26f5 100644
--- a/packages/player/android/build.gradle
+++ b/packages/player/android/build.gradle
@@ -4,7 +4,7 @@ version '1.0.4'
buildscript {
ext.kotlin_version = '1.9.20'
- ext.media3_version = '1.4.1'
+ ext.media3_version = '1.5.1'
repositories {
google()
mavenCentral()
@@ -32,7 +32,7 @@ kapt {
}
android {
- compileSdkVersion 34
+ compileSdk = 35
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
@@ -49,7 +49,7 @@ android {
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
- implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1'
implementation "androidx.media:media:1.7.0"
implementation "org.jetbrains.kotlin:kotlin-reflect"
//MEDIA3 DEPENDENCIES
@@ -60,8 +60,11 @@ dependencies {
implementation "androidx.media3:media3-ui:$media3_version"
// implementation files('/Users/lucastonussi/flutter/bin/cache/artifacts/engine/android-x64/flutter.jar')
- implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2'
+ implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1'
implementation "com.google.code.gson:gson:2.10.1"
-
+// api 'com.google.android.gms:play-services-cast-framework:22.0.0'
+ // CHROMECAST DEPENDENCIES
+ implementation 'androidx.mediarouter:mediarouter:1.7.0'
+ implementation 'androidx.media3:media3-cast:1.5.1'
}
diff --git a/packages/player/android/src/main/AndroidManifest.xml b/packages/player/android/src/main/AndroidManifest.xml
index 9fd545b9..8827cbfd 100644
--- a/packages/player/android/src/main/AndroidManifest.xml
+++ b/packages/player/android/src/main/AndroidManifest.xml
@@ -8,6 +8,9 @@
+
diff --git a/packages/player/android/src/main/kotlin/br/com/suamusica/player/Cast.kt b/packages/player/android/src/main/kotlin/br/com/suamusica/player/Cast.kt
new file mode 100644
index 00000000..ed885041
--- /dev/null
+++ b/packages/player/android/src/main/kotlin/br/com/suamusica/player/Cast.kt
@@ -0,0 +1,329 @@
+package br.com.suamusica.player
+
+import android.content.Context
+import android.util.Log
+import androidx.media3.cast.SessionAvailabilityListener
+import androidx.media3.common.util.UnstableApi
+import androidx.mediarouter.media.MediaControlIntent
+import androidx.mediarouter.media.MediaControlIntent.CATEGORY_LIVE_AUDIO
+import androidx.mediarouter.media.MediaControlIntent.CATEGORY_LIVE_VIDEO
+import androidx.mediarouter.media.MediaControlIntent.CATEGORY_REMOTE_PLAYBACK
+import androidx.mediarouter.media.MediaRouteSelector
+import androidx.mediarouter.media.MediaRouter
+import androidx.mediarouter.media.MediaRouter.UNSELECT_REASON_DISCONNECTED
+import androidx.mediarouter.media.RemotePlaybackClient
+import com.google.android.gms.cast.*
+import com.google.android.gms.cast.framework.CastContext
+import com.google.android.gms.cast.framework.CastState
+import com.google.android.gms.cast.framework.CastStateListener
+import com.google.android.gms.cast.framework.Session
+import com.google.android.gms.cast.framework.SessionManager
+import com.google.android.gms.cast.framework.SessionManagerListener
+import com.google.android.gms.common.api.PendingResult
+import com.google.android.gms.common.api.Status
+
+
+@UnstableApi
+
+class CastManager(
+ castContext: CastContext,
+ context: Context,
+) :
+ SessionAvailabilityListener,
+ CastStateListener,
+ Cast.Listener(),
+ SessionManagerListener,
+ PendingResult.StatusListener {
+ companion object {
+ const val TAG = "Chromecast"
+ }
+
+ private var mediaRouter = MediaRouter.getInstance(context)
+ var isConnected = false
+ private var sessionManager: SessionManager? = null
+ private var mediaRouterCallback: MediaRouter.Callback? = null
+ private var onConnectCallback: (() -> Unit)? = null
+ private var onSessionEndedCallback: (() -> Unit)? = null
+ private var alreadyConnected = false
+ private var cookie: String = ""
+
+ init {
+ castContext.addCastStateListener(this)
+ sessionManager = castContext.sessionManager
+
+ //TODO: pode remover esse callback?
+ mediaRouterCallback = object : MediaRouter.Callback() {
+ override fun onRouteAdded(router: MediaRouter, route: MediaRouter.RouteInfo) {
+ super.onRouteAdded(router, route)
+ Log.d(TAG, "#NATIVE LOGS CAST ==> Route added: " + route.getName())
+ }
+
+ override fun onRouteRemoved(router: MediaRouter, route: MediaRouter.RouteInfo) {
+ super.onRouteRemoved(router, route)
+ Log.d(TAG, "#NATIVE LOGS CAST ==> Route removed: " + route.getName())
+ }
+
+ override fun onRouteChanged(router: MediaRouter, route: MediaRouter.RouteInfo) {
+ super.onRouteChanged(router, route)
+ Log.d(TAG, "#NATIVE LOGS CAST ==> Route changed: " + route.getName())
+ }
+
+ override fun onRouteSelected(
+ router: MediaRouter,
+ route: MediaRouter.RouteInfo,
+ reason: Int
+ ) {
+ Log.d(
+ TAG,
+ "#NATIVE LOGS CAST ==> Route selected: " + route.getName() + ", reason: " + reason
+ )
+ }
+
+ override fun onRouteUnselected(
+ router: MediaRouter,
+ route: MediaRouter.RouteInfo,
+ reason: Int
+ ) {
+ Log.d(
+ TAG,
+ "#NATIVE LOGS CAST ==> Route unselected: " + route.getName() + ", reason: " + reason
+ )
+ }
+ }
+
+ val selector: MediaRouteSelector.Builder = MediaRouteSelector.Builder()
+ .addControlCategory(CATEGORY_REMOTE_PLAYBACK)
+ //TODO: remover?
+ mediaRouterCallback?.let {
+ mediaRouter.addCallback(
+ selector.build(), it,
+ MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN
+ )
+ }
+ }
+
+// fun discoveryCast(): List