Change bluetooth routing to be more responsive
Rely on the BT stack's audio-off message to transition into the
audio-off state.
Bug: 115319793
Test: manual
Change-Id: Ie476ede3d805d8046ca2c6d4ede407fd1c93b79c
diff --git a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
index 7ab6ab2..0fc7a9d 100644
--- a/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
+++ b/src/com/android/server/telecom/bluetooth/BluetoothRouteManager.java
@@ -123,7 +123,7 @@
BluetoothDevice erroneouslyConnectedDevice = getBluetoothAudioConnectedDevice();
if (erroneouslyConnectedDevice != null) {
Log.w(LOG_TAG, "Entering AudioOff state but device %s appears to be connected. " +
- "Switching to audio-on state for %s", erroneouslyConnectedDevice);
+ "Switching to audio-on state for that device.", erroneouslyConnectedDevice);
// change this to just transition to the new audio on state
transitionToActualState();
}
@@ -264,7 +264,6 @@
break;
case DISCONNECT_HFP:
disconnectAudio();
- transitionTo(mAudioOffState);
break;
case RETRY_HFP_CONNECTION:
if (Objects.equals(address, mDeviceAddress)) {
@@ -377,7 +376,6 @@
break;
case DISCONNECT_HFP:
disconnectAudio();
- transitionTo(mAudioOffState);
break;
case RETRY_HFP_CONNECTION:
if (Objects.equals(address, mDeviceAddress)) {
diff --git a/tests/src/com/android/server/telecom/tests/BluetoothRouteTransitionTests.java b/tests/src/com/android/server/telecom/tests/BluetoothRouteTransitionTests.java
index db111d4..0ec6c5d 100644
--- a/tests/src/com/android/server/telecom/tests/BluetoothRouteTransitionTests.java
+++ b/tests/src/com/android/server/telecom/tests/BluetoothRouteTransitionTests.java
@@ -19,8 +19,10 @@
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.content.ContentResolver;
+import android.telecom.Log;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.internal.os.SomeArgs;
import com.android.server.telecom.BluetoothHeadsetProxy;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.Timeouts;
@@ -243,6 +245,17 @@
setupConnectedDevices(mParams.connectedDevices,
mParams.audioOnDevice, mParams.activeDevice);
sm.setActiveDeviceCacheForTesting(mParams.activeDevice);
+ if (mParams.initialDevice != null) {
+ doAnswer(invocation -> {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = Log.createSubsession();
+ args.arg2 = mParams.initialDevice.getAddress();
+ sm.sendMessage(BluetoothRouteManager.HFP_LOST, args);
+ when(mHeadsetProxy.getAudioState(eq(mParams.initialDevice)))
+ .thenReturn(BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
+ return true;
+ }).when(mHeadsetProxy).disconnectAudio();
+ }
// Go through the utility methods for these two messages
if (mParams.messageType == BluetoothRouteManager.NEW_DEVICE_CONNECTED) {
@@ -257,6 +270,8 @@
}
waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT);
+ waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT);
+ waitForHandlerAction(sm.getHandler(), TEST_TIMEOUT);
assertEquals(mParams.expectedFinalStateName, sm.getCurrentState().getName());
for (ListenerUpdate lu : mParams.expectedListenerUpdates) {