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

Commit f8704add authored by Hugh Chen's avatar Hugh Chen
Browse files

Add Spatial audio settings for LE Audio devices

- Adds TYPE_BLE_HEADSE, TYPE_BLE_SPEAKER and TYPE_BLE_BROADCAST for
  display Le audio devices.
- Adds TYPE_HEARING_AID for display hearing aid devices.

Bug: 244528781
Test: make -j64 RunSettingsRoboTests
Change-Id: I1278a5e0c93fdc5a4873df68032128ffedfe72d6
parent d7d1d945
Loading
Loading
Loading
Loading
+52 −5
Original line number Diff line number Diff line
@@ -53,6 +53,8 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont
    @VisibleForTesting
    AudioDeviceAttributes mAudioDevice;

    private boolean mIsAvailable;

    public BluetoothDetailsSpatialAudioController(
            Context context,
            PreferenceFragmentCompat fragment,
@@ -61,16 +63,13 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont
        super(context, fragment, device, lifecycle);
        AudioManager audioManager = context.getSystemService(AudioManager.class);
        mSpatializer = audioManager.getSpatializer();
        mAudioDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
                mCachedDevice.getAddress());
        getAvailableDevice();

    }

    @Override
    public boolean isAvailable() {
        return mSpatializer.isAvailableForDevice(mAudioDevice) ? true : false;
        return mIsAvailable;
    }

    @Override
@@ -152,4 +151,52 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont
        pref.setOnPreferenceClickListener(this);
        return pref;
    }

    private void getAvailableDevice() {
        AudioDeviceAttributes a2dpDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
                mCachedDevice.getAddress());
        AudioDeviceAttributes bleHeadsetDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLE_HEADSET,
                mCachedDevice.getAddress());
        AudioDeviceAttributes bleSpeakerDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLE_SPEAKER,
                mCachedDevice.getAddress());
        AudioDeviceAttributes bleBroadcastDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLE_BROADCAST,
                mCachedDevice.getAddress());
        AudioDeviceAttributes hearingAidDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_HEARING_AID,
                mCachedDevice.getAddress());

        mIsAvailable = true;
        if (mSpatializer.isAvailableForDevice(bleHeadsetDevice)) {
            mAudioDevice = bleHeadsetDevice;
        } else if (mSpatializer.isAvailableForDevice(bleSpeakerDevice)) {
            mAudioDevice = bleSpeakerDevice;
        } else if (mSpatializer.isAvailableForDevice(bleBroadcastDevice)) {
            mAudioDevice = bleBroadcastDevice;
        } else if (mSpatializer.isAvailableForDevice(a2dpDevice)) {
            mAudioDevice = a2dpDevice;
        } else {
            mIsAvailable = mSpatializer.isAvailableForDevice(hearingAidDevice);
            mAudioDevice = hearingAidDevice;
        }

        Log.d(TAG, "getAvailableDevice() device : "
                + mCachedDevice.getDevice().getAnonymizedAddress()
                + ", type : " + mAudioDevice.getType()
                + ", is available : " + mIsAvailable);
    }

    @VisibleForTesting
    void setAvailableDevice(AudioDeviceAttributes audioDevice) {
        mAudioDevice = audioDevice;
        mIsAvailable = mSpatializer.isAvailableForDevice(audioDevice);
    }
}
+80 −4
Original line number Diff line number Diff line
@@ -22,7 +22,9 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.bluetooth.BluetoothDevice;
import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioManager;
import android.media.Spatializer;

@@ -57,6 +59,8 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails
    private Lifecycle mSpatialAudioLifecycle;
    @Mock
    private PreferenceCategory mProfilesContainer;
    @Mock
    private BluetoothDevice mBluetoothDevice;

    private BluetoothDetailsSpatialAudioController mController;
    private SwitchPreference mSpatialAudioPref;
