[LE unicast] The isBusy state should involve the state of sub device

Bug: 245697292
Test: make RunSettingsLibRoboTests ROBOTEST_FILTER=CachedBluetoothDeviceTest
Change-Id: I7fc640ccf30329e7a9bba7ad8b7e2485c39b8f6c
This commit is contained in:
SongFerngWang
2022-09-27 15:55:31 +08:00
parent d9ef4d8ed7
commit 4b2b34eef3
2 changed files with 91 additions and 8 deletions

View File

@@ -756,16 +756,23 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
}
public boolean isBusy() {
synchronized (mProfileLock) {
for (LocalBluetoothProfile profile : mProfiles) {
int status = getProfileConnectionState(profile);
if (status == BluetoothProfile.STATE_CONNECTING
|| status == BluetoothProfile.STATE_DISCONNECTING) {
return true;
}
for (CachedBluetoothDevice memberDevice : getMemberDevice()) {
if (isBusyState(memberDevice)) {
return true;
}
return getBondState() == BluetoothDevice.BOND_BONDING;
}
return isBusyState(this);
}
private boolean isBusyState(CachedBluetoothDevice device){
for (LocalBluetoothProfile profile : device.getProfiles()) {
int status = device.getProfileConnectionState(profile);
if (status == BluetoothProfile.STATE_CONNECTING
|| status == BluetoothProfile.STATE_DISCONNECTING) {
return true;
}
}
return device.getBondState() == BluetoothDevice.BOND_BONDING;
}
private boolean updateProfiles() {

View File

@@ -1069,4 +1069,80 @@ public class CachedBluetoothDeviceTest {
assertThat(mSubCachedDevice.mDevice).isEqualTo(mDevice);
assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue();
}
@Test
public void isBusy_mainDeviceIsConnecting_returnsBusy() {
mCachedDevice.addMemberDevice(mSubCachedDevice);
updateProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
updateSubDeviceProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
when(mSubDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
updateProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTING);
assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue();
assertThat(mCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mSubCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mCachedDevice.isBusy()).isTrue();
}
@Test
public void isBusy_mainDeviceIsBonding_returnsBusy() {
mCachedDevice.addMemberDevice(mSubCachedDevice);
updateProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
updateSubDeviceProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
when(mSubDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue();
assertThat(mCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mSubCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mCachedDevice.isBusy()).isTrue();
}
@Test
public void isBusy_memberDeviceIsConnecting_returnsBusy() {
mCachedDevice.addMemberDevice(mSubCachedDevice);
updateProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
updateSubDeviceProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
when(mSubDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
updateSubDeviceProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTING);
assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue();
assertThat(mCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mSubCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mCachedDevice.isBusy()).isTrue();
}
@Test
public void isBusy_memberDeviceIsBonding_returnsBusy() {
mCachedDevice.addMemberDevice(mSubCachedDevice);
updateProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
updateSubDeviceProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
when(mSubDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue();
assertThat(mCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mSubCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mCachedDevice.isBusy()).isTrue();
}
@Test
public void isBusy_allDevicesAreNotBusy_returnsNotBusy() {
mCachedDevice.addMemberDevice(mSubCachedDevice);
updateProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
updateSubDeviceProfileStatus(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
when(mDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
when(mSubDevice.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue();
assertThat(mCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mSubCachedDevice.getProfiles().contains(mA2dpProfile)).isTrue();
assertThat(mCachedDevice.isBusy()).isFalse();
}
}