Skip to content
This repository was archived by the owner on Jul 8, 2025. It is now read-only.

Commit 3a1eecb

Browse files
committed
Move MediaRouter into Service
1 parent 9a237bf commit 3a1eecb

File tree

2 files changed

+42
-28
lines changed

2 files changed

+42
-28
lines changed

app/src/main/java/com/example/android/uamp/MainActivity.kt

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@ class MainActivity : AppCompatActivity() {
4343
InjectorUtils.provideMainActivityViewModel(this)
4444
}
4545
private var castContext: CastContext? = null
46-
private lateinit var selector: MediaRouteSelector
47-
private lateinit var router: MediaRouter
48-
4946

5047
override fun onCreate(savedInstanceState: Bundle?) {
5148
super.onCreate(savedInstanceState)
@@ -56,16 +53,6 @@ class MainActivity : AppCompatActivity() {
5653

5754
setContentView(R.layout.activity_main)
5855

59-
router = MediaRouter.getInstance(this)
60-
selector = MediaRouteSelector.Builder()
61-
.addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
62-
.build()
63-
router.routerParams = MediaRouterParams.Builder().setTransferToLocalEnabled(true).build()
64-
router.addCallback(
65-
selector, MediaRouterCallback(),
66-
MediaRouter.CALLBACK_FLAG_REQUEST_DISCOVERY
67-
)
68-
6956
// Since UAMP is a music player, the volume controls should adjust the music volume while
7057
// in the app.
7158
volumeControlStream = AudioManager.STREAM_MUSIC
@@ -133,20 +120,6 @@ class MainActivity : AppCompatActivity() {
133120
private fun getBrowseFragment(mediaId: String): MediaItemFragment? {
134121
return supportFragmentManager.findFragmentByTag(mediaId) as MediaItemFragment?
135122
}
136-
137-
private inner class MediaRouterCallback : MediaRouter.Callback() {
138-
override fun onRouteSelected(
139-
router: MediaRouter,
140-
route: MediaRouter.RouteInfo,
141-
reason: Int
142-
) {
143-
if (reason == MediaRouter.UNSELECT_REASON_ROUTE_CHANGED) {
144-
Log.d(TAG, "Unselected because route changed, continue playback")
145-
} else if (reason == MediaRouter.UNSELECT_REASON_STOPPED) {
146-
Log.d(TAG, "Unselected because route was stopped, stop playback")
147-
}
148-
}
149-
}
150123
}
151124

152125
private const val TAG = "MainActivity"

common/src/main/java/com/example/android/uamp/media/MusicService.kt

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ import android.widget.Toast
3333
import androidx.core.content.ContextCompat
3434
import androidx.media.MediaBrowserServiceCompat
3535
import 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
3640
import com.example.android.uamp.media.extensions.album
3741
import com.example.android.uamp.media.extensions.flag
3842
import 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

Comments
 (0)