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:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user