Add hearing aid device in audio switch

- Add connected hearing aid device to MediaOutputPreferenceController
and HandsFreeProfileOutputPreferenceController

- Set active device to different profile depend on HisyncId

Bug: 78142719
Test: make RunSettingsRoboTests ROBOTEST_FILTER="MediaOutputPreferenceControllerTest" -j28
Test: make RunSettingsRoboTests ROBOTEST_FILTER="HandsFreeProfileOutputPreferenceControllerTest" -j28
Test: make RunSettingsRoboTests ROBOTEST_FILTER="AudioOutputSwitchPreferenceControllerTest" -j28
Change-Id: Ib8fe4f06f8564572dffdce6fcc3f29578bf91bd9
This commit is contained in:
ryanywlin
2018-04-28 07:26:46 +08:00
parent 9f407aba36
commit 8276d966e9
7 changed files with 664 additions and 206 deletions

View File

@@ -37,6 +37,8 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.Shadows.shadowOf;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothManager;
@@ -69,7 +71,6 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.Shadows;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowBluetoothDevice;
@@ -114,11 +115,11 @@ public class AudioOutputSwitchPreferenceControllerTest {
private BluetoothManager mBluetoothManager;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothDevice mBluetoothDevice;
private BluetoothDevice mBluetoothHapDevice;
private BluetoothDevice mSecondBluetoothHapDevice;
private BluetoothDevice mLeftBluetoothHapDevice;
private BluetoothDevice mRightBluetoothHapDevice;
private LocalBluetoothManager mLocalBluetoothManager;
private AudioSwitchPreferenceController mController;
private List<BluetoothDevice> mConnectedDevices;
private List<BluetoothDevice> mProfileConnectedDevices;
private List<BluetoothDevice> mHearingAidActiveDevices;
private List<BluetoothDevice> mEmptyDevices;
@@ -146,15 +147,15 @@ public class AudioOutputSwitchPreferenceControllerTest {
when(mBluetoothDevice.getName()).thenReturn(TEST_DEVICE_NAME_1);
when(mBluetoothDevice.isConnected()).thenReturn(true);
mBluetoothHapDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_2));
when(mBluetoothHapDevice.isConnected()).thenReturn(true);
mSecondBluetoothHapDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_3));
when(mSecondBluetoothHapDevice.isConnected()).thenReturn(true);
mLeftBluetoothHapDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_2));
when(mLeftBluetoothHapDevice.isConnected()).thenReturn(true);
mRightBluetoothHapDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_3));
when(mRightBluetoothHapDevice.isConnected()).thenReturn(true);
mController = new AudioSwitchPreferenceControllerTestable(mContext, TEST_KEY);
mScreen = spy(new PreferenceScreen(mContext, null));
mPreference = new ListPreference(mContext);
mConnectedDevices = new ArrayList<>(2);
mProfileConnectedDevices = new ArrayList<>();
mHearingAidActiveDevices = new ArrayList<>(2);
mEmptyDevices = new ArrayList<>(2);
@@ -204,9 +205,8 @@ public class AudioOutputSwitchPreferenceControllerTest {
@Test
public void onPreferenceChange_toThisDevice_shouldSetDefaultSummary() {
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mController.mConnectedDevices = mConnectedDevices;
mController.mConnectedDevices.clear();
mController.mConnectedDevices.add(mBluetoothDevice);
mController.onPreferenceChange(mPreference,
mContext.getText(R.string.media_output_default_summary));
@@ -221,9 +221,8 @@ public class AudioOutputSwitchPreferenceControllerTest {
*/
@Test
public void onPreferenceChange_toBtDevice_shouldSetBtDeviceName() {
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mController.mConnectedDevices = mConnectedDevices;
mController.mConnectedDevices.clear();
mController.mConnectedDevices.add(mBluetoothDevice);
mController.onPreferenceChange(mPreference, TEST_DEVICE_ADDRESS_1);
@@ -239,12 +238,11 @@ public class AudioOutputSwitchPreferenceControllerTest {
ShadowBluetoothDevice shadowBluetoothDevice;
BluetoothDevice secondBluetoothDevice;
secondBluetoothDevice = mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_2);
shadowBluetoothDevice = Shadows.shadowOf(secondBluetoothDevice);
shadowBluetoothDevice = shadowOf(secondBluetoothDevice);
shadowBluetoothDevice.setName(TEST_DEVICE_NAME_2);
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mConnectedDevices.add(secondBluetoothDevice);
mController.mConnectedDevices = mConnectedDevices;
mController.mConnectedDevices.clear();
mController.mConnectedDevices.add(mBluetoothDevice);
mController.mConnectedDevices.add(secondBluetoothDevice);
mController.onPreferenceChange(mPreference, TEST_DEVICE_ADDRESS_2);
@@ -252,12 +250,12 @@ public class AudioOutputSwitchPreferenceControllerTest {
}
/**
* mConnectedDevices is Null.
* mConnectedDevices is empty.
* onPreferenceChange should return false.
*/
@Test
public void onPreferenceChange_connectedDeviceIsNull_shouldReturnFalse() {
mController.mConnectedDevices = null;
mController.mConnectedDevices.clear();
assertThat(mController.onPreferenceChange(mPreference, TEST_DEVICE_ADDRESS_1)).isFalse();
}
@@ -268,7 +266,7 @@ public class AudioOutputSwitchPreferenceControllerTest {
*/
@Test
public void isStreamFromOutputDevice_outputDeviceIsBtScoHeadset_shouldReturnTrue() {
mShadowAudioManager.setStream(DEVICE_OUT_BLUETOOTH_SCO_HEADSET);
mShadowAudioManager.setOutputDevice(DEVICE_OUT_BLUETOOTH_SCO_HEADSET);
assertThat(mController.isStreamFromOutputDevice(STREAM_MUSIC, DEVICE_OUT_ALL_SCO)).isTrue();
}
@@ -288,10 +286,10 @@ public class AudioOutputSwitchPreferenceControllerTest {
*/
@Test
public void findActiveDevice_streamMusicToA2dpDevice_shouldReturnActiveA2dpDevice() {
mShadowAudioManager.setStream(DEVICE_OUT_BLUETOOTH_A2DP);
mShadowAudioManager.setOutputDevice(DEVICE_OUT_BLUETOOTH_A2DP);
mHearingAidActiveDevices.clear();
mHearingAidActiveDevices.add(mBluetoothHapDevice);
when(mHeadsetProfile.getActiveDevice()).thenReturn(mBluetoothHapDevice);
mHearingAidActiveDevices.add(mLeftBluetoothHapDevice);
when(mHeadsetProfile.getActiveDevice()).thenReturn(mLeftBluetoothHapDevice);
when(mA2dpProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mHearingAidProfile.getActiveDevices()).thenReturn(mHearingAidActiveDevices);
@@ -304,11 +302,11 @@ public class AudioOutputSwitchPreferenceControllerTest {
*/
@Test
public void findActiveDevice_streamVoiceCallToHfpDevice_shouldReturnActiveHfpDevice() {
mShadowAudioManager.setStream(DEVICE_OUT_BLUETOOTH_SCO);
mShadowAudioManager.setOutputDevice(DEVICE_OUT_BLUETOOTH_SCO);
mHearingAidActiveDevices.clear();
mHearingAidActiveDevices.add(mBluetoothHapDevice);
mHearingAidActiveDevices.add(mLeftBluetoothHapDevice);
when(mHeadsetProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mA2dpProfile.getActiveDevice()).thenReturn(mBluetoothHapDevice);
when(mA2dpProfile.getActiveDevice()).thenReturn(mLeftBluetoothHapDevice);
when(mHearingAidProfile.getActiveDevices()).thenReturn(mHearingAidActiveDevices);
assertThat(mController.findActiveDevice(STREAM_VOICE_CALL)).isEqualTo(mBluetoothDevice);
@@ -321,19 +319,20 @@ public class AudioOutputSwitchPreferenceControllerTest {
*/
@Test
public void findActiveDevice_streamToHapDeviceLeftActiveDevice_shouldReturnActiveHapDevice() {
mShadowAudioManager.setStream(DEVICE_OUT_HEARING_AID);
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mConnectedDevices.add(mBluetoothHapDevice);
mShadowAudioManager.setOutputDevice(DEVICE_OUT_HEARING_AID);
mController.mConnectedDevices.clear();
mController.mConnectedDevices.add(mBluetoothDevice);
mController.mConnectedDevices.add(mLeftBluetoothHapDevice);
mHearingAidActiveDevices.clear();
mHearingAidActiveDevices.add(mBluetoothHapDevice);
mController.mConnectedDevices = mConnectedDevices;
mHearingAidActiveDevices.add(mLeftBluetoothHapDevice);
mHearingAidActiveDevices.add(null);
when(mHeadsetProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mA2dpProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mHearingAidProfile.getActiveDevices()).thenReturn(mHearingAidActiveDevices);
assertThat(mController.findActiveDevice(STREAM_MUSIC)).isEqualTo(mBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_VOICE_CALL)).isEqualTo(mBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_MUSIC)).isEqualTo(mLeftBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_VOICE_CALL)).isEqualTo(
mLeftBluetoothHapDevice);
}
/**
@@ -343,20 +342,21 @@ public class AudioOutputSwitchPreferenceControllerTest {
*/
@Test
public void findActiveDevice_streamToHapDeviceRightActiveDevice_shouldReturnActiveHapDevice() {
mShadowAudioManager.setStream(DEVICE_OUT_HEARING_AID);
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mConnectedDevices.add(mBluetoothHapDevice);
mShadowAudioManager.setOutputDevice(DEVICE_OUT_HEARING_AID);
mController.mConnectedDevices.clear();
mController.mConnectedDevices.add(mBluetoothDevice);
mController.mConnectedDevices.add(mRightBluetoothHapDevice);
mHearingAidActiveDevices.clear();
mHearingAidActiveDevices.add(null);
mHearingAidActiveDevices.add(mBluetoothHapDevice);
mController.mConnectedDevices = mConnectedDevices;
mHearingAidActiveDevices.add(mRightBluetoothHapDevice);
mHearingAidActiveDevices.add(mRightBluetoothHapDevice);
when(mHeadsetProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mA2dpProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mHearingAidProfile.getActiveDevices()).thenReturn(mHearingAidActiveDevices);
assertThat(mController.findActiveDevice(STREAM_MUSIC)).isEqualTo(mBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_VOICE_CALL)).isEqualTo(mBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_MUSIC)).isEqualTo(mRightBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_VOICE_CALL)).isEqualTo(
mRightBluetoothHapDevice);
}
/**
@@ -366,20 +366,20 @@ public class AudioOutputSwitchPreferenceControllerTest {
*/
@Test
public void findActiveDevice_streamToHapDeviceTwoActiveDevice_shouldReturnActiveHapDevice() {
mShadowAudioManager.setStream(DEVICE_OUT_HEARING_AID);
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mConnectedDevices.add(mBluetoothHapDevice);
mShadowAudioManager.setOutputDevice(DEVICE_OUT_HEARING_AID);
mController.mConnectedDevices.clear();
mController.mConnectedDevices.add(mBluetoothDevice);
mController.mConnectedDevices.add(mRightBluetoothHapDevice);
mHearingAidActiveDevices.clear();
mHearingAidActiveDevices.add(mSecondBluetoothHapDevice);
mHearingAidActiveDevices.add(mBluetoothHapDevice);
mController.mConnectedDevices = mConnectedDevices;
mHearingAidActiveDevices.add(mLeftBluetoothHapDevice);
mHearingAidActiveDevices.add(mRightBluetoothHapDevice);
when(mHeadsetProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mA2dpProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mHearingAidProfile.getActiveDevices()).thenReturn(mHearingAidActiveDevices);
assertThat(mController.findActiveDevice(STREAM_MUSIC)).isEqualTo(mBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_VOICE_CALL)).isEqualTo(mBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_MUSIC)).isEqualTo(mRightBluetoothHapDevice);
assertThat(mController.findActiveDevice(STREAM_VOICE_CALL)).isEqualTo(
mRightBluetoothHapDevice);
}
/**
@@ -389,12 +389,11 @@ public class AudioOutputSwitchPreferenceControllerTest {
*/
@Test
public void findActiveDevice_streamToOtherDevice_shouldReturnActiveHapDevice() {
mShadowAudioManager.setStream(DEVICE_OUT_HEARING_AID);
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mConnectedDevices.add(mBluetoothHapDevice);
mShadowAudioManager.setOutputDevice(DEVICE_OUT_HEARING_AID);
mController.mConnectedDevices.clear();
mController.mConnectedDevices.add(mBluetoothDevice);
mController.mConnectedDevices.add(mLeftBluetoothHapDevice);
mHearingAidActiveDevices.clear();
mController.mConnectedDevices = mConnectedDevices;
when(mHeadsetProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mA2dpProfile.getActiveDevice()).thenReturn(mBluetoothDevice);
when(mHearingAidProfile.getActiveDevices()).thenReturn(mHearingAidActiveDevices);
@@ -410,17 +409,17 @@ public class AudioOutputSwitchPreferenceControllerTest {
@Test
public void getConnectedHearingAidDevices_deviceHisyncIdIsDifferent_shouldAddBothToList() {
mEmptyDevices.clear();
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothHapDevice);
mConnectedDevices.add(mSecondBluetoothHapDevice);
when(mHearingAidProfile.getConnectedDevices()).thenReturn(mConnectedDevices);
when(mHearingAidProfile.getHiSyncId(mBluetoothHapDevice)).thenReturn(HISYNCID1);
when(mHearingAidProfile.getHiSyncId(mSecondBluetoothHapDevice)).thenReturn(
HISYNCID2);
mProfileConnectedDevices.clear();
mProfileConnectedDevices.add(mLeftBluetoothHapDevice);
mProfileConnectedDevices.add(mRightBluetoothHapDevice);
when(mHearingAidProfile.getConnectedDevices()).thenReturn(mProfileConnectedDevices);
when(mHearingAidProfile.getHiSyncId(mLeftBluetoothHapDevice)).thenReturn(HISYNCID1);
when(mHearingAidProfile.getHiSyncId(mRightBluetoothHapDevice)).thenReturn(HISYNCID2);
mEmptyDevices.addAll(mController.getConnectedHearingAidDevices());
assertThat(mEmptyDevices).containsExactly(mBluetoothHapDevice, mSecondBluetoothHapDevice);
assertThat(mEmptyDevices).containsExactly(mLeftBluetoothHapDevice,
mRightBluetoothHapDevice);
}
/**
@@ -430,17 +429,16 @@ public class AudioOutputSwitchPreferenceControllerTest {
@Test
public void getConnectedHearingAidDevices_deviceHisyncIdIsSame_shouldAddOneToList() {
mEmptyDevices.clear();
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothHapDevice);
mConnectedDevices.add(mSecondBluetoothHapDevice);
when(mHearingAidProfile.getConnectedDevices()).thenReturn(mConnectedDevices);
when(mHearingAidProfile.getHiSyncId(mBluetoothHapDevice)).thenReturn(HISYNCID1);
when(mHearingAidProfile.getHiSyncId(mSecondBluetoothHapDevice)).thenReturn(
HISYNCID1);
mProfileConnectedDevices.clear();
mProfileConnectedDevices.add(mLeftBluetoothHapDevice);
mProfileConnectedDevices.add(mRightBluetoothHapDevice);
when(mHearingAidProfile.getConnectedDevices()).thenReturn(mProfileConnectedDevices);
when(mHearingAidProfile.getHiSyncId(mLeftBluetoothHapDevice)).thenReturn(HISYNCID1);
when(mHearingAidProfile.getHiSyncId(mRightBluetoothHapDevice)).thenReturn(HISYNCID1);
mEmptyDevices.addAll(mController.getConnectedHearingAidDevices());
assertThat(mEmptyDevices).containsExactly(mBluetoothHapDevice);
assertThat(mEmptyDevices).containsExactly(mLeftBluetoothHapDevice);
}
/**
@@ -450,9 +448,9 @@ public class AudioOutputSwitchPreferenceControllerTest {
@Test
public void getConnectedA2dpDevices_oneConnectedA2dpDevice_shouldAddDeviceToList() {
mEmptyDevices.clear();
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
when(mA2dpProfile.getConnectedDevices()).thenReturn(mConnectedDevices);
mProfileConnectedDevices.clear();
mProfileConnectedDevices.add(mBluetoothDevice);
when(mA2dpProfile.getConnectedDevices()).thenReturn(mProfileConnectedDevices);
mEmptyDevices.addAll(mController.getConnectedA2dpDevices());
@@ -466,14 +464,14 @@ public class AudioOutputSwitchPreferenceControllerTest {
@Test
public void getConnectedA2dpDevices_moreThanOneConnectedA2dpDevice_shouldAddDeviceToList() {
mEmptyDevices.clear();
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mConnectedDevices.add(mBluetoothHapDevice);
when(mA2dpProfile.getConnectedDevices()).thenReturn(mConnectedDevices);
mProfileConnectedDevices.clear();
mProfileConnectedDevices.add(mBluetoothDevice);
mProfileConnectedDevices.add(mLeftBluetoothHapDevice);
when(mA2dpProfile.getConnectedDevices()).thenReturn(mProfileConnectedDevices);
mEmptyDevices.addAll(mController.getConnectedA2dpDevices());
assertThat(mEmptyDevices).containsExactly(mBluetoothDevice, mBluetoothHapDevice);
assertThat(mEmptyDevices).containsExactly(mBluetoothDevice, mLeftBluetoothHapDevice);
}
/**
@@ -483,9 +481,9 @@ public class AudioOutputSwitchPreferenceControllerTest {
@Test
public void getConnectedHfpDevices_oneConnectedHfpDevice_shouldAddDeviceToList() {
mEmptyDevices.clear();
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
when(mHeadsetProfile.getConnectedDevices()).thenReturn(mConnectedDevices);
mProfileConnectedDevices.clear();
mProfileConnectedDevices.add(mBluetoothDevice);
when(mHeadsetProfile.getConnectedDevices()).thenReturn(mProfileConnectedDevices);
mEmptyDevices.addAll(mController.getConnectedHfpDevices());
@@ -499,14 +497,14 @@ public class AudioOutputSwitchPreferenceControllerTest {
@Test
public void getConnectedHfpDevices_moreThanOneConnectedHfpDevice_shouldAddDeviceToList() {
mEmptyDevices.clear();
mConnectedDevices.clear();
mConnectedDevices.add(mBluetoothDevice);
mConnectedDevices.add(mBluetoothHapDevice);
when(mHeadsetProfile.getConnectedDevices()).thenReturn(mConnectedDevices);
mProfileConnectedDevices.clear();
mProfileConnectedDevices.add(mBluetoothDevice);
mProfileConnectedDevices.add(mLeftBluetoothHapDevice);
when(mHeadsetProfile.getConnectedDevices()).thenReturn(mProfileConnectedDevices);
mEmptyDevices.addAll(mController.getConnectedHfpDevices());
assertThat(mEmptyDevices).containsExactly(mBluetoothDevice, mBluetoothHapDevice);
assertThat(mEmptyDevices).containsExactly(mBluetoothDevice, mLeftBluetoothHapDevice);
}
private class AudioSwitchPreferenceControllerTestable extends