@@ -70,6 +74,8 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails
        when(mContext.getSystemService(AudioManager.class)).thenReturn(mAudioManager);
        when(mAudioManager.getSpatializer()).thenReturn(mSpatializer);
        when(mCachedDevice.getAddress()).thenReturn(MAC_ADDRESS);
        when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice);
        when(mBluetoothDevice.getAnonymizedAddress()).thenReturn(MAC_ADDRESS);

        mController = new BluetoothDetailsSpatialAudioController(mContext, mFragment,
                mCachedDevice, mSpatialAudioLifecycle);
@@ -83,15 +89,85 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails
    }

    @Test
    public void isAvailable_spatialAudioIsAvailable_returnsTrue() {
        when(mSpatializer.isAvailableForDevice(mController.mAudioDevice)).thenReturn(true);
    public void isAvailable_spatialAudioSupportA2dpDevice_returnsTrue() {
        AudioDeviceAttributes a2dpDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
                MAC_ADDRESS);
        when(mSpatializer.isAvailableForDevice(a2dpDevice)).thenReturn(true);

        mController.setAvailableDevice(a2dpDevice);

        assertThat(mController.isAvailable()).isTrue();
        assertThat(mController.mAudioDevice.getType())
                .isEqualTo(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP);
    }

    @Test
    public void isAvailable_spatialAudioSupportBleHeadsetDevice_returnsTrue() {
        AudioDeviceAttributes bleHeadsetDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLE_HEADSET,
                MAC_ADDRESS);
        when(mSpatializer.isAvailableForDevice(bleHeadsetDevice)).thenReturn(true);

        mController.setAvailableDevice(bleHeadsetDevice);

        assertThat(mController.isAvailable()).isTrue();
        assertThat(mController.mAudioDevice.getType())
                .isEqualTo(AudioDeviceInfo.TYPE_BLE_HEADSET);
    }

    @Test
    public void isAvailable_spatialAudioSupportBleSpeakerDevice_returnsTrue() {
        AudioDeviceAttributes bleSpeakerDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLE_SPEAKER,
                MAC_ADDRESS);
        when(mSpatializer.isAvailableForDevice(bleSpeakerDevice)).thenReturn(true);

        mController.setAvailableDevice(bleSpeakerDevice);

        assertThat(mController.isAvailable()).isTrue();
        assertThat(mController.mAudioDevice.getType())
                .isEqualTo(AudioDeviceInfo.TYPE_BLE_SPEAKER);
    }

    @Test
    public void isAvailable_spatialAudioSupportBleBroadcastDevice_returnsTrue() {
        AudioDeviceAttributes bleBroadcastDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_BLE_BROADCAST,
                MAC_ADDRESS);
        when(mSpatializer.isAvailableForDevice(bleBroadcastDevice)).thenReturn(true);

        mController.setAvailableDevice(bleBroadcastDevice);

        assertThat(mController.isAvailable()).isTrue();
        assertThat(mController.mAudioDevice.getType())
                .isEqualTo(AudioDeviceInfo.TYPE_BLE_BROADCAST);
    }

    @Test
    public void isAvailable_spatialAudioSupportHearingAidDevice_returnsTrue() {
        AudioDeviceAttributes hearingAidDevice = new AudioDeviceAttributes(
                AudioDeviceAttributes.ROLE_OUTPUT,
                AudioDeviceInfo.TYPE_HEARING_AID,
                MAC_ADDRESS);
        when(mSpatializer.isAvailableForDevice(hearingAidDevice)).thenReturn(true);

        mController.setAvailableDevice(hearingAidDevice);

        assertThat(mController.isAvailable()).isTrue();
        assertThat(mController.mAudioDevice.getType())
                .isEqualTo(AudioDeviceInfo.TYPE_HEARING_AID);
    }

    @Test
    public void isAvailable_spatialAudioIsNotAvailable_returnsFalse() {
        when(mSpatializer.isAvailableForDevice(mController.mAudioDevice)).thenReturn(false);
    public void isAvailable_spatialAudioNotSupported_returnsFalse() {
        assertThat(mController.isAvailable()).isFalse();
        assertThat(mController.mAudioDevice.getType())
                .isEqualTo(AudioDeviceInfo.TYPE_HEARING_AID);
    }

    @Test