diff options
author | Charlie Boutier <charliebout@google.com> | 2023-12-01 17:05:19 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2023-12-01 17:05:19 +0000 |
commit | 22808895b09bed6ed9a4b83791df78d602f1b695 (patch) | |
tree | 67e405b99b5d876ee8c1d3aa2ea0d04d069b740a | |
parent | 3952b78c76a4386331e6371c8c48330cf8ae5bc2 (diff) | |
parent | b24bc2bb9b33c72919e144dc9141f191d92c818b (diff) | |
download | Telecomm-22808895b09bed6ed9a4b83791df78d602f1b695.tar.gz |
Merge "Revert^2 "Hearing Aid: Connect route when right HA is connected first"" into main
-rw-r--r-- | src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java | 43 | ||||
-rw-r--r-- | tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java | 86 |
2 files changed, 111 insertions, 18 deletions
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java index 9def4c0d4..235ba56c4 100644 --- a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java +++ b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java @@ -47,6 +47,7 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -136,7 +137,8 @@ public class BluetoothRouteManager extends StateMachine { @Override public void enter() { BluetoothDevice erroneouslyConnectedDevice = getBluetoothAudioConnectedDevice(); - if (erroneouslyConnectedDevice != null) { + if (erroneouslyConnectedDevice != null && + !erroneouslyConnectedDevice.equals(mHearingAidActiveDeviceCache)) { Log.w(LOG_TAG, "Entering AudioOff state but device %s appears to be connected. " + "Switching to audio-on state for that device.", erroneouslyConnectedDevice); // change this to just transition to the new audio on state @@ -254,6 +256,27 @@ public class BluetoothRouteManager extends StateMachine { SomeArgs args = (SomeArgs) msg.obj; String address = (String) args.arg2; boolean switchingBtDevices = !Objects.equals(mDeviceAddress, address); + + if (switchingBtDevices == true) { // check if it is an hearing aid pair + BluetoothAdapter bluetoothAdapter = mDeviceManager.getBluetoothAdapter(); + if (bluetoothAdapter != null) { + List<BluetoothDevice> activeHearingAids = + bluetoothAdapter.getActiveDevices(BluetoothProfile.HEARING_AID); + for (BluetoothDevice hearingAid : activeHearingAids) { + if (hearingAid != null) { + String hearingAidAddress = hearingAid.getAddress(); + if (hearingAidAddress != null) { + if (hearingAidAddress.equals(address) || + hearingAidAddress.equals(mDeviceAddress)) { + switchingBtDevices = false; + break; + } + } + } + } + + } + } try { switch (msg.what) { case NEW_DEVICE_CONNECTED: @@ -869,12 +892,18 @@ public class BluetoothRouteManager extends StateMachine { : mDeviceManager.isHearingAidSetAsCommunicationDevice(); if (bluetoothHearingAid != null) { if (isHearingAidSetForCommunication) { - for (BluetoothDevice device : bluetoothAdapter.getActiveDevices( - BluetoothProfile.HEARING_AID)) { - if (device != null) { - hearingAidActiveDevice = device; - activeDevices++; - break; + List<BluetoothDevice> hearingAidsActiveDevices = bluetoothAdapter.getActiveDevices( + BluetoothProfile.HEARING_AID); + if (hearingAidsActiveDevices.contains(mHearingAidActiveDeviceCache)) { + hearingAidActiveDevice = mHearingAidActiveDeviceCache; + activeDevices++; + } else { + for (BluetoothDevice device : hearingAidsActiveDevices) { + if (device != null) { + hearingAidActiveDevice = device; + activeDevices++; + break; + } } } } diff --git a/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java b/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java index ee59cb8e7..e1ef08ae2 100644 --- a/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java +++ b/tests/src/com/android/server/telecom/tests/BluetoothRouteManagerTest.java @@ -20,6 +20,7 @@ import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -37,6 +38,8 @@ import android.os.Parcel; import android.telecom.Log; import android.test.suitebuilder.annotation.SmallTest; +import android.media.AudioDeviceInfo; + import com.android.internal.os.SomeArgs; import com.android.server.telecom.CallAudioCommunicationDeviceTracker; import com.android.server.telecom.TelecomSystem; @@ -62,7 +65,14 @@ public class BluetoothRouteManagerTest extends TelecomTestCase { static final BluetoothDevice DEVICE1 = makeBluetoothDevice("00:00:00:00:00:01"); static final BluetoothDevice DEVICE2 = makeBluetoothDevice("00:00:00:00:00:02"); static final BluetoothDevice DEVICE3 = makeBluetoothDevice("00:00:00:00:00:03"); - static final BluetoothDevice HEARING_AID_DEVICE = makeBluetoothDevice("00:00:00:00:00:04"); + static final BluetoothDevice HEARING_AID_DEVICE_LEFT = makeBluetoothDevice("CA:FE:DE:CA:00:01"); + static final BluetoothDevice HEARING_AID_DEVICE_RIGHT = + makeBluetoothDevice("CA:FE:DE:CA:00:02"); + // See HearingAidService#getActiveDevices + // Note: It is really important that the left HA is the first one. The left HA is always + // in the first index (0) and the right one in the second index (1). + static final BluetoothDevice[] HEARING_AIDS = + new BluetoothDevice[]{HEARING_AID_DEVICE_LEFT, HEARING_AID_DEVICE_RIGHT}; @Mock private BluetoothAdapter mBluetoothAdapter; @Mock private BluetoothDeviceManager mDeviceManager; @@ -87,6 +97,59 @@ public class BluetoothRouteManagerTest extends TelecomTestCase { @SmallTest @Test + public void testConnectLeftHearingAidWhenLeftIsActive() { + BluetoothRouteManager sm = setupStateMachine( + BluetoothRouteManager.AUDIO_OFF_STATE_NAME, HEARING_AID_DEVICE_LEFT); + sm.onActiveDeviceChanged(HEARING_AID_DEVICE_LEFT, + BluetoothDeviceManager.DEVICE_TYPE_HEARING_AID); + when(mDeviceManager.connectAudio(anyString(), anyBoolean())).thenReturn(true); + when(mDeviceManager.isHearingAidSetAsCommunicationDevice()).thenReturn(true); + + setupConnectedDevices(null, HEARING_AIDS, null, null, HEARING_AIDS, null); + when(mBluetoothHeadset.getAudioState(nullable(BluetoothDevice.class))) + .thenReturn(BluetoothHeadset.STATE_AUDIO_DISCONNECTED); + + executeRoutingAction(sm, + BluetoothRouteManager.NEW_DEVICE_CONNECTED, HEARING_AID_DEVICE_LEFT.getAddress()); + + executeRoutingAction(sm, + BluetoothRouteManager.CONNECT_BT, HEARING_AID_DEVICE_LEFT.getAddress()); + + assertEquals(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX + + ":" + HEARING_AID_DEVICE_LEFT.getAddress(), sm.getCurrentState().getName()); + + sm.quitNow(); + } + + @SmallTest + @Test + public void testConnectRightHearingAidWhenLeftIsActive() { + BluetoothRouteManager sm = setupStateMachine( + BluetoothRouteManager.AUDIO_OFF_STATE_NAME, HEARING_AID_DEVICE_RIGHT); + sm.onActiveDeviceChanged(HEARING_AID_DEVICE_LEFT, + BluetoothDeviceManager.DEVICE_TYPE_HEARING_AID); + when(mDeviceManager.connectAudio(anyString(), anyBoolean())).thenReturn(true); + when(mDeviceManager.isHearingAidSetAsCommunicationDevice()).thenReturn(true); + + + setupConnectedDevices(null, HEARING_AIDS, null, null, HEARING_AIDS, null); + when(mBluetoothHeadset.getAudioState(nullable(BluetoothDevice.class))) + .thenReturn(BluetoothHeadset.STATE_AUDIO_DISCONNECTED); + + executeRoutingAction(sm, + BluetoothRouteManager.NEW_DEVICE_CONNECTED, HEARING_AID_DEVICE_LEFT.getAddress()); + + executeRoutingAction(sm, + BluetoothRouteManager.CONNECT_BT, HEARING_AID_DEVICE_LEFT.getAddress()); + + assertEquals(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX + + ":" + HEARING_AID_DEVICE_LEFT.getAddress(), sm.getCurrentState().getName()); + + sm.quitNow(); + } + + @SmallTest + @Test public void testConnectBtRetryWhileNotConnected() { BluetoothRouteManager sm = setupStateMachine( BluetoothRouteManager.AUDIO_OFF_STATE_NAME, null); @@ -113,15 +176,15 @@ public class BluetoothRouteManagerTest extends TelecomTestCase { BluetoothRouteManager sm = setupStateMachine( BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX, DEVICE1); setupConnectedDevices(new BluetoothDevice[]{DEVICE1}, - new BluetoothDevice[]{HEARING_AID_DEVICE}, new BluetoothDevice[]{DEVICE2}, - DEVICE1, HEARING_AID_DEVICE, DEVICE2); + HEARING_AIDS, new BluetoothDevice[]{DEVICE2}, + DEVICE1, HEARING_AIDS, DEVICE2); sm.onActiveDeviceChanged(DEVICE1, BluetoothDeviceManager.DEVICE_TYPE_HEADSET); sm.onActiveDeviceChanged(DEVICE2, BluetoothDeviceManager.DEVICE_TYPE_LE_AUDIO); - sm.onActiveDeviceChanged(HEARING_AID_DEVICE, + sm.onActiveDeviceChanged(HEARING_AID_DEVICE_LEFT, BluetoothDeviceManager.DEVICE_TYPE_HEARING_AID); executeRoutingAction(sm, BluetoothRouteManager.BT_AUDIO_LOST, DEVICE1.getAddress()); - verifyConnectionAttempt(HEARING_AID_DEVICE, 0); + verifyConnectionAttempt(HEARING_AID_DEVICE_LEFT, 0); verifyConnectionAttempt(DEVICE1, 0); verifyConnectionAttempt(DEVICE2, 0); assertEquals(BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX @@ -176,11 +239,11 @@ public class BluetoothRouteManagerTest extends TelecomTestCase { @Test public void testSkipInactiveBtDeviceWhenEvaluateActualState() { BluetoothRouteManager sm = setupStateMachine( - BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX, HEARING_AID_DEVICE); - setupConnectedDevices(null, new BluetoothDevice[]{HEARING_AID_DEVICE}, - null, null, HEARING_AID_DEVICE, null); + BluetoothRouteManager.AUDIO_CONNECTED_STATE_NAME_PREFIX, HEARING_AID_DEVICE_LEFT); + setupConnectedDevices(null, HEARING_AIDS, + null, null, HEARING_AIDS, null); executeRoutingAction(sm, BluetoothRouteManager.BT_AUDIO_LOST, - HEARING_AID_DEVICE.getAddress()); + HEARING_AID_DEVICE_LEFT.getAddress()); assertEquals(BluetoothRouteManager.AUDIO_OFF_STATE_NAME, sm.getCurrentState().getName()); sm.quitNow(); } @@ -227,10 +290,11 @@ public class BluetoothRouteManagerTest extends TelecomTestCase { private void setupConnectedDevices(BluetoothDevice[] hfpDevices, BluetoothDevice[] hearingAidDevices, BluetoothDevice[] leAudioDevices, - BluetoothDevice hfpActiveDevice, BluetoothDevice hearingAidActiveDevice, + BluetoothDevice hfpActiveDevice, BluetoothDevice[] hearingAidActiveDevices, BluetoothDevice leAudioDevice) { if (hfpDevices == null) hfpDevices = new BluetoothDevice[]{}; if (hearingAidDevices == null) hearingAidDevices = new BluetoothDevice[]{}; + if (hearingAidActiveDevices == null) hearingAidActiveDevices = new BluetoothDevice[]{}; if (leAudioDevice == null) leAudioDevices = new BluetoothDevice[]{}; when(mDeviceManager.getNumConnectedDevices()).thenReturn( @@ -249,7 +313,7 @@ public class BluetoothRouteManagerTest extends TelecomTestCase { when(mBluetoothHearingAid.getConnectedDevices()) .thenReturn(Arrays.asList(hearingAidDevices)); when(mBluetoothAdapter.getActiveDevices(eq(BluetoothProfile.HEARING_AID))) - .thenReturn(Arrays.asList(hearingAidActiveDevice, null)); + .thenReturn(Arrays.asList(hearingAidActiveDevices)); when(mBluetoothAdapter.getActiveDevices(eq(BluetoothProfile.LE_AUDIO))) .thenReturn(Arrays.asList(leAudioDevice, null)); } |