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

Commit 972fa271 authored by Sungsoo Lim's avatar Sungsoo Lim
Browse files

Set LeAudio active properly for HAP devices

And change LinkedList to ArrayList.

Bug: 255564133
Tag: #refactor
Test: atest BluetoothInstrumentationTests:ActiveDeviceManager
Change-Id: Ie0f9fb03bd867964b5ce028577646703da108b3b
parent 2bc1bc37
Loading
Loading
Loading
Loading
+37 −26
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ import com.android.bluetooth.hfp.HeadsetService;
import com.android.bluetooth.le_audio.LeAudioService;
import com.android.internal.annotations.VisibleForTesting;

import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@@ -131,11 +131,12 @@ class ActiveDeviceManager {
    private final AudioManager mAudioManager;
    private final AudioManagerAudioDeviceCallback mAudioManagerAudioDeviceCallback;

    private final List<BluetoothDevice> mA2dpConnectedDevices = new LinkedList<>();
    private final List<BluetoothDevice> mHfpConnectedDevices = new LinkedList<>();
    private final List<BluetoothDevice> mHearingAidConnectedDevices = new LinkedList<>();
    private final List<BluetoothDevice> mLeAudioConnectedDevices = new LinkedList<>();
    private final List<BluetoothDevice> mLeHearingAidConnectedDevices = new LinkedList<>();
    private final List<BluetoothDevice> mA2dpConnectedDevices = new ArrayList<>();
    private final List<BluetoothDevice> mHfpConnectedDevices = new ArrayList<>();
    private final List<BluetoothDevice> mHearingAidConnectedDevices = new ArrayList<>();
    private final List<BluetoothDevice> mLeAudioConnectedDevices = new ArrayList<>();
    private final List<BluetoothDevice> mLeHearingAidConnectedDevices = new ArrayList<>();
    private List<BluetoothDevice> mPendingLeHearingAidActiveDevice = new ArrayList<>();
    private BluetoothDevice mA2dpActiveDevice = null;
    private BluetoothDevice mHfpActiveDevice = null;
    private BluetoothDevice mHearingAidActiveDevice = null;
@@ -432,11 +433,17 @@ class ActiveDeviceManager {
                            break;      // The device is already connected
                        }
                        mLeAudioConnectedDevices.add(device);
                        if (mHearingAidActiveDevice == null && mLeHearingAidActiveDevice == null) {
                        if (mHearingAidActiveDevice == null && mLeHearingAidActiveDevice == null
                                && mPendingLeHearingAidActiveDevice.isEmpty()) {
                            // New connected device: select it as active
                            setLeAudioActiveDevice(device);
                            setA2dpActiveDevice(null);
                            setHfpActiveDevice(null);
                        } else if (mPendingLeHearingAidActiveDevice.contains(device)) {
                            setLeHearingAidActiveDevice(device);
                            setHearingAidActiveDevice(null);
                            setA2dpActiveDevice(null);
                            setHfpActiveDevice(null);
                        }
                        break;
                    }
@@ -447,6 +454,7 @@ class ActiveDeviceManager {
                                    + "_CHANGED): device " + device + " disconnected");
                        }
                        mLeAudioConnectedDevices.remove(device);
                        mLeHearingAidConnectedDevices.remove(device);
                        if (Objects.equals(mLeAudioActiveDevice, device)) {
                            if (mLeAudioConnectedDevices.isEmpty()) {
                                setLeAudioActiveDevice(null);
@@ -499,12 +507,16 @@ class ActiveDeviceManager {
                        }
                        mLeHearingAidConnectedDevices.add(device);
                        if (!mLeAudioConnectedDevices.contains(device)) {
                            mLeAudioConnectedDevices.add(device);
                        }
                            mPendingLeHearingAidActiveDevice.add(device);
                        } else if (Objects.equals(mLeAudioActiveDevice, device)) {
                            mLeHearingAidActiveDevice = device;
                        } else {
                            // New connected device: select it as active
                            setLeHearingAidActiveDevice(device);
                            setHearingAidActiveDevice(null);
                            setA2dpActiveDevice(null);
                            setHfpActiveDevice(null);
                        }
                        break;
                    }
                    if (prevState == BluetoothProfile.STATE_CONNECTED) {
@@ -514,15 +526,9 @@ class ActiveDeviceManager {
                                    + "_CHANGED): device " + device + " disconnected");
                        }
                        mLeHearingAidConnectedDevices.remove(device);
                        mLeAudioConnectedDevices.remove(device);
                        // mLeAudioConnectedDevices should contain all of
                        // mLeHearingAidConnectedDevices. Call setLeAudioActiveDevice(null)
                        // only if there are no LE audio devices.
                        mPendingLeHearingAidActiveDevice.remove(device);
                        if (Objects.equals(mLeHearingAidActiveDevice, device)) {
                            if (mLeAudioConnectedDevices.isEmpty()) {
                                setLeAudioActiveDevice(null);
                            }
                            setFallbackDeviceActive();
                            mLeHearingAidActiveDevice = null;
                        }
                    }
                }
