OSDN Git Service

HFP: Save discovered HFP version to config file
authorJack He <siyuanh@google.com>
Sat, 21 Oct 2017 08:35:57 +0000 (01:35 -0700)
committerJack He <siyuanh@google.com>
Wed, 28 Mar 2018 01:10:55 +0000 (18:10 -0700)
* Store discovered HFP version to btif config file so that a
  reconnection session knows the HFP version before SDP
* Check stored HFP version when RFCOMM channel is open before any AT
  command is processed
* Set peer HFP version to 0 on control block allocation

Bug: 67938255
Test: Connect with HFP 1.7 headsets
Change-Id: I43e7aa04dee17ea7ba9e7d3992ec0860c11d23bc
(cherry picked from commit 79b4e0710b23f9bd96c0fc71d68e6649188b1bde)

bta/Android.bp
bta/ag/bta_ag_act.cc
bta/ag/bta_ag_main.cc
bta/ag/bta_ag_sdp.cc
bta/include/bta_ag_api.h

index e406e60..d6919de 100644 (file)
@@ -13,6 +13,7 @@ cc_defaults {
         "system/bt/bta/include",
         "system/bt/btcore/include",
         "system/bt/btif/avrcp",
+        "system/bt/btif/include",
         "system/bt/hci/include",
         "system/bt/internal_include",
         "system/bt/stack/include",
index 7756c41..75063ac 100644 (file)
@@ -29,6 +29,7 @@
 #include "bta_api.h"
 #include "bta_dm_api.h"
 #include "bta_sys.h"
+#include "btif_config.h"
 #include "l2c_api.h"
 #include "osi/include/osi.h"
 #include "port_api.h"
@@ -457,6 +458,16 @@ void bta_ag_rfc_open(tBTA_AG_SCB* p_scb, const tBTA_AG_DATA& data) {
   p_scb->cmee_enabled = false;
   p_scb->inband_enabled =
       ((p_scb->features & BTA_AG_FEAT_INBAND) == BTA_AG_FEAT_INBAND);
+  if (p_scb->conn_service == BTA_AG_HFP) {
+    size_t version_value_size = sizeof(p_scb->peer_version);
+    if (!btif_config_get_bin(
+            p_scb->peer_addr.ToString(), HFP_VERSION_CONFIG_KEY,
+            (uint8_t*)&p_scb->peer_version, &version_value_size)) {
+      APPL_TRACE_WARNING("%s: Failed read cached peer HFP version for %s",
+                         __func__, p_scb->peer_addr.ToString().c_str());
+      p_scb->peer_version = HFP_HSP_VERSION_UNKNOWN;
+    }
+  }
 
   /* set up AT command interpreter */
   p_scb->at_cb.p_at_tbl = bta_ag_at_tbl[p_scb->conn_service];
index 95303fa..58fb623 100644 (file)
@@ -309,6 +309,7 @@ static tBTA_AG_SCB* bta_ag_scb_alloc(void) {
       p_scb->codec_fallback = false;
       p_scb->peer_codecs = BTA_AG_CODEC_CVSD;
       p_scb->sco_codec = BTA_AG_CODEC_CVSD;
+      p_scb->peer_version = HFP_HSP_VERSION_UNKNOWN;
       /* set up timers */
       p_scb->ring_timer = alarm_new("bta_ag.scb_ring_timer");
       p_scb->collision_timer = alarm_new("bta_ag.scb_collision_timer");
index c0fa5a0..07ed60c 100644 (file)
@@ -32,6 +32,7 @@
 #include "bta_ag_int.h"
 #include "bta_api.h"
 #include "bta_sys.h"
+#include "btif_config.h"
 #include "btm_api.h"
 #include "osi/include/osi.h"
 #include "sdp_api.h"
@@ -297,7 +298,10 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) {
 
   if (service & BTA_HFP_SERVICE_MASK) {
     uuid = UUID_SERVCLASS_HF_HANDSFREE;
-    p_scb->peer_version = HFP_VERSION_1_1; /* Default version */
+    /* If there is no cached peer version, use default one */
+    if (p_scb->peer_version == HFP_HSP_VERSION_UNKNOWN) {
+      p_scb->peer_version = HFP_VERSION_1_1; /* Default version */
+    }
   } else if (service & BTA_HSP_SERVICE_MASK && p_scb->role == BTA_AG_INT) {
     uuid = UUID_SERVCLASS_HEADSET_HS;
     p_scb->peer_version = HSP_VERSION_1_2; /* Default version */
@@ -333,13 +337,27 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) {
     }
 
     /* get profile version (if failure, version parameter is not updated) */
-    if (!SDP_FindProfileVersionInRec(p_rec, uuid, &p_scb->peer_version)) {
+    uint16_t peer_version = HFP_HSP_VERSION_UNKNOWN;
+    if (!SDP_FindProfileVersionInRec(p_rec, uuid, &peer_version)) {
       APPL_TRACE_WARNING("%s: Get peer_version failed, using default 0x%04x",
                          __func__, p_scb->peer_version);
+      peer_version = p_scb->peer_version;
     }
 
-    /* get features if HFP */
     if (service & BTA_HFP_SERVICE_MASK) {
+      /* Update cached peer version if the new one is different */
+      if (peer_version != p_scb->peer_version) {
+        p_scb->peer_version = peer_version;
+        if (btif_config_set_bin(
+                p_scb->peer_addr.ToString(), HFP_VERSION_CONFIG_KEY,
+                (const uint8_t*)&peer_version, sizeof(peer_version))) {
+          btif_config_save();
+        } else {
+          APPL_TRACE_WARNING("%s: Failed to store peer HFP version for %s",
+                             __func__, p_scb->peer_addr.ToString().c_str());
+        }
+      }
+      /* get features if HFP */
       p_attr = SDP_FindAttributeInRec(p_rec, ATTR_ID_SUPPORTED_FEATURES);
       if (p_attr != nullptr) {
         /* Found attribute. Get value. */
@@ -348,8 +366,10 @@ bool bta_ag_sdp_find_attr(tBTA_AG_SCB* p_scb, tBTA_SERVICE_MASK service) {
         if (p_scb->peer_features == 0)
           p_scb->peer_features = p_attr->attr_value.v.u16;
       }
-    } else /* HSP */
-    {
+    } else {
+      /* No peer version caching for HSP, use discovered one directly */
+      p_scb->peer_version = peer_version;
+      /* get features if HSP */
       p_attr =
           SDP_FindAttributeInRec(p_rec, ATTR_ID_REMOTE_AUDIO_VOLUME_CONTROL);
       if (p_attr != nullptr) {
index bc6f5f4..d6ec916 100644 (file)
@@ -36,6 +36,7 @@
 /* Number of SCBs (AG service instances that can be registered) */
 #define BTA_AG_MAX_NUM_CLIENTS 6
 
+#define HFP_HSP_VERSION_UNKNOWN 0x0000
 #define HFP_VERSION_1_1 0x0101
 #define HFP_VERSION_1_5 0x0105
 #define HFP_VERSION_1_6 0x0106
@@ -44,6 +45,8 @@
 #define HSP_VERSION_1_0 0x0100
 #define HSP_VERSION_1_2 0x0102
 
+#define HFP_VERSION_CONFIG_KEY "HfpVersion"
+
 /* Note, if you change the default version here, please also change the one in
  * bta_hs_api.h, they are meant to be the same.
  */