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