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

Commit 6e171ef4 authored by Grace Jia's avatar Grace Jia
Browse files

Fix audio switch of speaker -> BT LE or speaker -> HA issue.

Currently in U, only speaker, BT LE and hearing aid device use
set/clear communication device of AudioManager to enter/exit its
audio routes. When we try to switch to BT LE devices or HA
devices, in order to do it succesfully, try to clear any already
set speaker communicatio ndevice.

Bug: b/283198536
Test: atest BluetoothDeviceManagerTest
      Manually test speaker -> BT LE/HA devices to make sure it
      worked as expected.

Change-Id: I9ad4b830a1347bb8a258ed8af24c54ea1afb155d
parent 3ca0266c
Loading
Loading
Loading
Loading
+21 −21
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ import android.bluetooth.BluetoothStatusCodes;
import android.content.Context;
import android.media.AudioManager;
import android.media.AudioDeviceInfo;
import android.media.audio.common.AudioDevice;
import android.os.Bundle;
import android.telecom.Log;
import android.util.ArraySet;
@@ -40,13 +39,13 @@ import com.android.server.telecom.CallAudioCommunicationDeviceTracker;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.concurrent.Executor;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;

public class BluetoothDeviceManager {

@@ -459,13 +458,9 @@ public class BluetoothDeviceManager {
        return mHearingAidSetAsCommunicationDevice;
    }

    public void clearLeAudioCommunicationDevice() {
    public void clearLeAudioOrSpeakerCommunicationDevice() {
        Log.i(this, "clearLeAudioCommunicationDevice: mLeAudioSetAsCommunicationDevice = " +
                mLeAudioSetAsCommunicationDevice + " device = " + mLeAudioDevice);
        if (!mLeAudioSetAsCommunicationDevice) {
            return;
        }
        mLeAudioSetAsCommunicationDevice = false;
        if (mLeAudioDevice != null) {
            mBluetoothRouteManager.onAudioLost(mLeAudioDevice);
            mLeAudioDevice = null;
@@ -477,20 +472,20 @@ public class BluetoothDeviceManager {
        }

        AudioDeviceInfo audioDeviceInfo = mAudioManager.getCommunicationDevice();
        if (audioDeviceInfo != null && audioDeviceInfo.getType()
                == AudioDeviceInfo.TYPE_BLE_HEADSET) {
        if (audioDeviceInfo != null) {
            if (audioDeviceInfo.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) {
                mBluetoothRouteManager.onAudioLost(audioDeviceInfo.getAddress());
                mAudioManager.clearCommunicationDevice();
            } else if (audioDeviceInfo.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {
                mAudioManager.clearCommunicationDevice();
            }
        }
        mLeAudioSetAsCommunicationDevice = false;
    }

    public void clearHearingAidCommunicationDevice() {
    public void clearHearingAidOrSpeakerCommunicationDevice() {
        Log.i(this, "clearHearingAidCommunicationDevice: mHearingAidSetAsCommunicationDevice = "
                + mHearingAidSetAsCommunicationDevice);
        if (!mHearingAidSetAsCommunicationDevice) {
            return;
        }
        mHearingAidSetAsCommunicationDevice = false;
        if (mHearingAidDevice != null) {
            mBluetoothRouteManager.onAudioLost(mHearingAidDevice);
            mHearingAidDevice = null;
@@ -502,10 +497,15 @@ public class BluetoothDeviceManager {
        }

        AudioDeviceInfo audioDeviceInfo = mAudioManager.getCommunicationDevice();
        if (audioDeviceInfo != null && audioDeviceInfo.getType()
                == AudioDeviceInfo.TYPE_HEARING_AID) {
        if (audioDeviceInfo != null) {
            if (audioDeviceInfo.getType() == AudioDeviceInfo.TYPE_BLE_HEADSET) {
                mBluetoothRouteManager.onAudioLost(audioDeviceInfo.getAddress());
                mAudioManager.clearCommunicationDevice();
            } else if (audioDeviceInfo.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {
                mAudioManager.clearCommunicationDevice();
            }
        }
        mHearingAidSetAsCommunicationDevice = false;
    }

    public boolean setLeAudioCommunicationDevice() {
@@ -542,7 +542,7 @@ public class BluetoothDeviceManager {
        }

        // clear hearing aid communication device if set
        clearHearingAidCommunicationDevice();
        clearHearingAidOrSpeakerCommunicationDevice();

        // Turn BLE_OUT_HEADSET ON.
        boolean result = mAudioManager.setCommunicationDevice(bleHeadset);
@@ -591,7 +591,7 @@ public class BluetoothDeviceManager {
        }

        // clear LE audio communication device if set
        clearLeAudioCommunicationDevice();
        clearLeAudioOrSpeakerCommunicationDevice();

        // Turn hearing aid ON.
        boolean result = mAudioManager.setCommunicationDevice(hearingAid);
+2 −0
Original line number Diff line number Diff line
@@ -423,6 +423,7 @@ public class BluetoothDeviceManagerTest extends TelecomTestCase {
        List<AudioDeviceInfo> devices = new ArrayList<>();
        devices.add(mockAudioDeviceInfo);

        when(mockAudioManager.getCommunicationDevice()).thenReturn(mSpeakerInfo);
        when(mockAudioManager.getAvailableCommunicationDevices())
                .thenReturn(devices);
        when(mockAudioManager.setCommunicationDevice(eq(mockAudioDeviceInfo)))
@@ -458,6 +459,7 @@ public class BluetoothDeviceManagerTest extends TelecomTestCase {
        List<AudioDeviceInfo> devices = new ArrayList<>();
        devices.add(mockAudioDeviceInfo);

        when(mockAudioManager.getCommunicationDevice()).thenReturn(mSpeakerInfo);
        when(mockAudioManager.getAvailableCommunicationDevices())
                        .thenReturn(devices);
        when(mockAudioManager.setCommunicationDevice(mockAudioDeviceInfo))