Merge "Bluetooth: TWSP: Retry SCO connection to peer earbud only If it is INEAR" into bt.lnx.5.0
diff --git a/system_bt_ext/bta/include/bta_ag_twsp_dev.h b/system_bt_ext/bta/include/bta_ag_twsp_dev.h
index 592038c..c1e2b23 100644
--- a/system_bt_ext/bta/include/bta_ag_twsp_dev.h
+++ b/system_bt_ext/bta/include/bta_ag_twsp_dev.h
@@ -64,10 +64,11 @@
 #define TWSPLUS_QDSP_ECHO_CANCELLATION 1
 
 enum {
-  TWSPLUS_EB_STATE_OFF,
+  TWSPLUS_EB_STATE_UNKNOWN,
   TWSPLUS_EB_STATE_INCASE,
   TWSPLUS_EB_STATE_OUT_OF_EAR,
   TWSPLUS_EB_STATE_INEAR,
+  TWSPLUS_EB_STATE_OFF
 };
 
 enum {
@@ -100,6 +101,7 @@
 bool twsp_get_right_eb_addr(RawAddress& eb_addr);
 bool twsp_get_left_eb_addr(RawAddress& eb_addr);
 uint8_t get_twsp_role(tBTA_AG_SCB *p_scb);
+uint8_t get_twsp_state(tBTA_AG_SCB *p_scb);
 tBTA_AG_SCB* twsp_get_best_mic_scb ();
 int twsp_get_idx_by_scb(tBTA_AG_SCB* p_scb);
 
diff --git a/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_dev.cc b/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_dev.cc
index 125e889..fde7388 100644
--- a/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_dev.cc
+++ b/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_dev.cc
@@ -84,7 +84,7 @@
 
     twsp_devices[eb_idx].p_scb = NULL;
     twsp_devices[eb_idx].battery_charge = TWSPLUS_MIN_BATTERY_CHARGE;
-    twsp_devices[eb_idx].state = TWSPLUS_EB_STATE_OFF;
+    twsp_devices[eb_idx].state = TWSPLUS_EB_STATE_UNKNOWN;
     twsp_devices[eb_idx].role =  TWSPLUS_EB_ROLE_INVALID;
     twsp_devices[eb_idx].mic_path_delay = TWSPLUS_INVALID_MICPATH_DELAY;
     twsp_devices[eb_idx].mic_quality = TWSPLUS_MIN_MIC_QUALITY;
@@ -99,7 +99,7 @@
             APPL_TRACE_WARNING("%s: idx: %d, p_scb: %x", __func__, i, p_scb);
             twsp_devices[i].p_scb = p_scb;
             twsp_devices[i].battery_charge = TWSPLUS_MIN_BATTERY_CHARGE;
-            twsp_devices[i].state = TWSPLUS_EB_STATE_OFF;
+            twsp_devices[i].state = TWSPLUS_EB_STATE_UNKNOWN;
 
             int other_idx = (i == PRIMARY_EB_IDX) ? SECONDARY_EB_IDX : PRIMARY_EB_IDX;
             if (twsp_devices[other_idx].p_scb != NULL &&
@@ -387,7 +387,7 @@
         return false;
     }
 
-    if (state < TWSPLUS_EB_STATE_OFF || state > TWSPLUS_EB_STATE_INEAR) {
+    if (state < TWSPLUS_EB_STATE_UNKNOWN || state > TWSPLUS_EB_STATE_INEAR) {
         APPL_TRACE_WARNING("%s: Invalid state: %d\n", __func__, state);
         return false;
     }
@@ -459,6 +459,20 @@
     return role;
 }
 
+uint8_t get_twsp_state(tBTA_AG_SCB *p_scb) {
+    APPL_TRACE_DEBUG("%s: p_scb : %d\n", __func__, p_scb);
+    uint8_t state = TWSPLUS_EB_STATE_UNKNOWN;
+    for (int i=0; i<=SECONDARY_EB_IDX; i++) {
+        if (p_scb == twsp_devices[i].p_scb)
+        {
+           state = twsp_devices[i].state;
+           break;
+        }
+    }
+    APPL_TRACE_DEBUG("%s: returns  : %d", __func__, state);
+    return state;
+}
+
 bool twsp_is_ring_sent(tBTA_AG_SCB *p_scb) {
     int sel_idx = -1;
     bool ret = false;
diff --git a/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_sco.cc b/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_sco.cc
index 5f6af9b..614c80d 100644
--- a/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_sco.cc
+++ b/system_bt_ext/bta/tws_plus/ag/bta_ag_twsp_sco.cc
@@ -315,7 +315,8 @@
                 bta_ag_create_sco(p_scb, false);
                 p_sco->state = BTA_AG_SCO_LISTEN_ST;
                 other_scb = get_other_twsp_scb((p_scb->peer_addr));
-                if (other_scb && twsp_sco_active(other_scb) == false) {
+                if (other_scb && twsp_sco_active(other_scb) == false &&
+                     get_twsp_state(other_scb) == TWSPLUS_EB_STATE_INEAR) {
                     //Atleast try bringing up the other EB eSCO
                     APPL_TRACE_WARNING("Calling SCO open for other EB");
                     dispatch_event_primary_peer_device(p_scb, BTA_AG_SCO_OPEN_E);