diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 25a97cf1b..7701b8c8e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -92,6 +92,10 @@ + + diff --git a/app/src/main/java/com/example/android/uamp/MainActivity.kt b/app/src/main/java/com/example/android/uamp/MainActivity.kt index 8b6b19091..9106ed838 100644 --- a/app/src/main/java/com/example/android/uamp/MainActivity.kt +++ b/app/src/main/java/com/example/android/uamp/MainActivity.kt @@ -18,7 +18,6 @@ package com.example.android.uamp import android.media.AudioManager import android.os.Bundle -import android.util.Log import android.view.Menu import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity diff --git a/build.gradle b/build.gradle index 2e1d2779a..722bd63b4 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,7 @@ buildscript { androidx_car_version = '1.0.0-alpha7' androidx_core_ktx_version = '1.3.1' androidx_media_version = '1.0.1' + androidx_mediarouter_version = '1.2.0-rc01' androidx_preference_version = '1.1.1' androidx_test_runner_version = '1.3.0' arch_lifecycle_version = '2.2.0' diff --git a/common/build.gradle b/common/build.gradle index 35a547fe4..e498d682e 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -51,6 +51,7 @@ dependencies { api "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version" api "androidx.media:media:$androidx_media_version" + implementation "androidx.mediarouter:mediarouter:$androidx_mediarouter_version" api "com.google.code.gson:gson:$gson_version" diff --git a/common/src/main/java/com/example/android/uamp/media/MusicService.kt b/common/src/main/java/com/example/android/uamp/media/MusicService.kt index 716c49960..b51eaca7d 100644 --- a/common/src/main/java/com/example/android/uamp/media/MusicService.kt +++ b/common/src/main/java/com/example/android/uamp/media/MusicService.kt @@ -33,6 +33,10 @@ import android.widget.Toast import androidx.core.content.ContextCompat import androidx.media.MediaBrowserServiceCompat import androidx.media.MediaBrowserServiceCompat.BrowserRoot.EXTRA_RECENT +import androidx.mediarouter.media.MediaControlIntent +import androidx.mediarouter.media.MediaRouteSelector +import androidx.mediarouter.media.MediaRouter +import androidx.mediarouter.media.MediaRouterParams import com.example.android.uamp.media.extensions.album import com.example.android.uamp.media.extensions.flag import com.example.android.uamp.media.extensions.id @@ -104,6 +108,10 @@ open class MusicService : MediaBrowserServiceCompat() { private lateinit var storage: PersistentStorage + private lateinit var mediaRouteSelector: MediaRouteSelector + private lateinit var mediaRouter: MediaRouter + private val mediaRouterCallback = MediaRouterCallback() + /** * This must be `by lazy` because the source won't initially be ready. * See [MusicService.onLoadChildren] to see where it's accessed (and first @@ -216,6 +224,18 @@ open class MusicService : MediaBrowserServiceCompat() { packageValidator = PackageValidator(this, R.xml.allowed_media_browser_callers) storage = PersistentStorage.getInstance(applicationContext) + + mediaRouter = MediaRouter.getInstance(this) + mediaRouter.setMediaSessionCompat(mediaSession) + mediaRouteSelector = MediaRouteSelector.Builder() + .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK) + .build() + mediaRouter.routerParams = + MediaRouterParams.Builder().setTransferToLocalEnabled(true).build() + mediaRouter.addCallback( + mediaRouteSelector, mediaRouterCallback, + MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY + ) } /** @@ -250,6 +270,9 @@ open class MusicService : MediaBrowserServiceCompat() { // Free ExoPlayer resources. exoPlayer.removeListener(playerListener) exoPlayer.release() + + // Stop listening for route changes. + mediaRouter.removeCallback(mediaRouterCallback) } /** @@ -650,6 +673,21 @@ open class MusicService : MediaBrowserServiceCompat() { ).show() } } + + inner class MediaRouterCallback : MediaRouter.Callback() { + override fun onRouteSelected( + router: MediaRouter, + route: MediaRouter.RouteInfo, + reason: Int + ) { + if (reason == MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) { + Log.d(TAG, "Unselected because route changed, continue playback") + } else if (reason == MediaRouter.UNSELECT_REASON_STOPPED) { + Log.d(TAG, "Unselected because route was stopped, stop playback") + currentPlayer.stop() + } + } + } } /*