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

Commit 1a331e0f authored by Grzegorz Kolodziejczyk (xWF)'s avatar Grzegorz Kolodziejczyk (xWF)
Browse files

ActiveDeviceManager: Update tracking connected devices

Let's avoid updating mLeAudioConnectedDevices during LE active device changes.
Instead, we should keep the connected list logic synchronized exclusively within
profileConnectionStateChange.

Bug: 375050065
Test: atest ActiveDeviceManagerTest
Flag: EXEMPT; simple fix, covered by unit tests
Change-Id: I36cec058e965d77684d0a968c11b1c9776e26c95
parent 8234b73e
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -801,9 +801,16 @@ public class ActiveDeviceManager implements AdapterService.BluetoothStateCallbac
                            + device
                            + ", mLeAudioActiveDevice="
                            + mLeAudioActiveDevice);

            if (device != null && !mLeAudioConnectedDevices.contains(device)) {
                mLeAudioConnectedDevices.add(device);
                Log.w(
                        TAG,
                        "Failed to activate device "
                                + device
                                + ". Reason: Device is not connected.");
                return;
            }

            // Just assign locally the new value
            if (device != null && !Objects.equals(mLeAudioActiveDevice, device)) {
                if (!Utils.isDualModeAudioEnabled()) {
+25 −4
Original line number Diff line number Diff line
@@ -1040,8 +1040,9 @@ public class ActiveDeviceManagerTest {
        verify(mA2dpService, atLeastOnce()).setActiveDevice(mA2dpHeadsetDevice);
        verify(mHeadsetService, atLeastOnce()).setActiveDevice(mA2dpHeadsetDevice);

        leAudioActiveDeviceChanged(mLeAudioDevice);
        leAudioConnected(mLeAudioDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService).setActiveDevice(mLeAudioDevice);
        verify(mA2dpService).removeActiveDevice(false);
        verify(mHeadsetService).setActiveDevice(isNull());
    }
@@ -1049,8 +1050,9 @@ public class ActiveDeviceManagerTest {
    /** An LE Audio is connected. Then a combo (A2DP + Headset) device is connected. */
    @Test
    public void leAudioActive_setA2dpAndHeadsetActive() {
        leAudioActiveDeviceChanged(mLeAudioDevice);
        leAudioConnected(mLeAudioDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService).setActiveDevice(mLeAudioDevice);
        verify(mHeadsetService).setActiveDevice(null);

        a2dpConnected(mA2dpHeadsetDevice, true);
@@ -1063,8 +1065,9 @@ public class ActiveDeviceManagerTest {
    /** An LE Audio is connected. Then an A2DP active device is explicitly set. */
    @Test
    public void leAudioActive_setA2dpActiveExplicitly() {
        leAudioActiveDeviceChanged(mLeAudioDevice);
        leAudioConnected(mLeAudioDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService).setActiveDevice(mLeAudioDevice);
        verify(mHeadsetService).setActiveDevice(null);

        a2dpConnected(mA2dpDevice, false);
@@ -1080,8 +1083,9 @@ public class ActiveDeviceManagerTest {
    /** An LE Audio is connected. Then a Headset active device is explicitly set. */
    @Test
    public void leAudioActive_setHeadsetActiveExplicitly() {
        leAudioActiveDeviceChanged(mLeAudioDevice);
        leAudioConnected(mLeAudioDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService).setActiveDevice(mLeAudioDevice);
        verify(mHeadsetService).setActiveDevice(null);

        headsetConnected(mHeadsetDevice, false);
@@ -1662,6 +1666,23 @@ public class ActiveDeviceManagerTest {
        verify(mLeAudioService, never()).setActiveDevice(any());
    }

    /**
     * Verifies that a Le Audio Unicast device is not treated as connected when an active device
     * change is received after the device has been disconnected.
     */
    @Test
    public void leAudioActiveDeviceChangeBeforeConnectedEvent() {
        /* Active device change comes after disconnection (device considered as not connected) */
        leAudioActiveDeviceChanged(mLeAudioDevice);
        verify(mLeAudioService, never()).setActiveDevice(mLeAudioDevice);
        mTestLooper.dispatchAll();

        /* Device is connected back */
        leAudioConnected(mLeAudioDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService).setActiveDevice(mLeAudioDevice);
    }

    /** Helper to indicate A2dp connected for a device. */
    private void a2dpConnected(BluetoothDevice device, boolean supportHfp) {
        mDatabaseManager.setProfileConnectionPolicy(