From 03daf8f393e3be24442f99a54cab72a24dc81946 Mon Sep 17 00:00:00 2001 From: shaoweishen Date: Mon, 19 Sep 2022 15:29:39 +0000 Subject: [PATCH] [Output Switcher] Adjust check for advanced icon Since advanced icon should be only applied on untethered device, add new method for check this. isAdvancedDetailsHeader will also return true if device type is watch or default, which should not use advanced icon. Bug: 246235835 Test: make RunSettingsLibRoboTests -j40 Change-Id: Ic7d52e78dc790b016a090f8e26c8444152294aed --- .../settingslib/bluetooth/BluetoothUtils.java | 49 ++++++++++++++++--- .../media/BluetoothMediaDevice.java | 4 +- .../bluetooth/BluetoothUtilsTest.java | 41 ++++++++++++++++ 3 files changed, 86 insertions(+), 8 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java index fea7475fc0871..5c796af84feff 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothUtils.java @@ -237,14 +237,10 @@ public class BluetoothUtils { * @return true if it supports advanced metadata, false otherwise. */ public static boolean isAdvancedDetailsHeader(@NonNull BluetoothDevice bluetoothDevice) { - if (!DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI, BT_ADVANCED_HEADER_ENABLED, - true)) { - Log.d(TAG, "isAdvancedDetailsHeader: advancedEnabled is false"); + if (!isAdvancedHeaderEnabled()) { return false; } - // The metadata is for Android R - if (getBooleanMetaData(bluetoothDevice, BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) { - Log.d(TAG, "isAdvancedDetailsHeader: untetheredHeadset is true"); + if (isUntetheredHeadset(bluetoothDevice)) { return true; } // The metadata is for Android S @@ -259,6 +255,47 @@ public class BluetoothUtils { return false; } + /** + * Check if the Bluetooth device is supports advanced metadata and an untethered headset + * + * @param bluetoothDevice the BluetoothDevice to get metadata + * @return true if it supports advanced metadata and an untethered headset, false otherwise. + */ + public static boolean isAdvancedUntetheredDevice(@NonNull BluetoothDevice bluetoothDevice) { + if (!isAdvancedHeaderEnabled()) { + return false; + } + if (isUntetheredHeadset(bluetoothDevice)) { + return true; + } + // The metadata is for Android S + String deviceType = getStringMetaData(bluetoothDevice, + BluetoothDevice.METADATA_DEVICE_TYPE); + if (TextUtils.equals(deviceType, BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET)) { + Log.d(TAG, "isAdvancedUntetheredDevice: is untethered device "); + return true; + } + return false; + } + + private static boolean isAdvancedHeaderEnabled() { + if (!DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI, BT_ADVANCED_HEADER_ENABLED, + true)) { + Log.d(TAG, "isAdvancedDetailsHeader: advancedEnabled is false"); + return false; + } + return true; + } + + private static boolean isUntetheredHeadset(@NonNull BluetoothDevice bluetoothDevice) { + // The metadata is for Android R + if (getBooleanMetaData(bluetoothDevice, BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)) { + Log.d(TAG, "isAdvancedDetailsHeader: untetheredHeadset is true"); + return true; + } + return false; + } + /** * Create an Icon pointing to a drawable. */ diff --git a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java index 1be9d76cf3ebf..39034047d6eb9 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/BluetoothMediaDevice.java @@ -59,14 +59,14 @@ public class BluetoothMediaDevice extends MediaDevice { @Override public Drawable getIcon() { - return BluetoothUtils.isAdvancedDetailsHeader(mCachedDevice.getDevice()) + return BluetoothUtils.isAdvancedUntetheredDevice(mCachedDevice.getDevice()) ? mContext.getDrawable(R.drawable.ic_earbuds_advanced) : BluetoothUtils.getBtClassDrawableWithDescription(mContext, mCachedDevice).first; } @Override public Drawable getIconWithoutBackground() { - return BluetoothUtils.isAdvancedDetailsHeader(mCachedDevice.getDevice()) + return BluetoothUtils.isAdvancedUntetheredDevice(mCachedDevice.getDevice()) ? mContext.getDrawable(R.drawable.ic_earbuds_advanced) : BluetoothUtils.getBtClassDrawableWithDescription(mContext, mCachedDevice).first; } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java index 1c0ea1a1f4b01..ca14573c95e18 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/BluetoothUtilsTest.java @@ -205,4 +205,45 @@ public class BluetoothUtilsTest { public void isAdvancedDetailsHeader_noMetadata_returnFalse() { assertThat(BluetoothUtils.isAdvancedDetailsHeader(mBluetoothDevice)).isEqualTo(false); } + + @Test + public void isAdvancedUntetheredDevice_untetheredHeadset_returnTrue() { + when(mBluetoothDevice.getMetadata( + BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET)).thenReturn( + BOOL_METADATA.getBytes()); + + assertThat(BluetoothUtils.isAdvancedUntetheredDevice(mBluetoothDevice)).isEqualTo(true); + } + + @Test + public void isAdvancedUntetheredDevice_deviceTypeUntetheredHeadset_returnTrue() { + when(mBluetoothDevice.getMetadata( + BluetoothDevice.METADATA_DEVICE_TYPE)).thenReturn( + BluetoothDevice.DEVICE_TYPE_UNTETHERED_HEADSET.getBytes()); + + assertThat(BluetoothUtils.isAdvancedUntetheredDevice(mBluetoothDevice)).isEqualTo(true); + } + + @Test + public void isAdvancedUntetheredDevice_deviceTypeWatch_returnFalse() { + when(mBluetoothDevice.getMetadata( + BluetoothDevice.METADATA_DEVICE_TYPE)).thenReturn( + BluetoothDevice.DEVICE_TYPE_WATCH.getBytes()); + + assertThat(BluetoothUtils.isAdvancedUntetheredDevice(mBluetoothDevice)).isEqualTo(false); + } + + @Test + public void isAdvancedUntetheredDevice_deviceTypeDefault_returnFalse() { + when(mBluetoothDevice.getMetadata( + BluetoothDevice.METADATA_DEVICE_TYPE)).thenReturn( + BluetoothDevice.DEVICE_TYPE_DEFAULT.getBytes()); + + assertThat(BluetoothUtils.isAdvancedUntetheredDevice(mBluetoothDevice)).isEqualTo(false); + } + + @Test + public void isAdvancedUntetheredDevice_noMetadata_returnFalse() { + assertThat(BluetoothUtils.isAdvancedUntetheredDevice(mBluetoothDevice)).isEqualTo(false); + } }