Loading packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +15 −9 Original line number Diff line number Diff line Loading @@ -488,8 +488,8 @@ public class MediaControlPanel { TextView deviceName = mMediaViewHolder.getSeamlessText(); final MediaDeviceData device = data.getDevice(); final boolean enabled; final boolean seamlessDisabled; final boolean isTapEnabled; final boolean useDisabledAlpha; final int iconResource; CharSequence deviceString; if (showBroadcastButton) { Loading @@ -499,21 +499,25 @@ public class MediaControlPanel { && TextUtils.equals(device.getName(), MediaDataUtils.getAppLabel(mContext, mPackageName, mContext.getString( R.string.bt_le_audio_broadcast_dialog_unknown_name))); seamlessDisabled = !mIsCurrentBroadcastedApp; useDisabledAlpha = !mIsCurrentBroadcastedApp; // Always be enabled if the broadcast button is shown enabled = true; isTapEnabled = true; // Defaults for broadcasting state deviceString = mContext.getString(R.string.bt_le_audio_broadcast_dialog_unknown_name); iconResource = R.drawable.settings_input_antenna; } else { // Disable clicking on output switcher for invalid devices and resumption controls seamlessDisabled = (device != null && !device.getEnabled()) || data.getResumption(); enabled = !seamlessDisabled; useDisabledAlpha = (device != null && !device.getEnabled()) || data.getResumption(); isTapEnabled = !useDisabledAlpha; // Defaults for non-broadcasting state deviceString = mContext.getString(R.string.media_seamless_other_device); iconResource = R.drawable.ic_media_home_devices; } mMediaViewHolder.getSeamlessButton().setAlpha(seamlessDisabled ? DISABLED_ALPHA : 1.0f); seamlessView.setEnabled(enabled); mMediaViewHolder.getSeamlessButton().setAlpha(useDisabledAlpha ? DISABLED_ALPHA : 1.0f); seamlessView.setEnabled(isTapEnabled); if (device != null) { Drawable icon = device.getIcon(); Loading @@ -524,7 +528,9 @@ public class MediaControlPanel { } else { iconView.setImageDrawable(icon); } if (device.getName() != null) { deviceString = device.getName(); } } else { // Set to default icon iconView.setImageResource(iconResource); Loading packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt +9 −5 Original line number Diff line number Diff line Loading @@ -265,7 +265,6 @@ class MediaDeviceManager @Inject constructor( updateCurrent() } override fun onBroadcastStarted(reason: Int, broadcastId: Int) { if (DEBUG) { Log.d(TAG, "onBroadcastStarted(), reason = $reason , broadcastId = $broadcastId") Loading @@ -279,8 +278,10 @@ class MediaDeviceManager @Inject constructor( } } override fun onBroadcastMetadataChanged(broadcastId: Int, metadata: BluetoothLeBroadcastMetadata) { override fun onBroadcastMetadataChanged( broadcastId: Int, metadata: BluetoothLeBroadcastMetadata ) { if (DEBUG) { Log.d(TAG, "onBroadcastMetadataChanged(), broadcastId = $broadcastId , " + "metadata = $metadata") Loading @@ -291,7 +292,6 @@ class MediaDeviceManager @Inject constructor( override fun onBroadcastStopped(reason: Int, broadcastId: Int) { if (DEBUG) { Log.d(TAG, "onBroadcastStopped(), reason = $reason , broadcastId = $broadcastId") } updateCurrent() } Loading Loading @@ -344,7 +344,11 @@ class MediaDeviceManager @Inject constructor( // 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 val name = if (controller == null || route != null) { route?.name?.toString() ?: device?.name } else { null } current = MediaDeviceData(enabled, device?.iconWithoutBackground, name, id = device?.id, showBroadcastButton = false) } Loading packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +11 −0 Original line number Diff line number Diff line Loading @@ -1050,6 +1050,17 @@ public class MediaControlPanelTest : SysuiTestCase() { assertThat(seamless.contentDescription).isEqualTo(fallbackString) } @Test fun bindDeviceWithNullName() { val fallbackString = context.getResources().getString(R.string.media_seamless_other_device) player.attachPlayer(viewHolder) val state = mediaData.copy(device = device.copy(name = null)) player.bindPlayer(state, PACKAGE) assertThat(seamless.isEnabled()).isTrue() assertThat(seamlessText.getText()).isEqualTo(fallbackString) assertThat(seamless.contentDescription).isEqualTo(fallbackString) } @Test fun bindDeviceResumptionPlayer() { player.attachPlayer(viewHolder) Loading packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt +26 −7 Original line number Diff line number Diff line Loading @@ -59,8 +59,8 @@ import org.mockito.Mockito.reset import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.junit.MockitoJUnit import org.mockito.Mockito.`when` as whenever import org.mockito.junit.MockitoJUnit private const val KEY = "TEST_KEY" private const val KEY_OLD = "TEST_KEY_OLD" Loading Loading @@ -402,9 +402,10 @@ public class MediaDeviceManagerTest : SysuiTestCase() { manager.onMediaDataLoaded(KEY, null, mediaData) fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() // THEN the device is disabled // THEN the device is disabled and name is set to null val data = captureDeviceData(KEY) assertThat(data.enabled).isFalse() assertThat(data.name).isNull() } @Test Loading @@ -421,9 +422,10 @@ public class MediaDeviceManagerTest : SysuiTestCase() { deviceCallback.onSelectedDeviceStateChanged(device, 1) fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() // THEN the device is disabled // THEN the device is disabled and name is set to null val data = captureDeviceData(KEY) assertThat(data.enabled).isFalse() assertThat(data.name).isNull() } @Test Loading @@ -440,9 +442,24 @@ public class MediaDeviceManagerTest : SysuiTestCase() { deviceCallback.onDeviceListUpdate(mutableListOf(device)) fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() // THEN the device is disabled // THEN the device is disabled and name is set to null val data = captureDeviceData(KEY) assertThat(data.enabled).isFalse() assertThat(data.name).isNull() } @Test fun mr2ReturnsRouteWithNullName_useLocalDeviceName() { // GIVEN that MR2Manager returns a routing session that does not have a name whenever(route.name).thenReturn(null) // WHEN a notification is added manager.onMediaDataLoaded(KEY, null, mediaData) fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() // THEN the device is enabled and uses the current connected device name val data = captureDeviceData(KEY) assertThat(data.name).isEqualTo(DEVICE_NAME) assertThat(data.enabled).isTrue() } @Test Loading Loading @@ -647,12 +664,14 @@ public class MediaDeviceManagerTest : SysuiTestCase() { override fun onPlaybackStopped(reason: Int, broadcastId: Int) {} override fun onBroadcastUpdated(reason: Int, broadcastId: Int) {} override fun onBroadcastUpdateFailed(reason: Int, broadcastId: Int) {} override fun onBroadcastMetadataChanged(broadcastId: Int, metadata: BluetoothLeBroadcastMetadata) {} override fun onBroadcastMetadataChanged( broadcastId: Int, metadata: BluetoothLeBroadcastMetadata ) {} } bluetoothLeBroadcast.registerCallback(fakeFgExecutor, callback) return callback; return callback } fun setupLeAudioConfiguration(isLeAudio: Boolean) { Loading Loading
packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +15 −9 Original line number Diff line number Diff line Loading @@ -488,8 +488,8 @@ public class MediaControlPanel { TextView deviceName = mMediaViewHolder.getSeamlessText(); final MediaDeviceData device = data.getDevice(); final boolean enabled; final boolean seamlessDisabled; final boolean isTapEnabled; final boolean useDisabledAlpha; final int iconResource; CharSequence deviceString; if (showBroadcastButton) { Loading @@ -499,21 +499,25 @@ public class MediaControlPanel { && TextUtils.equals(device.getName(), MediaDataUtils.getAppLabel(mContext, mPackageName, mContext.getString( R.string.bt_le_audio_broadcast_dialog_unknown_name))); seamlessDisabled = !mIsCurrentBroadcastedApp; useDisabledAlpha = !mIsCurrentBroadcastedApp; // Always be enabled if the broadcast button is shown enabled = true; isTapEnabled = true; // Defaults for broadcasting state deviceString = mContext.getString(R.string.bt_le_audio_broadcast_dialog_unknown_name); iconResource = R.drawable.settings_input_antenna; } else { // Disable clicking on output switcher for invalid devices and resumption controls seamlessDisabled = (device != null && !device.getEnabled()) || data.getResumption(); enabled = !seamlessDisabled; useDisabledAlpha = (device != null && !device.getEnabled()) || data.getResumption(); isTapEnabled = !useDisabledAlpha; // Defaults for non-broadcasting state deviceString = mContext.getString(R.string.media_seamless_other_device); iconResource = R.drawable.ic_media_home_devices; } mMediaViewHolder.getSeamlessButton().setAlpha(seamlessDisabled ? DISABLED_ALPHA : 1.0f); seamlessView.setEnabled(enabled); mMediaViewHolder.getSeamlessButton().setAlpha(useDisabledAlpha ? DISABLED_ALPHA : 1.0f); seamlessView.setEnabled(isTapEnabled); if (device != null) { Drawable icon = device.getIcon(); Loading @@ -524,7 +528,9 @@ public class MediaControlPanel { } else { iconView.setImageDrawable(icon); } if (device.getName() != null) { deviceString = device.getName(); } } else { // Set to default icon iconView.setImageResource(iconResource); Loading
packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt +9 −5 Original line number Diff line number Diff line Loading @@ -265,7 +265,6 @@ class MediaDeviceManager @Inject constructor( updateCurrent() } override fun onBroadcastStarted(reason: Int, broadcastId: Int) { if (DEBUG) { Log.d(TAG, "onBroadcastStarted(), reason = $reason , broadcastId = $broadcastId") Loading @@ -279,8 +278,10 @@ class MediaDeviceManager @Inject constructor( } } override fun onBroadcastMetadataChanged(broadcastId: Int, metadata: BluetoothLeBroadcastMetadata) { override fun onBroadcastMetadataChanged( broadcastId: Int, metadata: BluetoothLeBroadcastMetadata ) { if (DEBUG) { Log.d(TAG, "onBroadcastMetadataChanged(), broadcastId = $broadcastId , " + "metadata = $metadata") Loading @@ -291,7 +292,6 @@ class MediaDeviceManager @Inject constructor( override fun onBroadcastStopped(reason: Int, broadcastId: Int) { if (DEBUG) { Log.d(TAG, "onBroadcastStopped(), reason = $reason , broadcastId = $broadcastId") } updateCurrent() } Loading Loading @@ -344,7 +344,11 @@ class MediaDeviceManager @Inject constructor( // 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 val name = if (controller == null || route != null) { route?.name?.toString() ?: device?.name } else { null } current = MediaDeviceData(enabled, device?.iconWithoutBackground, name, id = device?.id, showBroadcastButton = false) } Loading
packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +11 −0 Original line number Diff line number Diff line Loading @@ -1050,6 +1050,17 @@ public class MediaControlPanelTest : SysuiTestCase() { assertThat(seamless.contentDescription).isEqualTo(fallbackString) } @Test fun bindDeviceWithNullName() { val fallbackString = context.getResources().getString(R.string.media_seamless_other_device) player.attachPlayer(viewHolder) val state = mediaData.copy(device = device.copy(name = null)) player.bindPlayer(state, PACKAGE) assertThat(seamless.isEnabled()).isTrue() assertThat(seamlessText.getText()).isEqualTo(fallbackString) assertThat(seamless.contentDescription).isEqualTo(fallbackString) } @Test fun bindDeviceResumptionPlayer() { player.attachPlayer(viewHolder) Loading
packages/SystemUI/tests/src/com/android/systemui/media/MediaDeviceManagerTest.kt +26 −7 Original line number Diff line number Diff line Loading @@ -59,8 +59,8 @@ import org.mockito.Mockito.reset import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.junit.MockitoJUnit import org.mockito.Mockito.`when` as whenever import org.mockito.junit.MockitoJUnit private const val KEY = "TEST_KEY" private const val KEY_OLD = "TEST_KEY_OLD" Loading Loading @@ -402,9 +402,10 @@ public class MediaDeviceManagerTest : SysuiTestCase() { manager.onMediaDataLoaded(KEY, null, mediaData) fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() // THEN the device is disabled // THEN the device is disabled and name is set to null val data = captureDeviceData(KEY) assertThat(data.enabled).isFalse() assertThat(data.name).isNull() } @Test Loading @@ -421,9 +422,10 @@ public class MediaDeviceManagerTest : SysuiTestCase() { deviceCallback.onSelectedDeviceStateChanged(device, 1) fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() // THEN the device is disabled // THEN the device is disabled and name is set to null val data = captureDeviceData(KEY) assertThat(data.enabled).isFalse() assertThat(data.name).isNull() } @Test Loading @@ -440,9 +442,24 @@ public class MediaDeviceManagerTest : SysuiTestCase() { deviceCallback.onDeviceListUpdate(mutableListOf(device)) fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() // THEN the device is disabled // THEN the device is disabled and name is set to null val data = captureDeviceData(KEY) assertThat(data.enabled).isFalse() assertThat(data.name).isNull() } @Test fun mr2ReturnsRouteWithNullName_useLocalDeviceName() { // GIVEN that MR2Manager returns a routing session that does not have a name whenever(route.name).thenReturn(null) // WHEN a notification is added manager.onMediaDataLoaded(KEY, null, mediaData) fakeBgExecutor.runAllReady() fakeFgExecutor.runAllReady() // THEN the device is enabled and uses the current connected device name val data = captureDeviceData(KEY) assertThat(data.name).isEqualTo(DEVICE_NAME) assertThat(data.enabled).isTrue() } @Test Loading Loading @@ -647,12 +664,14 @@ public class MediaDeviceManagerTest : SysuiTestCase() { override fun onPlaybackStopped(reason: Int, broadcastId: Int) {} override fun onBroadcastUpdated(reason: Int, broadcastId: Int) {} override fun onBroadcastUpdateFailed(reason: Int, broadcastId: Int) {} override fun onBroadcastMetadataChanged(broadcastId: Int, metadata: BluetoothLeBroadcastMetadata) {} override fun onBroadcastMetadataChanged( broadcastId: Int, metadata: BluetoothLeBroadcastMetadata ) {} } bluetoothLeBroadcast.registerCallback(fakeFgExecutor, callback) return callback; return callback } fun setupLeAudioConfiguration(isLeAudio: Boolean) { Loading