@@ -532,8 +538,8 @@ class ActiveDeviceManager {
                    Intent intent = (Intent) msg.obj;
                    BluetoothDevice device =
                            intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                    if (device != null && !mLeAudioConnectedDevices.contains(device)) {
                        mLeAudioConnectedDevices.add(device);
                    if (device != null && !mLeHearingAidConnectedDevices.contains(device)) {
                        mLeHearingAidConnectedDevices.add(device);
                    }
                    if (DBG) {
                        Log.d(TAG, "handleMessage(MESSAGE_HAP_ACTION_ACTIVE_DEVICE_CHANGED): "
@@ -711,14 +717,18 @@ class ActiveDeviceManager {
        mLeAudioActiveDevice = device;
        if (device == null) {
            mLeHearingAidActiveDevice = null;
            mPendingLeHearingAidActiveDevice.remove(device);
        }
    }

    private void setLeHearingAidActiveDevice(BluetoothDevice device) {
        if (!Objects.equals(mLeAudioActiveDevice, device)) {
            setLeAudioActiveDevice(device);
        if (mLeAudioActiveDevice == device) {
        }
        if (Objects.equals(mLeAudioActiveDevice, device)) {
            // setLeAudioActiveDevice succeed
            mLeHearingAidActiveDevice = device;
            mPendingLeHearingAidActiveDevice.remove(device);
        }
    }

@@ -730,7 +740,7 @@ class ActiveDeviceManager {
        if (dbManager == null) {
            return;
        }
        List<BluetoothDevice> connectedHearingAidDevices = new LinkedList<>();
        List<BluetoothDevice> connectedHearingAidDevices = new ArrayList<>();
        if (!mHearingAidConnectedDevices.isEmpty()) {
            connectedHearingAidDevices.addAll(mHearingAidConnectedDevices);
        }
@@ -774,7 +784,7 @@ class ActiveDeviceManager {
            headsetFallbackDevice = headsetService.getFallbackDevice();
        }

        List<BluetoothDevice> connectedDevices = new LinkedList<>();
        List<BluetoothDevice> connectedDevices = new ArrayList<>();
        connectedDevices.addAll(mLeAudioConnectedDevices);
        switch (mAudioManager.getMode()) {
            case AudioManager.MODE_NORMAL:
@@ -849,6 +859,7 @@ class ActiveDeviceManager {

        mLeHearingAidConnectedDevices.clear();
        mLeHearingAidActiveDevice = null;
        mPendingLeHearingAidActiveDevice.clear();
    }

    @VisibleForTesting
+8 −1
Original line number Diff line number Diff line
@@ -600,8 +600,12 @@ public class ActiveDeviceManagerTest {
     * One LE Hearing Aid is connected.
     */
    @Test
    public void onlyLeHearingAIdConnected_setLeAudioActive() {
    public void onlyLeHearingAidConnected_setLeAudioActive() {
        leHearingAidConnected(mLeHearingAidDevice);
        TestUtils.waitForLooperToFinishScheduledTask(mActiveDeviceManager.getHandlerLooper());
        verify(mLeAudioService, never()).setActiveDevice(mLeHearingAidDevice);

        leAudioConnected(mLeHearingAidDevice);
        verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice);
    }

@@ -612,6 +616,7 @@ public class ActiveDeviceManagerTest {
    @Test
    public void leAudioConnectedAfterLeHearingAid_setLeAudioActiveShouldNotBeCalled() {
        leHearingAidConnected(mLeHearingAidDevice);
        leAudioConnected(mLeHearingAidDevice);
        verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice);

        leAudioConnected(mLeAudioDevice);
@@ -632,6 +637,7 @@ public class ActiveDeviceManagerTest {
        verify(mHearingAidService, timeout(TIMEOUT_MS)).setActiveDevice(mHearingAidDevice);

        leHearingAidConnected(mLeHearingAidDevice);
        leAudioConnected(mLeHearingAidDevice);
        verify(mLeAudioService, timeout(TIMEOUT_MS)).setActiveDevice(mLeHearingAidDevice);

        a2dpConnected(mA2dpDevice);
@@ -640,6 +646,7 @@ public class ActiveDeviceManagerTest {

        Mockito.clearInvocations(mHearingAidService, mA2dpService);
        leHearingAidDisconnected(mLeHearingAidDevice);
        leAudioDisconnected(mLeHearingAidDevice);
        verify(mHearingAidService, timeout(TIMEOUT_MS)).setActiveDevice(mHearingAidDevice);
        verify(mA2dpService, timeout(TIMEOUT_MS)).setActiveDevice(isNull());