[Audiosharing] Avoid start sharing dialog for single device.

Issue - for LEA device with two BT addresses, when the second bud connected with
incorrect group id, we wrongly show up the start audio sharing dialog.

Fix - check there are two connected LEA valid groups before show up
start audio sharing dialog.

Bug: 347655885
Test: atest
Flag: com.android.settingslib.flags.enable_le_audio_sharing
Change-Id: Icd86ce2cfa4312c10c14906f46df324357c56990
This commit is contained in:
Yiyi Shen
2024-06-25 17:59:02 +08:00
parent 06feb6d1f7
commit f9424c6231
2 changed files with 46 additions and 3 deletions

View File

@@ -258,6 +258,8 @@ public class AudioSharingDialogHandler {
boolean userTriggered) {
Map<Integer, List<CachedBluetoothDevice>> groupedDevices =
AudioSharingUtils.fetchConnectedDevicesByGroupId(mLocalBtManager);
BluetoothDevice btDevice = cachedDevice.getDevice();
String deviceAddress = btDevice == null ? "" : btDevice.getAnonymizedAddress();
if (isBroadcasting) {
// If another device within the same is already in the sharing session, add source to
// the device automatically.
@@ -271,10 +273,10 @@ public class AudioSharingDialogHandler {
Log.d(
TAG,
"Automatically add another device within the same group to the sharing: "
+ cachedDevice.getDevice().getAnonymizedAddress());
+ deviceAddress);
if (mAssistant != null && mBroadcast != null) {
mAssistant.addSource(
cachedDevice.getDevice(),
btDevice,
mBroadcast.getLatestBluetoothLeBroadcastMetadata(),
/* isGroupOp= */ false);
}
@@ -313,6 +315,7 @@ public class AudioSharingDialogHandler {
cachedDevice,
listener,
eventData);
Log.d(TAG, "Show disconnect dialog, device = " + deviceAddress);
});
} else {
// Show audio sharing join dialog when the first or second eligible (LE audio)
@@ -343,9 +346,11 @@ public class AudioSharingDialogHandler {
cachedDevice,
listener,
eventData);
Log.d(TAG, "Show join dialog, device = " + deviceAddress);
});
}
} else {
// Build a list of AudioSharingDeviceItem for connected devices other than cachedDevice.
List<AudioSharingDeviceItem> deviceItems = new ArrayList<>();
for (List<CachedBluetoothDevice> devices : groupedDevices.values()) {
// Use random device in the group within the sharing session to represent the group.
@@ -358,7 +363,7 @@ public class AudioSharingDialogHandler {
}
// Show audio sharing join dialog when the second eligible (LE audio) remote
// device connect and no sharing session.
if (deviceItems.size() == 1) {
if (groupedDevices.size() == 2 && deviceItems.size() == 1) {
AudioSharingJoinDialogFragment.DialogEventListener listener =
new AudioSharingJoinDialogFragment.DialogEventListener() {
@Override
@@ -396,9 +401,13 @@ public class AudioSharingDialogHandler {
closeOpeningDialogsOtherThan(AudioSharingJoinDialogFragment.tag());
AudioSharingJoinDialogFragment.show(
mHostFragment, deviceItems, cachedDevice, listener, eventData);
Log.d(TAG, "Show start dialog, device = " + deviceAddress);
});
} else if (userTriggered) {
cachedDevice.setActive();
Log.d(TAG, "Set active device = " + deviceAddress);
} else {
Log.d(TAG, "Fail to handle LE audio device connected, device = " + deviceAddress);
}
}
}

View File

@@ -248,6 +248,23 @@ public class AudioSharingDialogHandlerTest {
verify(mCachedDevice1).setActive();
}
@Test
public void handleUserTriggeredLeaDeviceConnected_noSharingLeaDeviceInErrorState_setActive() {
setUpBroadcast(false);
when(mCachedDevice1.getGroupId()).thenReturn(-1);
when(mLeAudioProfile.getGroupId(mDevice1)).thenReturn(-1);
ImmutableList<BluetoothDevice> deviceList = ImmutableList.of(mDevice1, mDevice3);
when(mAssistant.getDevicesMatchingConnectionStates(
new int[] {BluetoothProfile.STATE_CONNECTED}))
.thenReturn(deviceList);
when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of());
mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ true);
shadowOf(Looper.getMainLooper()).idle();
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
assertThat(childFragments).isEmpty();
verify(mCachedDevice1).setActive();
}
@Test
public void handleUserTriggeredLeaDeviceConnected_noSharingTwoLeaDevices_showJoinDialog() {
setUpBroadcast(false);
@@ -451,6 +468,23 @@ public class AudioSharingDialogHandlerTest {
verify(mCachedDevice1, never()).setActive();
}
@Test
public void handleLeaDeviceConnected_noSharingLeaDeviceInErrorState_doNothing() {
setUpBroadcast(false);
when(mCachedDevice1.getGroupId()).thenReturn(-1);
when(mLeAudioProfile.getGroupId(mDevice1)).thenReturn(-1);
ImmutableList<BluetoothDevice> deviceList = ImmutableList.of(mDevice1, mDevice3);
when(mAssistant.getDevicesMatchingConnectionStates(
new int[] {BluetoothProfile.STATE_CONNECTED}))
.thenReturn(deviceList);
when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of());
mHandler.handleDeviceConnected(mCachedDevice1, /* userTriggered= */ false);
shadowOf(Looper.getMainLooper()).idle();
List<Fragment> childFragments = mParentFragment.getChildFragmentManager().getFragments();
assertThat(childFragments).isEmpty();
verify(mCachedDevice1, never()).setActive();
}
@Test
public void handleLeaDeviceConnected_noSharingTwoLeaDevices_showJoinDialog() {
setUpBroadcast(false);