AudioService: restore A2DP/wired headset auto selection

Restore automatic routing behavior when wired headset or BT headset
is connected.
This behavior was changed by commit 0234587b
This change mostly reverts 0234587b but keeps public methods
setBluetoothA2dpOn() and isBluetoothA2dpOn() deprecated with
stub implementations.

Bug: 30963785
Bug: 31424965
Change-Id: I90ea04584df595a778993595ad0076fef809ed98
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index da0c05e..b4606bb 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -510,8 +510,11 @@
     private int mDeviceOrientation = Configuration.ORIENTATION_UNDEFINED;
 
     // Request to override default use of A2DP for media.
-    // FIXME: remove when MediaRouter does not use setBluetoothA2dpOn() anymore
     private boolean mBluetoothA2dpEnabled;
+    // FIXME: remove when MediaRouter does not use setBluetoothA2dpOn() anymore
+    // state of bluetooth A2DP enable request sen by deprecated APIs setBluetoothA2dpOn() and
+    // isBluettohA2dpOn()
+    private boolean mBluetoothA2dpEnabledExternal;
     private final Object mBluetoothA2dpEnabledLock = new Object();
 
     // Monitoring of audio routes.  Protected by mCurAudioRoutes.
@@ -840,6 +843,12 @@
             RotationHelper.updateOrientation();
         }
 
+        synchronized (mBluetoothA2dpEnabledLock) {
+            AudioSystem.setForceUse(AudioSystem.FOR_MEDIA,
+                    mBluetoothA2dpEnabled ?
+                            AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP);
+        }
+
         synchronized (mSettingsLock) {
             AudioSystem.setForceUse(AudioSystem.FOR_DOCK,
                     mDockAudioMediaEnabled ?
@@ -2706,7 +2715,7 @@
      * @deprecated
      * */
     public void setBluetoothA2dpOn(boolean on) {
-        mBluetoothA2dpEnabled = on;
+        mBluetoothA2dpEnabledExternal = on;
         Log.e(TAG, "setBluetoothA2dpOn() is deprecated, now a no-op",
                 new Exception("Deprecated use of setBluetoothA2dpOn()"));
     }
@@ -2716,7 +2725,7 @@
      * @deprecated
      * */
     public boolean isBluetoothA2dpOn() {
-        return mBluetoothA2dpEnabled;
+        return mBluetoothA2dpEnabledExternal;
     }
 
     /** @see AudioManager#startBluetoothSco() */
@@ -3787,6 +3796,11 @@
                 Slog.i(TAG, "setWiredDeviceConnectionState(" + state + " nm: " + name + " addr:"
                         + address + ")");
             }
+            if ((state == 0) && ((type == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
+                    (type == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) ||
+                    (type == AudioSystem.DEVICE_OUT_LINE))) {
+                setBluetoothA2dpOnInt(true);
+            }
             int delay = checkSendBecomingNoisyIntent(type, state);
             queueMsgUnderWakeLock(mAudioHandler,
                     MSG_SET_WIRED_DEVICE_CONNECTION_STATE,
@@ -4767,6 +4781,7 @@
         VolumeStreamState streamState = mStreamStates[AudioSystem.STREAM_MUSIC];
         sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE,
                 AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP, 0, streamState, 0);
+        setBluetoothA2dpOnInt(true);
         AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
                 AudioSystem.DEVICE_STATE_AVAILABLE, address, name);
         // Reset A2DP suspend state each time a new sink is connected
@@ -5004,6 +5019,7 @@
                     devices |= dev;
                 }
             }
+
             if (devices == device) {
                 sendMsg(mAudioHandler,
                         MSG_BROADCAST_AUDIO_BECOMING_NOISY,
@@ -5107,6 +5123,11 @@
                 return;
             }
             if (state != 0) {
+                if ((device == AudioSystem.DEVICE_OUT_WIRED_HEADSET) ||
+                    (device == AudioSystem.DEVICE_OUT_WIRED_HEADPHONE) ||
+                    (device == AudioSystem.DEVICE_OUT_LINE)) {
+                    setBluetoothA2dpOnInt(false);
+                }
                 if ((device & mSafeMediaVolumeDevices) != 0) {
                     sendMsg(mAudioHandler,
                             MSG_CHECK_MUSIC_ACTIVE,
@@ -5572,9 +5593,26 @@
         }
     }
 
+    // Handles request to override default use of A2DP for media.
+    // Must be called synchronized on mConnectedDevices
+    public void setBluetoothA2dpOnInt(boolean on) {
+        synchronized (mBluetoothA2dpEnabledLock) {
+            mBluetoothA2dpEnabled = on;
+            setForceUseInt_SyncDevices(AudioSystem.FOR_MEDIA,
+                    mBluetoothA2dpEnabled ? AudioSystem.FORCE_NONE : AudioSystem.FORCE_NO_BT_A2DP);
+        }
+    }
+
     // Must be called synchronized on mConnectedDevices
     private void setForceUseInt_SyncDevices(int usage, int config) {
         switch (usage) {
+            case AudioSystem.FOR_MEDIA:
+                if (config == AudioSystem.FORCE_NO_BT_A2DP) {
+                    mBecomingNoisyIntentDevices &= ~AudioSystem.DEVICE_OUT_ALL_A2DP;
+                } else { // config == AudioSystem.FORCE_NONE
+                    mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ALL_A2DP;
+                }
+                break;
             case AudioSystem.FOR_DOCK:
                 if (config == AudioSystem.FORCE_ANALOG_DOCK) {
                     mBecomingNoisyIntentDevices |= AudioSystem.DEVICE_OUT_ANLG_DOCK_HEADSET;