Merge "Fix device name string on output switcher chip" into tm-qpr-dev

This commit is contained in:
Beth Thibodeau
2022-08-30 00:05:10 +00:00
committed by Android (Google) Code Review
4 changed files with 61 additions and 21 deletions

View File

@@ -488,8 +488,8 @@ public class MediaControlPanel {
TextView deviceName = mMediaViewHolder.getSeamlessText(); TextView deviceName = mMediaViewHolder.getSeamlessText();
final MediaDeviceData device = data.getDevice(); final MediaDeviceData device = data.getDevice();
final boolean enabled; final boolean isTapEnabled;
final boolean seamlessDisabled; final boolean useDisabledAlpha;
final int iconResource; final int iconResource;
CharSequence deviceString; CharSequence deviceString;
if (showBroadcastButton) { if (showBroadcastButton) {
@@ -499,21 +499,25 @@ public class MediaControlPanel {
&& TextUtils.equals(device.getName(), && TextUtils.equals(device.getName(),
MediaDataUtils.getAppLabel(mContext, mPackageName, mContext.getString( MediaDataUtils.getAppLabel(mContext, mPackageName, mContext.getString(
R.string.bt_le_audio_broadcast_dialog_unknown_name))); R.string.bt_le_audio_broadcast_dialog_unknown_name)));
seamlessDisabled = !mIsCurrentBroadcastedApp; useDisabledAlpha = !mIsCurrentBroadcastedApp;
// Always be enabled if the broadcast button is shown // 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); deviceString = mContext.getString(R.string.bt_le_audio_broadcast_dialog_unknown_name);
iconResource = R.drawable.settings_input_antenna; iconResource = R.drawable.settings_input_antenna;
} else { } else {
// Disable clicking on output switcher for invalid devices and resumption controls // Disable clicking on output switcher for invalid devices and resumption controls
seamlessDisabled = (device != null && !device.getEnabled()) || data.getResumption(); useDisabledAlpha = (device != null && !device.getEnabled()) || data.getResumption();
enabled = !seamlessDisabled; isTapEnabled = !useDisabledAlpha;
// Defaults for non-broadcasting state
deviceString = mContext.getString(R.string.media_seamless_other_device); deviceString = mContext.getString(R.string.media_seamless_other_device);
iconResource = R.drawable.ic_media_home_devices; iconResource = R.drawable.ic_media_home_devices;
} }
mMediaViewHolder.getSeamlessButton().setAlpha(seamlessDisabled ? DISABLED_ALPHA : 1.0f); mMediaViewHolder.getSeamlessButton().setAlpha(useDisabledAlpha ? DISABLED_ALPHA : 1.0f);
seamlessView.setEnabled(enabled); seamlessView.setEnabled(isTapEnabled);
if (device != null) { if (device != null) {
Drawable icon = device.getIcon(); Drawable icon = device.getIcon();
@@ -524,7 +528,9 @@ public class MediaControlPanel {
} else { } else {
iconView.setImageDrawable(icon); iconView.setImageDrawable(icon);
} }
deviceString = device.getName(); if (device.getName() != null) {
deviceString = device.getName();
}
} else { } else {
// Set to default icon // Set to default icon
iconView.setImageResource(iconResource); iconView.setImageResource(iconResource);

View File

@@ -265,7 +265,6 @@ class MediaDeviceManager @Inject constructor(
updateCurrent() updateCurrent()
} }
override fun onBroadcastStarted(reason: Int, broadcastId: Int) { override fun onBroadcastStarted(reason: Int, broadcastId: Int) {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onBroadcastStarted(), reason = $reason , broadcastId = $broadcastId") Log.d(TAG, "onBroadcastStarted(), reason = $reason , broadcastId = $broadcastId")
@@ -279,8 +278,10 @@ class MediaDeviceManager @Inject constructor(
} }
} }
override fun onBroadcastMetadataChanged(broadcastId: Int, override fun onBroadcastMetadataChanged(
metadata: BluetoothLeBroadcastMetadata) { broadcastId: Int,
metadata: BluetoothLeBroadcastMetadata
) {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onBroadcastMetadataChanged(), broadcastId = $broadcastId , " + Log.d(TAG, "onBroadcastMetadataChanged(), broadcastId = $broadcastId , " +
"metadata = $metadata") "metadata = $metadata")
@@ -291,7 +292,6 @@ class MediaDeviceManager @Inject constructor(
override fun onBroadcastStopped(reason: Int, broadcastId: Int) { override fun onBroadcastStopped(reason: Int, broadcastId: Int) {
if (DEBUG) { if (DEBUG) {
Log.d(TAG, "onBroadcastStopped(), reason = $reason , broadcastId = $broadcastId") Log.d(TAG, "onBroadcastStopped(), reason = $reason , broadcastId = $broadcastId")
} }
updateCurrent() updateCurrent()
} }
@@ -344,7 +344,11 @@ class MediaDeviceManager @Inject constructor(
// If we have a controller but get a null route, then don't trust the device // 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 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, current = MediaDeviceData(enabled, device?.iconWithoutBackground, name,
id = device?.id, showBroadcastButton = false) id = device?.id, showBroadcastButton = false)
} }

