Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9424c62 authored by Yiyi Shen's avatar Yiyi Shen
Browse files

[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
parent 06feb6d1
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -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);
            }
        }
    }
+34 −0
Original line number Diff line number Diff line
@@ -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);