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
This commit is contained in:
Hugh Chen
2022-09-13 12:56:53 +00:00
parent d7d1d9451b
commit f8704add51
2 changed files with 132 additions and 9 deletions

View File

@@ -53,6 +53,8 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont
@VisibleForTesting @VisibleForTesting
AudioDeviceAttributes mAudioDevice; AudioDeviceAttributes mAudioDevice;
private boolean mIsAvailable;
public BluetoothDetailsSpatialAudioController( public BluetoothDetailsSpatialAudioController(
Context context, Context context,
PreferenceFragmentCompat fragment, PreferenceFragmentCompat fragment,
@@ -61,16 +63,13 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont
super(context, fragment, device, lifecycle); super(context, fragment, device, lifecycle);
AudioManager audioManager = context.getSystemService(AudioManager.class); AudioManager audioManager = context.getSystemService(AudioManager.class);
mSpatializer = audioManager.getSpatializer(); mSpatializer = audioManager.getSpatializer();
mAudioDevice = new AudioDeviceAttributes( getAvailableDevice();
AudioDeviceAttributes.ROLE_OUTPUT,
AudioDeviceInfo.TYPE_BLUETOOTH_A2DP,
mCachedDevice.getAddress());
} }
@Override @Override
public boolean isAvailable() { public boolean isAvailable() {
return mSpatializer.isAvailableForDevice(mAudioDevice) ? true : false; return mIsAvailable;
} }
@Override @Override
@@ -152,4 +151,52 @@ public class BluetoothDetailsSpatialAudioController extends BluetoothDetailsCont
pref.setOnPreferenceClickListener(this); pref.setOnPreferenceClickListener(this);
return pref; 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);
}
} }

View File

@@ -22,7 +22,9 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.bluetooth.BluetoothDevice;
import android.media.AudioDeviceAttributes; import android.media.AudioDeviceAttributes;
import android.media.AudioDeviceInfo;
import android.media.AudioManager; import android.media.AudioManager;
import android.media.Spatializer; import android.media.Spatializer;
@@ -57,6 +59,8 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails
private Lifecycle mSpatialAudioLifecycle; private Lifecycle mSpatialAudioLifecycle;
@Mock @Mock
private PreferenceCategory mProfilesContainer; private PreferenceCategory mProfilesContainer;
@Mock
private BluetoothDevice mBluetoothDevice;
private BluetoothDetailsSpatialAudioController mController; private BluetoothDetailsSpatialAudioController mController;
private SwitchPreference mSpatialAudioPref; private SwitchPreference mSpatialAudioPref;
@@ -70,6 +74,8 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails
when(mContext.getSystemService(AudioManager.class)).thenReturn(mAudioManager); when(mContext.getSystemService(AudioManager.class)).thenReturn(mAudioManager);
when(mAudioManager.getSpatializer()).thenReturn(mSpatializer); when(mAudioManager.getSpatializer()).thenReturn(mSpatializer);
when(mCachedDevice.getAddress()).thenReturn(MAC_ADDRESS); when(mCachedDevice.getAddress()).thenReturn(MAC_ADDRESS);
when(mCachedDevice.getDevice()).thenReturn(mBluetoothDevice);
when(mBluetoothDevice.getAnonymizedAddress()).thenReturn(MAC_ADDRESS);
mController = new BluetoothDetailsSpatialAudioController(mContext, mFragment, mController = new BluetoothDetailsSpatialAudioController(mContext, mFragment,
mCachedDevice, mSpatialAudioLifecycle); mCachedDevice, mSpatialAudioLifecycle);
@@ -83,15 +89,85 @@ public class BluetoothDetailsSpatialAudioControllerTest extends BluetoothDetails
} }
@Test @Test
public void isAvailable_spatialAudioIsAvailable_returnsTrue() { public void isAvailable_spatialAudioSupportA2dpDevice_returnsTrue() {
when(mSpatializer.isAvailableForDevice(mController.mAudioDevice)).thenReturn(true); 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.isAvailable()).isTrue();
assertThat(mController.mAudioDevice.getType())
.isEqualTo(AudioDeviceInfo.TYPE_BLUETOOTH_A2DP);
} }
@Test @Test
public void isAvailable_spatialAudioIsNotAvailable_returnsFalse() { public void isAvailable_spatialAudioSupportBleHeadsetDevice_returnsTrue() {
when(mSpatializer.isAvailableForDevice(mController.mAudioDevice)).thenReturn(false); 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_spatialAudioNotSupported_returnsFalse() {
assertThat(mController.isAvailable()).isFalse(); assertThat(mController.isAvailable()).isFalse();
assertThat(mController.mAudioDevice.getType())
.isEqualTo(AudioDeviceInfo.TYPE_HEARING_AID);
} }
@Test @Test