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

Commit d3df27f9 authored by Krzysztof Kopyscinski (xWF)'s avatar Krzysztof Kopyscinski (xWF) Committed by Gerrit Code Review
Browse files

Merge "ActiveDeviceManager: don't fallback to LE Audio device without required contexts" into main

parents faba66e4 0b107ca9
Loading
Loading
Loading
Loading
+15 −3
Original line number Diff line number Diff line
@@ -1135,12 +1135,18 @@ public class ActiveDeviceManager implements AdapterService.BluetoothStateCallbac
        Log.d(TAG, "setFallbackDeviceActive, recently removed: " + recentlyRemovedDevice);
        mDbManager = mAdapterService.getDatabase();
        List<BluetoothDevice> connectedHearingAidDevices = new ArrayList<>();
        final LeAudioService leAudioService = mFactory.getLeAudioService();
        if (!mHearingAidConnectedDevices.isEmpty()) {
            connectedHearingAidDevices.addAll(mHearingAidConnectedDevices);
        }
        if (!mLeHearingAidConnectedDevices.isEmpty()) {
            connectedHearingAidDevices.addAll(mLeHearingAidConnectedDevices);
        if (!mLeHearingAidConnectedDevices.isEmpty() && leAudioService != null) {
            for (BluetoothDevice dev : mLeAudioConnectedDevices) {
                if (leAudioService.isGroupAvailableForStream(leAudioService.getGroupId(dev))) {
                    connectedHearingAidDevices.add(dev);
                }
            }
        }

        if (!connectedHearingAidDevices.isEmpty()) {
            BluetoothDevice device =
                    mDbManager.getMostRecentlyConnectedDevicesInList(connectedHearingAidDevices);
@@ -1196,7 +1202,13 @@ public class ActiveDeviceManager implements AdapterService.BluetoothStateCallbac
        }

        List<BluetoothDevice> connectedDevices = new ArrayList<>();
        connectedDevices.addAll(mLeAudioConnectedDevices);
        if (leAudioService != null) {
            for (BluetoothDevice dev : mLeAudioConnectedDevices) {
                if (leAudioService.isGroupAvailableForStream(leAudioService.getGroupId(dev))) {
                    connectedDevices.add(dev);
                }
            }
        }
        Log.d(TAG, "Audio mode: " + mAudioManager.getMode());
        switch (mAudioManager.getMode()) {
            case AudioManager.MODE_NORMAL:
+60 −0
Original line number Diff line number Diff line
@@ -854,6 +854,66 @@ public class ActiveDeviceManagerTest {
        verify(mLeAudioService, never()).setActiveDevice(mLeAudioDevice);
    }

    /**
     * LE Audio is connected but is not ready for stream (no available context types). Check if it's
     * not used as fallback device from A2DP
     */
    @Test
    public void leAudioFallbackA2dpToLeaudio_notReadyForStream() {
        when(mLeAudioService.isGroupAvailableForStream(anyInt())).thenReturn(false);
        leAudioConnected(mLeAudioDevice);
        a2dpConnected(mA2dpDevice, true);
        mTestLooper.dispatchAll();
        verify(mLeAudioService, never()).setActiveDevice(mLeAudioDevice);
        verify(mA2dpService).setActiveDevice(mA2dpDevice);

        a2dpDisconnected(mA2dpDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService, never()).setActiveDevice(mLeAudioDevice);
    }

    /**
     * LE Audio is connected but is not ready for stream (no available context types). Check if it's
     * not used as fallback device from A2DP
     */
    @Test
    public void leAudioFallbackLeaudioToLeaudio_notReadyForStream() {
        /* LeAudio device from group 1 - not ready for stream */
        when(mLeAudioService.getGroupId(mLeAudioDevice)).thenReturn(1);
        /* LeAudio device from group 1 - ready for stream */
        when(mLeAudioService.getGroupId(mSecondaryAudioDevice)).thenReturn(2);
        when(mLeAudioService.isGroupAvailableForStream(1)).thenReturn(false);
        when(mLeAudioService.isGroupAvailableForStream(2)).thenReturn(true);
        leAudioConnected(mLeAudioDevice);
        leAudioConnected(mSecondaryAudioDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService, never()).setActiveDevice(mLeAudioDevice);
        verify(mLeAudioService).setActiveDevice(mSecondaryAudioDevice);

        leAudioDisconnected(mSecondaryAudioDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService, never()).setActiveDevice(mLeAudioDevice);
    }

    /**
     * LE Audio is connected but is not ready for stream (no available context types). Check if it's
     * not used as fallback device from ASHA
     */
    @Test
    public void leAudioFallbackAshaToLeaudio_notReadyForStream() {
        when(mLeAudioService.isGroupAvailableForStream(anyInt())).thenReturn(false);

        leAudioConnected(mLeAudioDevice);
        hearingAidConnected(mHearingAidDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService, never()).setActiveDevice(mLeAudioDevice);
        verify(mHearingAidService).setActiveDevice(mHearingAidDevice);

        hearingAidDisconnected(mHearingAidDevice);
        mTestLooper.dispatchAll();
        verify(mLeAudioService, never()).setActiveDevice(mLeAudioDevice);
    }

    /** Two LE Audio are connected. Should set the second one active. */
    @Test
    public void secondLeAudioConnected_setSecondLeAudioActive() {