Use route name for output switcher chip
The media router 2 library can include device group names when casting
to a group. So if the route name is available, use that instead of the
LMM device name.
If the route name is not available, we fall back to the LMM device name.
The output switcher will still show as disabled (chip is not clickable and
reads "Other device") if either the device or route is null.
Test: manual, using sample app
Test: atest MediaDeviceManagerTest MediaControlPanelTest
Fixes: 196923854
Fixes: 199951690
Change-Id: I07afbab3f62e6bc7855e0d5623c577231eb3500b
diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt
index 292b0e2..fbfb919 100644
--- a/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt
@@ -109,11 +109,9 @@
}
@MainThread
- private fun processDevice(key: String, oldKey: String?, device: MediaDevice?) {
- val enabled = device != null
- val data = MediaDeviceData(enabled, device?.iconWithoutBackground, device?.name)
+ private fun processDevice(key: String, oldKey: String?, device: MediaDeviceData?) {
listeners.forEach {
- it.onMediaDeviceChanged(key, oldKey, data)
+ it.onMediaDeviceChanged(key, oldKey, device)
}
}
@@ -135,7 +133,7 @@
get() = controller?.sessionToken
private var started = false
private var playbackType = PLAYBACK_TYPE_UNKNOWN
- private var current: MediaDevice? = null
+ private var current: MediaDeviceData? = null
set(value) {
if (!started || value != field) {
field = value
@@ -201,15 +199,13 @@
@WorkerThread
private fun updateCurrent() {
- val device = localMediaManager.getCurrentConnectedDevice()
- controller?.let {
- val route = mr2manager.getRoutingSessionForMediaController(it)
- // If we get a null route, then don't trust the device. Just set to null to disable the
- // output switcher chip.
- current = if (route != null) device else null
- } ?: run {
- current = device
- }
+ val device = localMediaManager.currentConnectedDevice
+ val route = controller?.let { mr2manager.getRoutingSessionForMediaController(it)}
+
+ // If we have a controller but get a null route, then don't trust the device
+ val enabled = device != null && (controller == null || route != null)
+ val name = route?.name?.toString() ?: device?.name
+ current = MediaDeviceData(enabled, device?.iconWithoutBackground, name)
}
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
index bf5a6e4..bbeadf6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt
@@ -122,7 +122,7 @@
private lateinit var session: MediaSession
private val device = MediaDeviceData(true, null, DEVICE_NAME)
- private val disabledDevice = MediaDeviceData(false, null, null)
+ private val disabledDevice = MediaDeviceData(false, null, "Disabled Device")
@JvmField @Rule val mockito = MockitoJUnit.rule()
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt
index ab3b208..7dadbad 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt
@@ -56,6 +56,7 @@
private const val SESSION_KEY = "SESSION_KEY"
private const val SESSION_TITLE = "SESSION_TITLE"
private const val DEVICE_NAME = "DEVICE_NAME"
+private const val REMOTE_DEVICE_NAME = "REMOTE_DEVICE_NAME"
private const val USER_ID = 0
private fun <T> eq(value: T): T = Mockito.eq(value) ?: value
@@ -195,8 +196,6 @@
// THEN the device should be disabled
val data = captureDeviceData(KEY)
assertThat(data.enabled).isFalse()
- assertThat(data.name).isNull()
- assertThat(data.icon).isNull()
}
@Test
@@ -263,6 +262,20 @@
}
@Test
+ fun deviceNameFromMR2RouteInfo() {
+ // GIVEN that MR2Manager returns a valid routing session
+ whenever(route.name).thenReturn(REMOTE_DEVICE_NAME)
+ // WHEN a notification is added
+ manager.onMediaDataLoaded(KEY, null, mediaData)
+ fakeBgExecutor.runAllReady()
+ fakeFgExecutor.runAllReady()
+ // THEN it uses the route name (instead of device name)
+ val data = captureDeviceData(KEY)
+ assertThat(data.enabled).isTrue()
+ assertThat(data.name).isEqualTo(REMOTE_DEVICE_NAME)
+ }
+
+ @Test
fun deviceDisabledWhenMR2ReturnsNullRouteInfo() {
// GIVEN that MR2Manager returns null for routing session
whenever(mr2.getRoutingSessionForMediaController(any())).thenReturn(null)
@@ -273,8 +286,6 @@
// THEN the device is disabled
val data = captureDeviceData(KEY)
assertThat(data.enabled).isFalse()
- assertThat(data.name).isNull()
- assertThat(data.icon).isNull()
}
@Test
@@ -294,8 +305,6 @@
// THEN the device is disabled
val data = captureDeviceData(KEY)
assertThat(data.enabled).isFalse()
- assertThat(data.name).isNull()
- assertThat(data.icon).isNull()
}
@Test
@@ -315,8 +324,6 @@
// THEN the device is disabled
val data = captureDeviceData(KEY)
assertThat(data.enabled).isFalse()
- assertThat(data.name).isNull()
- assertThat(data.icon).isNull()
}
@Test