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) {