View File

@@ -1050,6 +1050,17 @@ public class MediaControlPanelTest : SysuiTestCase() {
assertThat(seamless.contentDescription).isEqualTo(fallbackString) 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 @Test
fun bindDeviceResumptionPlayer() { fun bindDeviceResumptionPlayer() {
player.attachPlayer(viewHolder) player.attachPlayer(viewHolder)

View File

@@ -59,8 +59,8 @@ import org.mockito.Mockito.reset
import org.mockito.Mockito.times import org.mockito.Mockito.times
import org.mockito.Mockito.verify import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.junit.MockitoJUnit
import org.mockito.Mockito.`when` as whenever import org.mockito.Mockito.`when` as whenever
import org.mockito.junit.MockitoJUnit
private const val KEY = "TEST_KEY" private const val KEY = "TEST_KEY"
private const val KEY_OLD = "TEST_KEY_OLD" private const val KEY_OLD = "TEST_KEY_OLD"
@@ -402,9 +402,10 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
manager.onMediaDataLoaded(KEY, null, mediaData) manager.onMediaDataLoaded(KEY, null, mediaData)
fakeBgExecutor.runAllReady() fakeBgExecutor.runAllReady()
fakeFgExecutor.runAllReady() fakeFgExecutor.runAllReady()
// THEN the device is disabled // THEN the device is disabled and name is set to null
val data = captureDeviceData(KEY) val data = captureDeviceData(KEY)
assertThat(data.enabled).isFalse() assertThat(data.enabled).isFalse()
assertThat(data.name).isNull()
} }
@Test @Test
@@ -421,9 +422,10 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
deviceCallback.onSelectedDeviceStateChanged(device, 1) deviceCallback.onSelectedDeviceStateChanged(device, 1)
fakeBgExecutor.runAllReady() fakeBgExecutor.runAllReady()
fakeFgExecutor.runAllReady() fakeFgExecutor.runAllReady()
// THEN the device is disabled // THEN the device is disabled and name is set to null
val data = captureDeviceData(KEY) val data = captureDeviceData(KEY)
assertThat(data.enabled).isFalse() assertThat(data.enabled).isFalse()
assertThat(data.name).isNull()
} }
@Test @Test
@@ -440,9 +442,24 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
deviceCallback.onDeviceListUpdate(mutableListOf(device)) deviceCallback.onDeviceListUpdate(mutableListOf(device))
fakeBgExecutor.runAllReady() fakeBgExecutor.runAllReady()
fakeFgExecutor.runAllReady() fakeFgExecutor.runAllReady()
// THEN the device is disabled // THEN the device is disabled and name is set to null
val data = captureDeviceData(KEY) val data = captureDeviceData(KEY)
assertThat(data.enabled).isFalse() 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 @Test
@@ -647,12 +664,14 @@ public class MediaDeviceManagerTest : SysuiTestCase() {
override fun onPlaybackStopped(reason: Int, broadcastId: Int) {} override fun onPlaybackStopped(reason: Int, broadcastId: Int) {}
override fun onBroadcastUpdated(reason: Int, broadcastId: Int) {} override fun onBroadcastUpdated(reason: Int, broadcastId: Int) {}
override fun onBroadcastUpdateFailed(reason: Int, broadcastId: Int) {} override fun onBroadcastUpdateFailed(reason: Int, broadcastId: Int) {}
override fun onBroadcastMetadataChanged(broadcastId: Int, override fun onBroadcastMetadataChanged(
metadata: BluetoothLeBroadcastMetadata) {} broadcastId: Int,
metadata: BluetoothLeBroadcastMetadata
) {}
} }
bluetoothLeBroadcast.registerCallback(fakeFgExecutor, callback) bluetoothLeBroadcast.registerCallback(fakeFgExecutor, callback)
return callback; return callback
} }
fun setupLeAudioConfiguration(isLeAudio: Boolean) { fun setupLeAudioConfiguration(isLeAudio: Boolean) {