From f57f720c38d34cca6d93568af228359552517e64 Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Fri, 29 Jan 2021 15:37:39 +0800 Subject: [PATCH 1/6] Add the pairing string for CSIP supported device Show the pairing dialog with the hint message that pairing this device will pair all of the set member of a coordinated set. If the device supports CSIP, the message will be shown. Screenshot: https://screenshot.googleplex.com/8WcrdgBoLRgJjHs Bug: 178981521 Test: make RunSettingsRoboTests ROBOTEST_FILTER=BlueotohPairingDialog Change-Id: I5432b7264652dd4485e2669f6004caa4f7459238 Merged-In: I5432b7264652dd4485e2669f6004caa4f7459238 --- res/layout/bluetooth_pin_confirm.xml | 12 ++++++++ res/values/strings.xml | 3 ++ .../bluetooth/BluetoothPairingController.java | 15 ++++++++++ .../BluetoothPairingDialogFragment.java | 3 ++ .../bluetooth/BluetoothPairingDialogTest.java | 28 +++++++++++++++++++ 5 files changed, 61 insertions(+) diff --git a/res/layout/bluetooth_pin_confirm.xml b/res/layout/bluetooth_pin_confirm.xml index 48912755890..28ad1f62920 100644 --- a/res/layout/bluetooth_pin_confirm.xml +++ b/res/layout/bluetooth_pin_confirm.xml @@ -65,6 +65,18 @@ android:textAppearance="@*android:style/TextAppearance.DeviceDefault.Subhead" android:visibility="gone" /> + + To pair with:<br><b>%1$s</b><br><br>Make sure it is showing this passkey:<br><b>%2$s</b> + + Confirm to pair with the coordinated set + From:<br><b>%1$s</b><br><br>Pair with this device? diff --git a/src/com/android/settings/bluetooth/BluetoothPairingController.java b/src/com/android/settings/bluetooth/BluetoothPairingController.java index ca3dda67384..ec5c8ddf912 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingController.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingController.java @@ -28,6 +28,7 @@ import androidx.annotation.VisibleForTesting; import com.android.settings.R; import com.android.settings.bluetooth.BluetoothPairingDialogFragment.BluetoothPairingDialogListener; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfile; @@ -64,6 +65,7 @@ public class BluetoothPairingController implements OnCheckedChangeListener, private String mDeviceName; private LocalBluetoothProfile mPbapClientProfile; private boolean mPbapAllowed; + private boolean mIsCoordinatedSetMember; /** * Creates an instance of a BluetoothPairingController. @@ -90,6 +92,10 @@ public class BluetoothPairingController implements OnCheckedChangeListener, mDeviceName = mBluetoothManager.getCachedDeviceManager().getName(mDevice); mPbapClientProfile = mBluetoothManager.getProfileManager().getPbapClientProfile(); mPasskeyFormatted = formatKey(mPasskey); + final CachedBluetoothDevice cachedDevice = + mBluetoothManager.getCachedDeviceManager().findDevice(mDevice); + mIsCoordinatedSetMember = (cachedDevice != null) + ? cachedDevice.isCoordinatedSetMemberDevice() : false; } @Override @@ -155,6 +161,15 @@ public class BluetoothPairingController implements OnCheckedChangeListener, return mDeviceName; } + /** + * A method for querying if the bluetooth device is a LE coordinated set member device. + * + * @return - A boolean indicating if the device is a CSIP supported device. + */ + public boolean isCoordinatedSetMemberDevice() { + return mIsCoordinatedSetMember; + } + /** * A method for querying if the bluetooth device has a profile already set up on this device. * diff --git a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java index d38302d8830..9e3624732d0 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingDialogFragment.java @@ -344,6 +344,9 @@ public class BluetoothPairingDialogFragment extends InstrumentedDialogFragment i pairingViewContent.setVisibility(View.VISIBLE); pairingViewContent.setText(mPairingController.getPairingContent()); } + final TextView messagePairingSet = (TextView) view.findViewById(R.id.pairing_group_message); + messagePairingSet.setVisibility(mPairingController.isCoordinatedSetMemberDevice() + ? View.VISIBLE : View.GONE); return view; } diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java index be733ec97d4..a53e693976e 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothPairingDialogTest.java @@ -427,6 +427,34 @@ public class BluetoothPairingDialogTest { userEntryDialogExistingTextTest("test"); } + @Test + public void groupPairing_setMemberDevice_showsMessageHint() { + // set the correct dialog type + when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG); + when(controller.isCoordinatedSetMemberDevice()).thenReturn(true); + + // build the fragment + BluetoothPairingDialogFragment frag = makeFragment(); + + // verify message is what we expect it to be and is visible + TextView message = frag.getmDialog().findViewById(R.id.pairing_group_message); + assertThat(message.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void groupPairing_nonSetMemberDevice_hidesMessageHint() { + // set the correct dialog type + when(controller.getDialogType()).thenReturn(BluetoothPairingController.CONFIRMATION_DIALOG); + when(controller.isCoordinatedSetMemberDevice()).thenReturn(false); + + // build the fragment + BluetoothPairingDialogFragment frag = makeFragment(); + + // verify message is what we expect it to be and is visible + TextView message = frag.getmDialog().findViewById(R.id.pairing_group_message); + assertThat(message.getVisibility()).isEqualTo(View.GONE); + } + // Runs a test simulating the user entry dialog type in a situation like device rotation, where // the dialog fragment gets created and we already have some existing text entered into the // pin field. From 9f11a4cddf42cb04e3980e7c86b3c83bb66fdafd Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Tue, 14 Sep 2021 14:42:48 +0800 Subject: [PATCH 2/6] Show the multiple Mac address for the coordinated set Show the mac address for all the devices if the device detail combine with the multiple connections based on CSIP. Screenshot: https://screenshot.googleplex.com/qQjc2pxNTr3tMUV Bug: 178981521 Test: pair with the coordinated set, and check the UI Change-Id: I01e0ec91e5c856481318d6435d174b5a2018d820 Merged-In: I01e0ec91e5c856481318d6435d174b5a2018d820 --- res/values/strings.xml | 2 ++ .../BluetoothDetailsMacAddressController.java | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 0dd205433f0..86c80c3e6d0 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1912,6 +1912,8 @@ Device details Device\'s Bluetooth address: %1$s + + Device\'s Bluetooth address:\n%1$s Forget device? diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java b/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java index dda247eac52..c5f845371b4 100644 --- a/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java +++ b/src/com/android/settings/bluetooth/BluetoothDetailsMacAddressController.java @@ -16,6 +16,7 @@ package com.android.settings.bluetooth; +import android.bluetooth.BluetoothCsipSetCoordinator; import android.content.Context; import androidx.preference.PreferenceFragmentCompat; @@ -50,8 +51,17 @@ public class BluetoothDetailsMacAddressController extends BluetoothDetailsContro @Override protected void refresh() { - mFooterPreference.setTitle(mContext.getString( + if (mCachedDevice.getGroupId() != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) { + StringBuilder mTitle = new StringBuilder(mContext.getString( + R.string.bluetooth_multuple_devices_mac_address, mCachedDevice.getAddress())); + for (CachedBluetoothDevice member: mCachedDevice.getMemberDevice()) { + mTitle.append("\n").append(member.getAddress()); + } + mFooterPreference.setTitle(mTitle); + } else { + mFooterPreference.setTitle(mContext.getString( R.string.bluetooth_device_mac_address, mCachedDevice.getAddress())); + } } @Override From 61460a1ab16983b4eb258115576d323caded70dd Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Fri, 17 Sep 2021 07:43:01 +0800 Subject: [PATCH 3/6] Accept the pairing request automatically for the set member pairing Check the pairing request from which device that if it's the outgoing set member pairing, accept the pairing request automatically to make the CSIP pairing seamless. Bug: 178981521 Bug: 150670922 Test: Pair one of the CSIP device, and confirm the other set member can paired without the confirmation from user Change-Id: I40afabb09b4cb12a0253035452c9f6974799ed05 Merged-In: I40afabb09b4cb12a0253035452c9f6974799ed05 --- .../android/settings/bluetooth/BluetoothPairingRequest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java index 993f584dd36..4ea433812ff 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java @@ -23,6 +23,8 @@ import android.content.Intent; import android.os.PowerManager; import android.os.UserHandle; +import com.android.settingslib.bluetooth.LocalBluetoothManager; + /** * BluetoothPairingRequest is a receiver for any Bluetooth pairing request. It * checks if the Bluetooth Settings is currently visible and brings up the PIN, the passkey or a @@ -47,9 +49,11 @@ public final class BluetoothPairingRequest extends BroadcastReceiver { boolean shouldShowDialog = LocalBluetoothPreferences.shouldShowDialogInForeground( context, deviceAddress, deviceName); + final LocalBluetoothManager mBluetoothManager = Utils.getLocalBtManager(context); // Skips consent pairing dialog if the device was recently associated with CDM if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT - && device.canBondWithoutDialog()) { + && (device.canBondWithoutDialog() + || mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) { device.setPairingConfirmation(true); } else if (powerManager.isInteractive() && shouldShowDialog) { // Since the screen is on and the BT-related activity is in the foreground, From c78fb83aeedb5ce5f9bcef0817f1a92e817c75fd Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Tue, 28 Sep 2021 18:02:41 +0800 Subject: [PATCH 4/6] Do not update the previously connected devices for the sub device As bluetooth turn on, and device reboot, UI will show the sub device entry for hearing aid device or csip device. Check if the device is a sub device, do not update the cachedDevice information. Bug: 150670922 Bug: 178981521 Test: bonded with a coordinated set. Check the UI only have one entry as Bluetooth turn on and device reboot. Change-Id: I03dfdc25b57e614194fb8de2c9265edd50760d30 Merged-In: I03dfdc25b57e614194fb8de2c9265edd50760d30 --- .../android/settings/bluetooth/SavedBluetoothDeviceUpdater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java index dab4f231e35..f5bc279b8a3 100644 --- a/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/SavedBluetoothDeviceUpdater.java @@ -65,7 +65,7 @@ public class SavedBluetoothDeviceUpdater extends BluetoothDeviceUpdater removePreferenceIfNecessary(bluetoothDevices, cachedManager); for (BluetoothDevice device : bluetoothDevices) { final CachedBluetoothDevice cachedDevice = cachedManager.findDevice(device); - if (cachedDevice != null) { + if (cachedDevice != null && !cachedManager.isSubDevice(device)) { update(cachedDevice); } } From 629611a43e9964b149d86ca411ac7323264b2273 Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Wed, 13 Oct 2021 18:43:47 +0800 Subject: [PATCH 5/6] Handle csip set member automatic pair in Setting Move the set member handle to setting. SystemUI and Setting have the individual settingLib instance. If we trigger pairing inside settingLib, the action would be called twice. SystemUI does not contain the concept to handle the pair interaction. Setting would take the action to createBond for CSIP automatically. Bug: 201758444 Bug: 150670922 Test: Pair the coordinated set devices, and check the set member pairing would be done automatically without the pairing dialog Change-Id: Idbdd21a1f15b04cc91cbc2d30a5cb4e9b24174b9 Merged-In: Idbdd21a1f15b04cc91cbc2d30a5cb4e9b24174b9 --- AndroidManifest.xml | 1 + .../bluetooth/BluetoothPairingRequest.java | 71 ++++++++++++------- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index e10b17ddbf8..ec4d8efd183 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2290,6 +2290,7 @@ android:exported="true"> + diff --git a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java index 4ea433812ff..6b80256285a 100644 --- a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java +++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java @@ -16,12 +16,14 @@ package com.android.settings.bluetooth; +import android.bluetooth.BluetoothCsipSetCoordinator; import android.bluetooth.BluetoothDevice; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.PowerManager; import android.os.UserHandle; +import android.text.TextUtils; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -36,38 +38,55 @@ public final class BluetoothPairingRequest extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); - if (action == null || !action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) { + if (action == null) { return; } - PowerManager powerManager = context.getSystemService(PowerManager.class); BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); - int pairingVariant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, - BluetoothDevice.ERROR); - String deviceAddress = device != null ? device.getAddress() : null; - String deviceName = device != null ? device.getName() : null; - boolean shouldShowDialog = LocalBluetoothPreferences.shouldShowDialogInForeground( - context, deviceAddress, deviceName); - final LocalBluetoothManager mBluetoothManager = Utils.getLocalBtManager(context); - // Skips consent pairing dialog if the device was recently associated with CDM - if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT - && (device.canBondWithoutDialog() - || mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) { - device.setPairingConfirmation(true); - } else if (powerManager.isInteractive() && shouldShowDialog) { - // Since the screen is on and the BT-related activity is in the foreground, - // just open the dialog - // convert broadcast intent into activity intent (same action string) - Intent pairingIntent = BluetoothPairingService.getPairingDialogIntent(context, intent, - BluetoothDevice.EXTRA_PAIRING_INITIATOR_FOREGROUND); + if (TextUtils.equals(action, BluetoothDevice.ACTION_PAIRING_REQUEST)) { + PowerManager powerManager = context.getSystemService(PowerManager.class); + int pairingVariant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT, + BluetoothDevice.ERROR); + String deviceAddress = device != null ? device.getAddress() : null; + String deviceName = device != null ? device.getName() : null; + boolean shouldShowDialog = LocalBluetoothPreferences.shouldShowDialogInForeground( + context, deviceAddress, deviceName); - context.startActivityAsUser(pairingIntent, UserHandle.CURRENT); - } else { - // Put up a notification that leads to the dialog - intent.setClass(context, BluetoothPairingService.class); - intent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST); - context.startServiceAsUser(intent, UserHandle.CURRENT); + // Skips consent pairing dialog if the device was recently associated with CDM + if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT + && (device.canBondWithoutDialog() + || mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) { + device.setPairingConfirmation(true); + } else if (powerManager.isInteractive() && shouldShowDialog) { + // Since the screen is on and the BT-related activity is in the foreground, + // just open the dialog + // convert broadcast intent into activity intent (same action string) + Intent pairingIntent = BluetoothPairingService.getPairingDialogIntent(context, + intent, BluetoothDevice.EXTRA_PAIRING_INITIATOR_FOREGROUND); + + context.startActivityAsUser(pairingIntent, UserHandle.CURRENT); + } else { + // Put up a notification that leads to the dialog + intent.setClass(context, BluetoothPairingService.class); + intent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST); + context.startServiceAsUser(intent, UserHandle.CURRENT); + } + } else if (TextUtils.equals(action, + BluetoothCsipSetCoordinator.ACTION_CSIS_SET_MEMBER_AVAILABLE)) { + if (device == null) { + return; + } + + final int groupId = intent.getIntExtra(BluetoothCsipSetCoordinator.EXTRA_CSIS_GROUP_ID, + BluetoothCsipSetCoordinator.GROUP_ID_INVALID); + if (groupId == BluetoothCsipSetCoordinator.GROUP_ID_INVALID) { + return; + } + + if (mBluetoothManager.getCachedDeviceManager().shouldPairByCsip(device, groupId)) { + device.createBond(BluetoothDevice.TRANSPORT_LE); + } } } } From 348784349684f87923e5eccc06244c10ddf4f8a7 Mon Sep 17 00:00:00 2001 From: Alice Kuo Date: Wed, 3 Mar 2021 17:08:36 +0800 Subject: [PATCH 6/6] Update the LE audio device into the media device category Bug: 178981521 Test: make RunSettingsRoboTests ROBOTEST_FILTER=AvailableMediaBluetoothDeviceUpdater Test: make RunSettingsRoboTests ROBOTEST_FILTER=ConnectedBluetoothDeviceUpdater Change-Id: I094ba6beb66fdebd7f3ef0a7c12bbed0e5b870e8 Merged-In: I094ba6beb66fdebd7f3ef0a7c12bbed0e5b870e8 --- .../AvailableMediaBluetoothDeviceUpdater.java | 5 ++-- .../ConnectedBluetoothDeviceUpdater.java | 5 ++-- ...ilableMediaBluetoothDeviceUpdaterTest.java | 26 ++++++++++++++++++ .../ConnectedBluetoothDeviceUpdaterTest.java | 27 +++++++++++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java index 27d63bfdb74..14c20f196ab 100644 --- a/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdater.java @@ -70,9 +70,10 @@ public class AvailableMediaBluetoothDeviceUpdater extends BluetoothDeviceUpdater if (DBG) { Log.d(TAG, "isFilterMatched() current audio profile : " + currentAudioProfile); } - // If device is Hearing Aid, it is compatible with HFP and A2DP. + // If device is Hearing Aid or LE Audio, it is compatible with HFP and A2DP. // It would show in Available Devices group. - if (cachedDevice.isConnectedHearingAidDevice()) { + if (cachedDevice.isConnectedHearingAidDevice() + || cachedDevice.isConnectedLeAudioDevice()) { return true; } // According to the current audio profile type, diff --git a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java index fc1b9b734b6..d1c45b61f45 100644 --- a/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java +++ b/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdater.java @@ -70,9 +70,10 @@ public class ConnectedBluetoothDeviceUpdater extends BluetoothDeviceUpdater { if (DBG) { Log.d(TAG, "isFilterMatched() current audio profile : " + currentAudioProfile); } - // If device is Hearing Aid, it is compatible with HFP and A2DP. + // If device is Hearing Aid or LE Audio, it is compatible with HFP and A2DP. // It would not show in Connected Devices group. - if (cachedDevice.isConnectedHearingAidDevice()) { + if (cachedDevice.isConnectedHearingAidDevice() + || cachedDevice.isConnectedLeAudioDevice()) { return false; } // According to the current audio profile type, diff --git a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java index 924e2468de6..013ef5221f6 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/AvailableMediaBluetoothDeviceUpdaterTest.java @@ -234,6 +234,32 @@ public class AvailableMediaBluetoothDeviceUpdaterTest { verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice); } + @Test + public void onProfileConnectionStateChanged_leAudioDeviceConnected_notInCall_addPreference() { + mAudioManager.setMode(AudioManager.MODE_NORMAL); + when(mBluetoothDeviceUpdater + .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true); + + mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, + BluetoothProfile.STATE_CONNECTED, BluetoothProfile.LE_AUDIO); + + verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice); + } + + @Test + public void onProfileConnectionStateChanged_leAudioDeviceConnected_inCall_addPreference() { + mAudioManager.setMode(AudioManager.MODE_IN_CALL); + when(mBluetoothDeviceUpdater + .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true); + + mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, + BluetoothProfile.STATE_CONNECTED, BluetoothProfile.LE_AUDIO); + + verify(mBluetoothDeviceUpdater).addPreference(mCachedBluetoothDevice); + } + @Test public void onProfileConnectionStateChanged_deviceDisconnected_removePreference() { mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, diff --git a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java index ea91fed19fc..40b20dcaea3 100644 --- a/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java +++ b/tests/robotests/src/com/android/settings/bluetooth/ConnectedBluetoothDeviceUpdaterTest.java @@ -234,6 +234,33 @@ public class ConnectedBluetoothDeviceUpdaterTest { verify(mBluetoothDeviceUpdater).removePreference(mCachedBluetoothDevice); } + @Test + public void onProfileConnectionStateChanged_leAudioDeviceConnected_inCall_removePreference() { + mAudioManager.setMode(AudioManager.MODE_IN_CALL); + when(mBluetoothDeviceUpdater + .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true); + + mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, + BluetoothProfile.STATE_CONNECTED, BluetoothProfile.LE_AUDIO); + + verify(mBluetoothDeviceUpdater).removePreference(mCachedBluetoothDevice); + } + + @Test + public void onProfileConnectionStateChanged_leAudioDeviceConnected_notInCall_removePreference() + { + mAudioManager.setMode(AudioManager.MODE_NORMAL); + when(mBluetoothDeviceUpdater + .isDeviceConnected(any(CachedBluetoothDevice.class))).thenReturn(true); + when(mCachedBluetoothDevice.isConnectedLeAudioDevice()).thenReturn(true); + + mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice, + BluetoothProfile.STATE_CONNECTED, BluetoothProfile.LE_AUDIO); + + verify(mBluetoothDeviceUpdater).removePreference(mCachedBluetoothDevice); + } + @Test public void onProfileConnectionStateChanged_deviceDisconnected_removePreference() { mBluetoothDeviceUpdater.onProfileConnectionStateChanged(mCachedBluetoothDevice,