Merge "Merge android10-release" into q-keystone-qcom-dev
diff --git a/src/com/android/bluetooth/btservice/PhonePolicy.java b/src/com/android/bluetooth/btservice/PhonePolicy.java
index f3097fe..529decf 100644
--- a/src/com/android/bluetooth/btservice/PhonePolicy.java
+++ b/src/com/android/bluetooth/btservice/PhonePolicy.java
@@ -326,6 +326,9 @@
                 + prevState + " -> " + nextState);
         if ((profileId == BluetoothProfile.A2DP) || (profileId == BluetoothProfile.HEADSET)
                 || profileId == BluetoothProfile.A2DP_SINK) {
+            BluetoothDevice peerTwsDevice =
+                    (mAdapterService != null && mAdapterService.isTwsPlusDevice(device)) ?
+                    mAdapterService.getTwsPlusPeerDevice(device):null;
             if (nextState == BluetoothProfile.STATE_CONNECTED) {
                 debugLog("processProfileStateChanged: isTwsDevice: " + mAdapterService.isTwsPlusDevice(device));
                 switch (profileId) {
@@ -333,12 +336,16 @@
                         mA2dpRetrySet.remove(device);
                         if (mAdapterService.isTwsPlusDevice(device)) {
                              setAutoConnectForA2dpSink(device);
+                             if (peerTwsDevice != null)
+                                 setAutoConnectForA2dpSink(peerTwsDevice);
                         }
                         break;
                     case BluetoothProfile.HEADSET:
                         mHeadsetRetrySet.remove(device);
                         if (mAdapterService.isTwsPlusDevice(device)) {
                              setAutoConnectForHeadset(device);
+                             if (peerTwsDevice != null)
+                                 setAutoConnectForHeadset(peerTwsDevice);
                         }
                         break;
                     case BluetoothProfile.A2DP_SINK:
@@ -348,24 +355,45 @@
                 connectOtherProfile(device);
             }
             if (nextState == BluetoothProfile.STATE_DISCONNECTED) {
+                HeadsetService hsService = mFactory.getHeadsetService();
+                A2dpService a2dpService = mFactory.getA2dpService();
                 handleAllProfilesDisconnected(device);
                 if (prevState == BluetoothProfile.STATE_CONNECTING) {
-                    HeadsetService hsService = mFactory.getHeadsetService();
                     boolean hsDisconnected = hsService == null
                             || hsService.getConnectionState(device)
                             == BluetoothProfile.STATE_DISCONNECTED;
-                    A2dpService a2dpService = mFactory.getA2dpService();
                     boolean a2dpDisconnected = a2dpService == null
                             || a2dpService.getConnectionState(device)
                             == BluetoothProfile.STATE_DISCONNECTED;
+                    boolean isAnyTwsPairConnected = (peerTwsDevice != null) && ((a2dpService != null) &&
+                            (a2dpService.getConnectionState(peerTwsDevice) == BluetoothProfile.STATE_CONNECTED))
+                            || ((hsService != null) &&
+                            (hsService.getConnectionState(peerTwsDevice) == BluetoothProfile.STATE_CONNECTED));
                     debugLog("processProfileStateChanged, device=" + device + ", a2dpDisconnected="
-                            + a2dpDisconnected + ", hsDisconnected=" + hsDisconnected);
+                            + a2dpDisconnected + ", hsDisconnected=" + hsDisconnected
+                            + ", TwsPairConnected=" + isAnyTwsPairConnected);
                     if (hsDisconnected && a2dpDisconnected) {
                         //remove a2dp and headset retry set.
                         mA2dpRetrySet.remove(device);
                         mHeadsetRetrySet.remove(device);
-                        removeAutoConnectFromA2dpSink(device);
-                        removeAutoConnectFromHeadset(device);
+                        if (!isAnyTwsPairConnected) {
+                            removeAutoConnectFromA2dpSink(device);
+                            removeAutoConnectFromHeadset(device);
+                        }
+                    }
+                } else if (prevState == BluetoothProfile.STATE_DISCONNECTING) {
+                    if (peerTwsDevice != null) {
+                        int autoConnect = BluetoothProfile.PRIORITY_AUTO_CONNECT;
+                        if (((a2dpService.getPriority(peerTwsDevice) == autoConnect) &&
+                                (hsService.getPriority(peerTwsDevice) == autoConnect)) ||
+                                ((a2dpService.getPriority(device) == autoConnect) &&
+                                (hsService.getPriority(device) == autoConnect))) {
+                            debugLog("User triggered disconnect reset priority ON to both EBs");
+                            removeAutoConnectFromA2dpSink(device);
+                            removeAutoConnectFromHeadset(device);
+                            removeAutoConnectFromA2dpSink(peerTwsDevice);
+                            removeAutoConnectFromHeadset(peerTwsDevice);
+                        }
                     }
                 }
             }
@@ -394,21 +422,13 @@
 
                 setAutoConnectForA2dpSink(activeDevice);
                 setAutoConnectForHeadset(activeDevice);
-                if (mAdapterService.isTwsPlusDevice(activeDevice)) {
-                    BluetoothDevice peerTwsDevice = hsService.getTwsPlusConnectedPeer(activeDevice);
+                if (mAdapterService != null && mAdapterService.isTwsPlusDevice(activeDevice)) {
+                    BluetoothDevice peerTwsDevice = mAdapterService.getTwsPlusPeerDevice(activeDevice);
                     if (peerTwsDevice != null) {
-                        if (a2dpService != null &&
-                            a2dpService.getConnectionState(peerTwsDevice) !=
-                            BluetoothProfile.STATE_DISCONNECTED) {
-                            debugLog("A2DP: Set Autoconnect for Peer TWS+ as well");
-                            setAutoConnectForA2dpSink(peerTwsDevice);
-                        }
-                        if (hsService != null &&
-                            hsService.getConnectionState(peerTwsDevice) !=
-                            BluetoothProfile.STATE_DISCONNECTED) {
-                            debugLog("HFP: Set Autoconnect for Peer TWS+ as well");
-                            setAutoConnectForHeadset(peerTwsDevice);
-                        }
+                        debugLog("A2DP: Set Autoconnect for Peer TWS+ as well");
+                        setAutoConnectForA2dpSink(peerTwsDevice);
+                        debugLog("HFP: Set Autoconnect for Peer TWS+ as well");
+                        setAutoConnectForHeadset(peerTwsDevice);
                     }
                 }
                 break;