Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 483217bf authored by Jack He's avatar Jack He
Browse files

HFP: Save discovered HFP version to config file

* 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
parent 067d3607
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ cc_defaults {
        "packages/modules/Bluetooth/system/bta/include",
        "packages/modules/Bluetooth/system/btcore/include",
        "packages/modules/Bluetooth/system/btif/avrcp",
        "packages/modules/Bluetooth/system/btif/include",
        "packages/modules/Bluetooth/system/hci/include",
        "packages/modules/Bluetooth/system/internal_include",
        "packages/modules/Bluetooth/system/stack/include",
+11 −0
Original line number Diff line number Diff line
@@ -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];
+1 −0
Original line number Diff line number Diff line
@@ -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");
+25 −5
Original line number Diff line number Diff line
@@ -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;
    /* 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) {
+3 −0
Original line number Diff line number Diff line
@@ -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.
 */