13fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/******************************************************************************
23fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
31025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *  Copyright (c) 2014 The Android Open Source Project
43fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  Copyright (C) 2009-2012 Broadcom Corporation
53fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
63fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  Licensed under the Apache License, Version 2.0 (the "License");
73fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  you may not use this file except in compliance with the License.
83fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  You may obtain a copy of the License at:
93fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  http://www.apache.org/licenses/LICENSE-2.0
113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  Unless required by applicable law or agreed to in writing, software
133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  distributed under the License is distributed on an "AS IS" BASIS,
143fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  See the License for the specific language governing permissions and
163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *  limitations under the License.
173fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta ******************************************************************************/
193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
20ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/*******************************************************************************
213fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
221025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *  Filename:      btif_hf_client.c
233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
241025687c6679608fe9df918f37011414ffc72b62Hemant Gupta *  Description:   Handsfree Profile (HF role) Bluetooth Interface
253fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
266664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  Notes:
276664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  a) Lifecycle of a control block
286664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  Control block handles the lifecycle for a particular remote device's
296664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  connection. The connection can go via the classic phases but more
306664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  importantly there's only two messages from BTA that affect this.
316664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  BTA_HF_CLIENT_OPEN_EVT and BTA_HF_CLIENT_CLOSE_EVT. Since the API between
326664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  BTIF and BTA is controlled entirely by handles it's important to know where
336664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  the handles are created and destroyed. Handles can be created at two
346664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  locations:
356664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  -- While connect() is called from BTIF. This is an outgoing connection
366664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  -- While accepting an incoming connection (see BTA_HF_CLIENT_OPEN_EVT
376664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  handling).
386664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *
396664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  The destruction or rather reuse of handles can be done when
406664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  BTA_HF_CLIENT_CLOSE_EVT is called. Refer to the event handling for details
416664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal *  of this.
423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta *
43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
443fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#define LOG_TAG "bt_btif_hfc"
4649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#include <stdlib.h>
48c7503db23f91676b2df732becb9579d5ccdcc7a7Ian Coolidge#include <string.h>
49d30195cbf09735da593e186c4c99cce6232b072eArman Uguray
5049a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <hardware/bluetooth.h>
5149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <hardware/bt_hf_client.h>
5249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen
531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bt_utils.h"
541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#include "bta_hf_client_api.h"
5549a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btcore/include/bdaddr.h"
5649a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_common.h"
5749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_profile_queue.h"
5849a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_util.h"
59d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h"
603eb4a4827c9436ddd8333457be3474b6fadfb38fJakub Pawlowski#include "osi/include/properties.h"
613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
62ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/*******************************************************************************
636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *  Constants & Macros
64ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
653fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifndef BTIF_HF_CLIENT_SERVICE_NAME
671025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#define BTIF_HF_CLIENT_SERVICE_NAME ("Handsfree")
683fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#endif
693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifndef BTIF_HF_CLIENT_SECURITY
716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson#define BTIF_HF_CLIENT_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)
723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#endif
733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
741025687c6679608fe9df918f37011414ffc72b62Hemant Gupta#ifndef BTIF_HF_CLIENT_FEATURES
756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson#define BTIF_HF_CLIENT_FEATURES                                                \
766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  (BTA_HF_CLIENT_FEAT_ECNR | BTA_HF_CLIENT_FEAT_3WAY |                         \
776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson   BTA_HF_CLIENT_FEAT_CLI | BTA_HF_CLIENT_FEAT_VREC | BTA_HF_CLIENT_FEAT_VOL | \
786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson   BTA_HF_CLIENT_FEAT_ECS | BTA_HF_CLIENT_FEAT_ECC | BTA_HF_CLIENT_FEAT_CODEC)
793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta#endif
803fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/*******************************************************************************
826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *  Local type definitions
83ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/* BTIF-HF control block to map bdaddr to BTA handle */
855eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwaltypedef struct {
865eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  uint16_t handle;                       // Handle obtained frm the BTA
875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  bt_bdaddr_t peer_bda;                  // Device corresponding to handle
885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  bthf_client_connection_state_t state;  // State of current connection
895eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  tBTA_HF_CLIENT_PEER_FEAT peer_feat;    // HF features
905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  tBTA_HF_CLIENT_CHLD_FEAT chld_feat;    // AT+CHLD=<> command features
915eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal} btif_hf_client_cb_t;
925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/* Max devices supported by BTIF (useful to match the value in BTA) */
945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal#define HF_CLIENT_MAX_DEVICES 10
955eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwaltypedef struct {
965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t cb[HF_CLIENT_MAX_DEVICES];
975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal} btif_hf_client_cb_arr_t;
985eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/******************************************************************************
1005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Local function declarations
1015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ******************************************************************************/
1025eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_get_cb_by_handle(uint16_t handle);
1035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_get_cb_by_bda(const uint8_t* addr);
1045eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbool is_connected(const btif_hf_client_cb_t* cb);
1053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/*******************************************************************************
1076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *  Static variables
108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bthf_client_callbacks_t* bt_hf_client_callbacks = NULL;
1103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
111d30195cbf09735da593e186c4c99cce6232b072eArman Uguraychar btif_hf_client_version[PROPERTY_VALUE_MAX];
1121025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
11340cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson#define CHECK_BTHF_CLIENT_INIT()                                        \
11440cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson  do {                                                                  \
11540cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson    if (bt_hf_client_callbacks == NULL) {                               \
11640cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson      BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __func__); \
11740cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson      return BT_STATUS_NOT_READY;                                       \
11840cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson    } else {                                                            \
11940cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson      BTIF_TRACE_EVENT("BTHF CLIENT: %s", __func__);                    \
12040cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson    }                                                                   \
12140cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson  } while (0)
12240cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson
1235eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal#define CHECK_BTHF_CLIENT_SLC_CONNECTED(cb)                                  \
12440cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson  do {                                                                       \
12540cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson    if (bt_hf_client_callbacks == NULL) {                                    \
12640cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson      BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __func__);      \
12740cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson      return BT_STATUS_NOT_READY;                                            \
1285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    } else if ((cb)->state != BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED) {  \
12940cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson      BTIF_TRACE_WARNING("BTHF CLIENT: %s: SLC connection not up. state=%s", \
1305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                         __func__, dump_hf_conn_state((cb)->state));         \
13140cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson      return BT_STATUS_NOT_READY;                                            \
13240cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson    } else {                                                                 \
13340cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson      BTIF_TRACE_EVENT("BTHF CLIENT: %s", __func__);                         \
13440cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson    }                                                                        \
13540cde56d28ab9751ba76bded0b7ac5974c750a97Myles Watson  } while (0)
1363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic btif_hf_client_cb_arr_t btif_hf_client_cb_arr;
1383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/*******************************************************************************
1406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *  Static functions
141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1423fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
1433fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
1446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
1456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function        btif_in_hf_client_generic_evt
1466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
1476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description     Processes generic events to be sent to JNI that are not
148f45481678af0694902b5200ba69ced4cb61d73f0Myles Watson *                 triggered from the BTA.
1496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *                 Always runs in BTIF context
1506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
1516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          void
1526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
1536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
1545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic void btif_in_hf_client_generic_evt(uint16_t event, char* p_param) {
1555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTIF_TRACE_DEBUG("%s", __func__);
1565eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  bt_bdaddr_t* bd_addr = (bt_bdaddr_t*)p_param;
1575eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
1585eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) {
1595eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTIF_TRACE_ERROR("%s: failed to find block for bda", __func__);
1605eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  }
1615eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
1626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BTIF_TRACE_EVENT("%s: event=%d", __func__, event);
1636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  switch (event) {
1646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTIF_HF_CLIENT_CB_AUDIO_CONNECTING: {
1655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, &cb->peer_bda,
166f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal                (bthf_client_audio_state_t)BTHF_AUDIO_STATE_CONNECTING);
1676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    } break;
1686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    default: {
169bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal      BTIF_TRACE_WARNING("%s: : Unknown event 0x%x", __func__, event);
1706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    } break;
1716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
1723fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/*******************************************************************************
1755eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *  Functions
176ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1775eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbool is_connected(const btif_hf_client_cb_t* cb) {
1785eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if ((cb->state == BTHF_CLIENT_CONNECTION_STATE_CONNECTED) ||
1795eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      (cb->state == BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED))
1805eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    return true;
1815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
1825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTIF_TRACE_ERROR("%s: not connected!", __func__);
1835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  return false;
1845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal}
1853fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
186ee96a3c60fca590d38025925c072d264e06493c4Myles Watson/*******************************************************************************
1875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
1885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Function        btif_hf_client_get_cb_by_handle
1895eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
1905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Description     Get control block by handle
1915eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
1925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Returns         btif_hf_client_cb_t pointer if available NULL otherwise
1935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/
1955eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_get_cb_by_handle(uint16_t handle) {
1965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTIF_TRACE_DEBUG("%s: cb by handle %d", __func__, handle);
1975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  for (int i = 0; i < HF_CLIENT_MAX_DEVICES; i++) {
1985eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    // Block is valid only if it is allocated i.e. state is not DISCONNECTED
1995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    if (btif_hf_client_cb_arr.cb[i].state !=
2005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal            BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED &&
2015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        btif_hf_client_cb_arr.cb[i].handle == handle) {
2025eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      return &btif_hf_client_cb_arr.cb[i];
2035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    }
2045eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  }
2055eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTIF_TRACE_ERROR("%s: could not find block for handle %d", __func__, handle);
2065eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  return NULL;
2075eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal}
2083fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2095eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/*******************************************************************************
2105eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
2115eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Function        btif_hf_client_get_cb_by_bda
2125eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
2135eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Description     Get control block by bda
2145eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
2155eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Returns         btif_hf_client_cb_t pointer if available NULL otherwise
2165eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
2175eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ******************************************************************************/
2185eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_get_cb_by_bda(const uint8_t* bd_addr) {
2196664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal  BTIF_TRACE_DEBUG("%s incoming addr %02x:%02x:%02x:%02x:%02x:%02x", __func__,
2206664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal                   bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4],
2216664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal                   bd_addr[5]);
2226664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal
2235eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  for (int i = 0; i < HF_CLIENT_MAX_DEVICES; i++) {
2245eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    // Block is valid only if it is allocated i.e. state is not DISCONNECTED
2255eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    if (btif_hf_client_cb_arr.cb[i].state !=
2265eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal            BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED &&
2275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        !bdcmp(btif_hf_client_cb_arr.cb[i].peer_bda.address, bd_addr)) {
2285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      return &btif_hf_client_cb_arr.cb[i];
2295eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    }
2305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  }
2315eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTIF_TRACE_ERROR("%s: could not find block for bdaddr", __func__);
2325eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  return NULL;
2333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
2343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2355eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal/*******************************************************************************
2365eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
2375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Function        btif_hf_client_allocate_cb
2385eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
2395eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Description     Get control block by bda
2405eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
2415eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal * Returns         btif_hf_client_cb_t pointer if available NULL otherwise
2425eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal *
2435eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal ******************************************************************************/
2445eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalbtif_hf_client_cb_t* btif_hf_client_allocate_cb() {
2455eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  for (int i = 0; i < HF_CLIENT_MAX_DEVICES; i++) {
2465eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    btif_hf_client_cb_t* cb = &btif_hf_client_cb_arr.cb[i];
2475eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    if (cb->state == BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED) {
2485eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      return cb;
2495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    }
2505eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  }
2515eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTIF_TRACE_ERROR("%s: unable to allocate control block", __func__);
2525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  return NULL;
2533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
2543fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2553fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*****************************************************************************
2576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *   btif hf api functions (no context switch)
2596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ****************************************************************************/
2613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
2636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         btif_hf_client_init
2656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description     initializes the hf interface
2676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns         bt_status_t
2696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
2716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bt_status_t init(bthf_client_callbacks_t* callbacks) {
2726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BTIF_TRACE_EVENT("%s", __func__);
2733fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  bt_hf_client_callbacks = callbacks;
2753fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  btif_enable_service(BTA_HFP_HS_SERVICE_ID);
2773fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2785eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  memset(&btif_hf_client_cb_arr, 0, sizeof(btif_hf_client_cb_arr_t));
2793fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
2813fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
2823fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
2833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
2846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         connect
2866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description     connect to audio gateway
2886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns         bt_status_t
2906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
2916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
2926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bt_status_t connect_int(bt_bdaddr_t* bd_addr, uint16_t uuid) {
2935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_allocate_cb();
2945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL) {
2955eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTIF_TRACE_ERROR("%s: could not allocate block!", __func__);
2965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    return BT_STATUS_BUSY;
2975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  }
2981025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
2999b2e40df051af05becf9672100e1004bb6f746aeliuchao  bdcpy(cb->peer_bda.address, bd_addr->address);
3005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (is_connected(cb)) return BT_STATUS_BUSY;
3015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
3025eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  cb->state = BTHF_CLIENT_CONNECTION_STATE_CONNECTING;
3035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  bdcpy(cb->peer_bda.address, bd_addr->address);
3043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
305bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  /* Open HF connection to remote device and get the relevant handle.
306bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal   * The handle is valid until we have called BTA_HfClientClose or the LL
307bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal   * has notified us of channel close due to remote closing, error etc.
308bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal   */
3095eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTA_HfClientOpen(cb->peer_bda.address, BTIF_HF_CLIENT_SECURITY, &cb->handle);
3101025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
3116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
3123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
3133fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic bt_status_t connect(bt_bdaddr_t* bd_addr) {
3156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BTIF_TRACE_EVENT("HFP Client version is  %s", btif_hf_client_version);
3166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  CHECK_BTHF_CLIENT_INIT();
3176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return btif_queue_connect(UUID_SERVCLASS_HF_HANDSFREE, bd_addr, connect_int);
3183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
3193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
3216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         disconnect
3236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      disconnect from audio gateway
3256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns         bt_status_t
3276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
329f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwalstatic bt_status_t disconnect(const bt_bdaddr_t* bd_addr) {
3306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  CHECK_BTHF_CLIENT_INIT();
3313fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3325eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
3335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb != NULL) {
3345eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientClose(cb->handle);
3356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return BT_STATUS_SUCCESS;
3365eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  } else {
3375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    return BT_STATUS_BUSY;
3386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
3393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
3403fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3413fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
3426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         connect_audio
3446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description     create an audio connection
3466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns         bt_status_t
3486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
350f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwalstatic bt_status_t connect_audio(const bt_bdaddr_t* bd_addr) {
3515eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
3525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
3533fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
3555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
3565eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if ((BTIF_HF_CLIENT_FEATURES & BTA_HF_CLIENT_FEAT_CODEC) &&
3575eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      (cb->peer_feat & BTA_HF_CLIENT_PEER_CODEC)) {
3585eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BCC, 0, 0, NULL);
3595eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  } else {
3605eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientAudioOpen(cb->handle);
3616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
3626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
3635eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  /* Inform the application that the audio connection has been initiated
3645eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal   * successfully */
3655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_transfer_context(btif_in_hf_client_generic_evt,
3665eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                        BTIF_HF_CLIENT_CB_AUDIO_CONNECTING, (char*)bd_addr,
3675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                        sizeof(bt_bdaddr_t), NULL);
3685eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  return BT_STATUS_SUCCESS;
3693fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
3703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3713fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
3726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         disconnect_audio
3746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      close the audio connection
3766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns         bt_status_t
3786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
380f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwalstatic bt_status_t disconnect_audio(const bt_bdaddr_t* bd_addr) {
3815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
3825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
3833fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
3856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
3865eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTA_HfClientAudioClose(cb->handle);
3875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  return BT_STATUS_SUCCESS;
3883fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
3893fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
3903fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
3916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         start_voice_recognition
3936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      start voice recognition
3956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
3976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
3986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
3995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t start_voice_recognition(const bt_bdaddr_t* bd_addr) {
4005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
4015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
4026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
4035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
4043fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4055eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb->peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC) {
4065eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BVRA, 1, 0, NULL);
4076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return BT_STATUS_SUCCESS;
4086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
4096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_UNSUPPORTED;
4103fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
4113fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4123fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
4136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         stop_voice_recognition
4156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      stop voice recognition
4176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
4196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
4215eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t stop_voice_recognition(const bt_bdaddr_t* bd_addr) {
4225eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
4235eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
4246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
4255eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
4263fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb->peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC) {
4285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BVRA, 0, 0, NULL);
4291025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    return BT_STATUS_SUCCESS;
4306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
4316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_UNSUPPORTED;
4323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
4333fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4343fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
4356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         volume_control
4376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      volume control
4396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
4416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
4435eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t volume_control(const bt_bdaddr_t* bd_addr,
444911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                  bthf_client_volume_type_t type, int volume) {
4455eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
4465eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
4475eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
4485eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
4496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
4506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  switch (type) {
4516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTHF_CLIENT_VOLUME_TYPE_SPK:
4525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_VGS, volume, 0, NULL);
4536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
4546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTHF_CLIENT_VOLUME_TYPE_MIC:
4555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_VGM, volume, 0, NULL);
4566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
4576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    default:
4586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_UNSUPPORTED;
4596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
4603fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
4623fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
4633fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4643fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
4656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         dial
4676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      place a call
4696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
4716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
473911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bt_status_t dial(UNUSED_ATTR const bt_bdaddr_t* bd_addr,
474911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                        const char* number) {
4755eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
4765eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
4775eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
4785eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
4796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
4806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (number) {
4815eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_ATD, 0, 0, number);
4826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  } else {
4835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BLDN, 0, 0, NULL);
4846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
4856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
4866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson}
4873fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
4886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson/*******************************************************************************
4896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         dial_memory
4916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      place a call with number specified by location (speed dial)
4936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
4956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
4966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
4975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t dial_memory(const bt_bdaddr_t* bd_addr, int location) {
4985eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
4995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
5006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
5015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
5026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
5035eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_ATD, location, 0, NULL);
5046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
5053fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
5063fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5073fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
5086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
5096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         handle_call_action
5106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
5116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      handle specified call related action
5126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
5136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
5146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
5156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
5165eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t handle_call_action(const bt_bdaddr_t* bd_addr,
517f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal                                      bthf_client_call_action_t action,
5186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                      int idx) {
5195eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
5205eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
5215eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
5225eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
5236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
5246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  switch (action) {
5251025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_CHLD_0:
5265eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->chld_feat & BTA_HF_CLIENT_CHLD_REL) {
5275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 0, 0, NULL);
5286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        break;
5296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
5306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_UNSUPPORTED;
5311025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_CHLD_1:
5326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      // CHLD 1 is mandatory for 3 way calling
5335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY) {
5345eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, 0, NULL);
5356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        break;
5366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
5376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_UNSUPPORTED;
5381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_CHLD_2:
5396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      // CHLD 2 is mandatory for 3 way calling
5405eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY) {
5415eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, 0, NULL);
5426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        break;
5436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
5446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_UNSUPPORTED;
5451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_CHLD_3:
5465eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->chld_feat & BTA_HF_CLIENT_CHLD_MERGE) {
5475eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 3, 0, NULL);
5486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        break;
5496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
5506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_UNSUPPORTED;
5511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_CHLD_4:
5525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->chld_feat & BTA_HF_CLIENT_CHLD_MERGE_DETACH) {
5535eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 4, 0, NULL);
5546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        break;
5556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
5566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_UNSUPPORTED;
5571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_CHLD_1x:
5585eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->peer_feat & BTA_HF_CLIENT_PEER_ECC) {
5596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        if (idx < 1) {
5606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson          return BT_STATUS_FAIL;
5611025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        }
5625eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, idx, NULL);
5636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        break;
5646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
5656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_UNSUPPORTED;
5661025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_CHLD_2x:
5675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->peer_feat & BTA_HF_CLIENT_PEER_ECC) {
5686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        if (idx < 1) {
5696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson          return BT_STATUS_FAIL;
5701025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        }
5715eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, idx, NULL);
5721025687c6679608fe9df918f37011414ffc72b62Hemant Gupta        break;
5736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
5746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_UNSUPPORTED;
5756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTHF_CLIENT_CALL_ACTION_ATA:
5765eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_ATA, 0, 0, NULL);
5776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
5781025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_CHUP:
5795eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CHUP, 0, 0, NULL);
5806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
5811025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_BTRH_0:
5825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BTRH, 0, 0, NULL);
5836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
5841025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_BTRH_1:
5855eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BTRH, 1, 0, NULL);
5866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
5871025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    case BTHF_CLIENT_CALL_ACTION_BTRH_2:
5885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BTRH, 2, 0, NULL);
5896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
5901025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    default:
5916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      return BT_STATUS_FAIL;
5926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
5933fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
5953fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
5963fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
5973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
5986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
5996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         query_current_calls
6006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      query list of current calls
6026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
6046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic bt_status_t query_current_calls(UNUSED_ATTR const bt_bdaddr_t* bd_addr) {
6075eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
6085eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
6096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
6105eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
6116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
6125eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb->peer_feat & BTA_HF_CLIENT_PEER_ECS) {
6135eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CLCC, 0, 0, NULL);
6146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return BT_STATUS_SUCCESS;
6156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
6163fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_UNSUPPORTED;
6183fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
6193fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6203fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
6216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         query_current_operator_name
6236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      query current selected operator name
6256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
6276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
6295eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t query_current_operator_name(const bt_bdaddr_t* bd_addr) {
6305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
6315eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
6323fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
6346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
6355eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_COPS, 0, 0, NULL);
6366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
6371025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}
6383fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6391025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/*******************************************************************************
6406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         retieve_subscriber_info
6426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      retrieve subscriber number information
6446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
6466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
6485eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t retrieve_subscriber_info(const bt_bdaddr_t* bd_addr) {
6495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
6505eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
6511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
6525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
6536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
6545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_CNUM, 0, 0, NULL);
6556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
6563fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
6573fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6583fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
6596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         send_dtmf
6616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      send dtmf
6636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
6656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
6675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t send_dtmf(const bt_bdaddr_t* bd_addr, char code) {
6685eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
6695eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
6703fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6715eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
6726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
6735eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_VTS, code, 0, NULL);
6746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
6751025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}
6763fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6771025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/*******************************************************************************
6786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         request_last_voice_tag_number
6806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      Request number from AG for VR purposes
6826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
6846bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
6856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
6865eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t request_last_voice_tag_number(const bt_bdaddr_t* bd_addr) {
6875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
6885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
6896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
6905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
6913fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb->peer_feat & BTA_HF_CLIENT_PEER_VTAG) {
6935eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTA_HfClientSendAT(cb->handle, BTA_HF_CLIENT_AT_CMD_BINP, 1, 0, NULL);
6946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    return BT_STATUS_SUCCESS;
6956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
6966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_UNSUPPORTED;
6973fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
6983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
6993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
7006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
7016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         cleanup
7026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
7036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      Closes the HF interface
7046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
7056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
7066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
7076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
7086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void cleanup(void) {
7096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BTIF_TRACE_EVENT("%s", __func__);
7106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
7116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (bt_hf_client_callbacks) {
7126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    btif_disable_service(BTA_HFP_HS_SERVICE_ID);
7136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    bt_hf_client_callbacks = NULL;
7146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
7151025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}
7161025687c6679608fe9df918f37011414ffc72b62Hemant Gupta
7171025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/*******************************************************************************
7186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
7196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         send_at_cmd
7206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
7216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      Send requested AT command to rempte device.
7226bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
7236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bt_status_t
7246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
7256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
7265eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwalstatic bt_status_t send_at_cmd(const bt_bdaddr_t* bd_addr, int cmd, int val1,
7275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                               int val2, const char* arg) {
7285eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(bd_addr->address);
7295eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return BT_STATUS_FAIL;
7305eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
7315eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  CHECK_BTHF_CLIENT_SLC_CONNECTED(cb);
7325eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
733bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal  BTIF_TRACE_EVENT("%s: Cmd %d val1 %d val2 %d arg %s", __func__, cmd, val1,
7346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                   val2, (arg != NULL) ? arg : "<null>");
7355eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTA_HfClientSendAT(cb->handle, cmd, val1, val2, arg);
7363fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
7376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
7381025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}
7393fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
7401025687c6679608fe9df918f37011414ffc72b62Hemant Guptastatic const bthf_client_interface_t bthfClientInterface = {
7411025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    sizeof(bthf_client_interface_t),
7421025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .init = init,
7431025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .connect = connect,
7441025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .disconnect = disconnect,
7451025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .connect_audio = connect_audio,
7461025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .disconnect_audio = disconnect_audio,
7471025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .start_voice_recognition = start_voice_recognition,
7481025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .stop_voice_recognition = stop_voice_recognition,
7491025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .volume_control = volume_control,
7501025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .dial = dial,
7511025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .dial_memory = dial_memory,
7521025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .handle_call_action = handle_call_action,
7531025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .query_current_calls = query_current_calls,
7541025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .query_current_operator_name = query_current_operator_name,
7551025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .retrieve_subscriber_info = retrieve_subscriber_info,
7561025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .send_dtmf = send_dtmf,
7571025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .request_last_voice_tag_number = request_last_voice_tag_number,
7581025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .cleanup = cleanup,
7591025687c6679608fe9df918f37011414ffc72b62Hemant Gupta    .send_at_cmd = send_at_cmd,
7601025687c6679608fe9df918f37011414ffc72b62Hemant Gupta};
7613fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
7626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void process_ind_evt(tBTA_HF_CLIENT_IND* ind) {
7635eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTIF_TRACE_DEBUG("%s", __func__);
7645eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
7655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(ind->bd_addr);
7665eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  if (cb == NULL || !is_connected(cb)) return;
7675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
7686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  switch (ind->type) {
7696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_IND_CALL:
7705eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, call_cb, &cb->peer_bda,
7716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                (bthf_client_call_t)ind->value);
7726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
7736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
7746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_IND_CALLSETUP:
7755eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, callsetup_cb, &cb->peer_bda,
7766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                (bthf_client_callsetup_t)ind->value);
7776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
7786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_IND_CALLHELD:
7795eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, callheld_cb, &cb->peer_bda,
7806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                (bthf_client_callheld_t)ind->value);
7816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
7826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
7836bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_IND_SERVICE:
7845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, network_state_cb, &cb->peer_bda,
7856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                (bthf_client_network_state_t)ind->value);
7866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
7876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
7886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_IND_SIGNAL:
7895eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, network_signal_cb, &cb->peer_bda,
7905eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                ind->value);
7916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
7926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
7936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_IND_ROAM:
7945eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, network_roaming_cb, &cb->peer_bda,
7956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                (bthf_client_service_type_t)ind->value);
7966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
7976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
7986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_IND_BATTCH:
7995eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, battery_level_cb, &cb->peer_bda,
8005eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                ind->value);
8016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
8026bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    default:
8046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
8056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
8061025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}
8073fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
8081025687c6679608fe9df918f37011414ffc72b62Hemant Gupta/*******************************************************************************
8096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
8106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         btif_hf_client_upstreams_evt
8116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
8126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      Executes HF CLIENT UPSTREAMS events in btif context
8136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
8146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          void
8156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
8166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
8176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic void btif_hf_client_upstreams_evt(uint16_t event, char* p_param) {
8186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  tBTA_HF_CLIENT* p_data = (tBTA_HF_CLIENT*)p_param;
8196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  bdstr_t bdstr;
8206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8215eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  btif_hf_client_cb_t* cb = btif_hf_client_get_cb_by_bda(p_data->bd_addr);
8226664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal  if (cb == NULL && event == BTA_HF_CLIENT_OPEN_EVT) {
8236664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal    BTIF_TRACE_DEBUG("%s: event BTA_HF_CLIENT_OPEN_EVT allocating block",
8246664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal                     __func__);
8256664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal    cb = btif_hf_client_allocate_cb();
8266664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal    cb->handle = p_data->open.handle;
8276664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal    bdcpy(cb->peer_bda.address, p_data->open.bd_addr);
8286664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal  } else if (cb == NULL) {
8296664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal    BTIF_TRACE_ERROR("%s: event %d but not allocating block: cb not found",
8306664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal                     __func__, event);
8316664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal    return;
8326664b2ccbbf0240524bc23c5dc81c690cf4daffaSanket Agarwal  }
8335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal
8346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BTIF_TRACE_DEBUG("%s: event=%s (%u)", __func__, dump_hf_client_event(event),
8356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                   event);
8366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8376bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  switch (event) {
8386bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_OPEN_EVT:
8396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (p_data->open.status == BTA_HF_CLIENT_SUCCESS) {
8405eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        cb->state = BTHF_CLIENT_CONNECTION_STATE_CONNECTED;
8415eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        cb->peer_feat = 0;
8425eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        cb->chld_feat = 0;
8435eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      } else if (cb->state == BTHF_CLIENT_CONNECTION_STATE_CONNECTING) {
8445eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        cb->state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED;
8456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      } else {
8466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        BTIF_TRACE_WARNING(
8476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            "%s: HF CLient open failed, but another device connected. "
8486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson            "status=%d state=%d connected device=%s",
8495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal            __func__, p_data->open.status, cb->state,
8505eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal            bdaddr_to_string(&cb->peer_bda, bdstr, sizeof(bdstr)));
8516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson        break;
8526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
8536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8545eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, &cb->peer_bda,
8555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                cb->state, 0, /* peer feat */
856911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                0 /* AT+CHLD feat */);
8576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8585eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->state == BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED)
8595eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        bdsetany(cb->peer_bda.address);
8606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (p_data->open.status != BTA_HF_CLIENT_SUCCESS) btif_queue_advance();
8626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
8636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_CONN_EVT:
8655eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      cb->peer_feat = p_data->conn.peer_feat;
8665eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      cb->chld_feat = p_data->conn.chld_feat;
8675eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      cb->state = BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED;
8686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8695eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, &cb->peer_bda,
8705eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                cb->state, cb->peer_feat, cb->chld_feat);
8716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      /* Inform the application about in-band ringtone */
8735eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      if (cb->peer_feat & BTA_HF_CLIENT_PEER_INBAND) {
8745eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, &cb->peer_bda,
8756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                  BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED);
8766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
8776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8786bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      btif_queue_advance();
8796bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
8806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_CLOSE_EVT:
8825eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      cb->state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED;
8835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, &cb->peer_bda,
8845eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                cb->state, 0, 0);
8855eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      bdsetany(cb->peer_bda.address);
8865eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      cb->peer_feat = 0;
8875eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      cb->chld_feat = 0;
8886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      btif_queue_advance();
8896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
8906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_IND_EVT:
8926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      process_ind_evt(&p_data->ind);
8936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
8946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
8956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_MIC_EVT:
8965eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, &cb->peer_bda,
8975eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                BTHF_CLIENT_VOLUME_TYPE_MIC, p_data->val.value);
8986bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
8996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_SPK_EVT:
9015eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, &cb->peer_bda,
9025eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                BTHF_CLIENT_VOLUME_TYPE_SPK, p_data->val.value);
9036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9046bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_VOICE_REC_EVT:
9065eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, vr_cmd_cb, &cb->peer_bda,
9076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                (bthf_client_vr_state_t)p_data->val.value);
9086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_OPERATOR_NAME_EVT:
9115eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, current_operator_cb, &cb->peer_bda,
9125eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                p_data->operator_name.name);
9136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_CLIP_EVT:
9165eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, clip_cb, &cb->peer_bda,
9175eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                p_data->number.number);
9186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_BINP_EVT:
9216bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      HAL_CBACK(bt_hf_client_callbacks, last_voice_tag_number_callback,
9225eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                &cb->peer_bda, p_data->number.number);
9236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_CCWA_EVT:
9265eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, call_waiting_cb, &cb->peer_bda,
9275eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                p_data->number.number);
9286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_AT_RESULT_EVT:
9315eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, cmd_complete_cb, &cb->peer_bda,
9326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                (bthf_client_cmd_complete_t)p_data->result.type,
9336bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->result.cme);
9346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_CLCC_EVT:
9375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, current_calls_cb, &cb->peer_bda,
9385eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                p_data->clcc.idx,
9396bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->clcc.inc ? BTHF_CLIENT_CALL_DIRECTION_INCOMING
9406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                 : BTHF_CLIENT_CALL_DIRECTION_OUTGOING,
9416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                (bthf_client_call_state_t)p_data->clcc.status,
9426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->clcc.mpty ? BTHF_CLIENT_CALL_MPTY_TYPE_MULTI
9436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                  : BTHF_CLIENT_CALL_MPTY_TYPE_SINGLE,
9446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                p_data->clcc.number_present ? p_data->clcc.number : NULL);
9456bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9466bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9476bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_CNUM_EVT:
9486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (p_data->cnum.service == 4) {
9495eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, &cb->peer_bda,
9505eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                  p_data->cnum.number, BTHF_CLIENT_SERVICE_VOICE);
9516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      } else if (p_data->cnum.service == 5) {
9525eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, &cb->peer_bda,
9535eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                  p_data->cnum.number, BTHF_CLIENT_SERVICE_FAX);
9546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      } else {
9555eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, &cb->peer_bda,
9565eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal                  p_data->cnum.number, BTHF_CLIENT_SERVICE_UNKNOWN);
9576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
9586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_BTRH_EVT:
9616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (p_data->val.value <= BTRH_CLIENT_RESP_AND_HOLD_REJECT) {
9625eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        HAL_CBACK(bt_hf_client_callbacks, resp_and_hold_cb, &cb->peer_bda,
9636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                  (bthf_client_resp_and_hold_t)p_data->val.value);
9646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
9656bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9666bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9676bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_BSIR_EVT:
9686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      if (p_data->val.value != 0) {
9695eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, &cb->peer_bda,
9706bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                  BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED);
9716bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      } else {
9725eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal        HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, &cb->peer_bda,
9736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                  BTHF_CLIENT_IN_BAND_RINGTONE_NOT_PROVIDED);
9746bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      }
9756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9766bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9776bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_AUDIO_OPEN_EVT:
9785eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, &cb->peer_bda,
979f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal                BTHF_CLIENT_AUDIO_STATE_CONNECTED);
9806bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9816bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9826bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT:
9835eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, &cb->peer_bda,
984f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal                BTHF_CLIENT_AUDIO_STATE_CONNECTED_MSBC);
9856bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9866bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
9876bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_AUDIO_CLOSE_EVT:
9885eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, &cb->peer_bda,
989f69036e5e66b0ce30dd31c0211253a2d91c8ef04Sanket Agarwal                BTHF_CLIENT_AUDIO_STATE_DISCONNECTED);
9906bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9916bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    case BTA_HF_CLIENT_RING_INDICATION:
9925eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal      HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb, &cb->peer_bda);
9936bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9946bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    default:
9956bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      BTIF_TRACE_WARNING("%s: Unhandled event: %d", __func__, event);
9966bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson      break;
9976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
9983fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
9993fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
10003fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
10016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
1002bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * Function         bta_hf_client_evt
10036bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
1004bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal * Description      Switches context from BTA to BTIF for all HF Client events
10056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10066bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          void
10076bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10086bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
10096bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
1010bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwalstatic void bta_hf_client_evt(tBTA_HF_CLIENT_EVT event,
10116bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                              tBTA_HF_CLIENT* p_data) {
10126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  bt_status_t status;
10136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
10146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  /* switch context to btif task context (copy full union size for convenience)
10156bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson   */
10166bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  status = btif_transfer_context(btif_hf_client_upstreams_evt, (uint16_t)event,
10176bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson                                 (char*)p_data, sizeof(*p_data), NULL);
10186bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
10196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  /* catch any failed context transfers */
10206bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
10211025687c6679608fe9df918f37011414ffc72b62Hemant Gupta}
10223fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
10233fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
10246bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10256bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         btif_hf_client_execute_service
10266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10276bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      Initializes/Shuts down the service
10286bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
10306bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10316bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
10326bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonbt_status_t btif_hf_client_execute_service(bool b_enable) {
10335eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal  BTIF_TRACE_EVENT("%s: enable: %d", __func__, b_enable);
10346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson
10356bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  if (b_enable) {
10366bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    /* Enable and register with BTA-HFClient */
10375eccd90936d606e0070872b247fd3462e9c9c19bSanket Agarwal    BTIF_TRACE_EVENT("%s: support codec negotiation %d ", __func__,
1038bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                     BTIF_HF_CLIENT_FEATURES);
1039bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal    BTA_HfClientEnable(bta_hf_client_evt, BTIF_HF_CLIENT_SECURITY,
1040bdcfc045f9d21afc1510cdad4fddd97a93c26477Sanket Agarwal                       BTIF_HF_CLIENT_FEATURES, BTIF_HF_CLIENT_SERVICE_NAME);
10416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  } else {
10426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson    BTA_HfClientDisable();
10436bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  }
10446bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return BT_STATUS_SUCCESS;
10453fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
10463fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta
10473fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta/*******************************************************************************
10486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Function         btif_hf_get_interface
10506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10516bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Description      Get the hf callback interface
10526bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10536bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson * Returns          bthf_interface_t
10546bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson *
10556bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson ******************************************************************************/
10566bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonconst bthf_client_interface_t* btif_hf_client_get_interface(void) {
10576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  BTIF_TRACE_EVENT("%s", __func__);
10586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson  return &bthfClientInterface;
10593fe1b49071420903cb8e3082ec04e76296352690Hemant Gupta}
1060