@@ -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,17 @@ 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+ mediaRouteSelector = MediaRouteSelector .Builder ()
230+ .addControlCategory(MediaControlIntent .CATEGORY_REMOTE_PLAYBACK )
231+ .build()
232+ mediaRouter.routerParams =
233+ MediaRouterParams .Builder ().setTransferToLocalEnabled(true ).build()
234+ mediaRouter.addCallback(
235+ mediaRouteSelector, mediaRouterCallback,
236+ MediaRouter .CALLBACK_FLAG_REQUEST_DISCOVERY
237+ )
219238 }
220239
221240 /* *
@@ -250,6 +269,9 @@ open class MusicService : MediaBrowserServiceCompat() {
250269 // Free ExoPlayer resources.
251270 exoPlayer.removeListener(playerListener)
252271 exoPlayer.release()
272+
273+ // Stop listening for route changes.
274+ mediaRouter.removeCallback(mediaRouterCallback)
253275 }
254276
255277 /* *
@@ -500,7 +522,10 @@ open class MusicService : MediaBrowserServiceCompat() {
500522 } else {
501523
502524 val playbackStartPositionMs =
503- extras?.getLong(MEDIA_DESCRIPTION_EXTRAS_START_PLAYBACK_POSITION_MS , C .TIME_UNSET )
525+ extras?.getLong(
526+ MEDIA_DESCRIPTION_EXTRAS_START_PLAYBACK_POSITION_MS ,
527+ C .TIME_UNSET
528+ )
504529 ? : C .TIME_UNSET
505530
506531 preparePlaylist(
@@ -650,6 +675,21 @@ open class MusicService : MediaBrowserServiceCompat() {
650675 ).show()
651676 }
652677 }
678+
679+ inner class MediaRouterCallback : MediaRouter .Callback () {
680+ override fun onRouteSelected (
681+ router : MediaRouter ,
682+ route : MediaRouter .RouteInfo ,
683+ reason : Int
684+ ) {
685+ if (reason == MediaRouter .UNSELECT_REASON_ROUTE_CHANGED ) {
686+ Log .d(TAG , " Unselected because route changed, continue playback" )
687+ } else if (reason == MediaRouter .UNSELECT_REASON_STOPPED ) {
688+ Log .d(TAG , " Unselected because route was stopped, stop playback" )
689+ currentPlayer.stop()
690+ }
691+ }
692+ }
653693}
654694
655695/*
0 commit comments