@@ -33,6 +33,10 @@ import android.widget.Toast
3333import androidx.core.content.ContextCompat
3434import androidx.media.MediaBrowserServiceCompat
3535import androidx.media.MediaBrowserServiceCompat.BrowserRoot.EXTRA_RECENT
36+ import androidx.mediarouter.media.MediaControlIntent
37+ import androidx.mediarouter.media.MediaRouteSelector
38+ import androidx.mediarouter.media.MediaRouter
39+ import androidx.mediarouter.media.MediaRouterParams
3640import com.example.android.uamp.media.extensions.album
3741import com.example.android.uamp.media.extensions.flag
3842import com.example.android.uamp.media.extensions.id
@@ -104,6 +108,10 @@ open class MusicService : MediaBrowserServiceCompat() {
104108
105109 private lateinit var storage: PersistentStorage
106110
111+ private lateinit var mediaRouteSelector: MediaRouteSelector
112+ private lateinit var mediaRouter: MediaRouter
113+ private val mediaRouterCallback = MediaRouterCallback ()
114+
107115 /* *
108116 * This must be `by lazy` because the source won't initially be ready.
109117 * See [MusicService.onLoadChildren] to see where it's accessed (and first
@@ -216,6 +224,18 @@ open class MusicService : MediaBrowserServiceCompat() {
216224 packageValidator = PackageValidator (this , R .xml.allowed_media_browser_callers)
217225
218226 storage = PersistentStorage .getInstance(applicationContext)
227+
228+ mediaRouter = MediaRouter .getInstance(this )
229+ mediaRouter.setMediaSessionCompat(mediaSession)
230+ mediaRouteSelector = MediaRouteSelector .Builder ()
231+ .addControlCategory(MediaControlIntent .CATEGORY_REMOTE_PLAYBACK )
232+ .build()
233+ mediaRouter.routerParams =
234+ MediaRouterParams .Builder ().setTransferToLocalEnabled(true ).build()
235+ mediaRouter.addCallback(
236+ mediaRouteSelector, mediaRouterCallback,
237+ MediaRouter .CALLBACK_FLAG_REQUEST_DISCOVERY
238+ )
219239 }
220240
221241 /* *
@@ -250,6 +270,9 @@ open class MusicService : MediaBrowserServiceCompat() {
250270 // Free ExoPlayer resources.
251271 exoPlayer.removeListener(playerListener)
252272 exoPlayer.release()
273+
274+ // Stop listening for route changes.
275+ mediaRouter.removeCallback(mediaRouterCallback)
253276 }
254277
255278 /* *
@@ -500,7 +523,10 @@ open class MusicService : MediaBrowserServiceCompat() {
500523 } else {
501524
502525 val playbackStartPositionMs =
503- extras?.getLong(MEDIA_DESCRIPTION_EXTRAS_START_PLAYBACK_POSITION_MS , C .TIME_UNSET )
526+ extras?.getLong(
527+ MEDIA_DESCRIPTION_EXTRAS_START_PLAYBACK_POSITION_MS ,
528+ C .TIME_UNSET
529+ )
504530 ? : C .TIME_UNSET
505531
506532 preparePlaylist(
@@ -650,6 +676,21 @@ open class MusicService : MediaBrowserServiceCompat() {
650676 ).show()
651677 }
652678 }
679+
680+ inner class MediaRouterCallback : MediaRouter .Callback () {
681+ override fun onRouteSelected (
682+ router : MediaRouter ,
683+ route : MediaRouter .RouteInfo ,
684+ reason : Int
685+ ) {
686+ if (reason == MediaRouter .UNSELECT_REASON_ROUTE_CHANGED ) {
687+ Log .d(TAG , " Unselected because route changed, continue playback" )
688+ } else if (reason == MediaRouter .UNSELECT_REASON_STOPPED ) {
689+ Log .d(TAG , " Unselected because route was stopped, stop playback" )
690+ currentPlayer.stop()
691+ }
692+ }
693+ }
653694}
654695
655696/*
0 commit comments