btif_hf.c revision cc35559160745c60b42ae182002a59337d844d09
13af1f3b9220733f5e3a76fe38fbc397974678234Brian/******************************************************************************
23af1f3b9220733f5e3a76fe38fbc397974678234Brian *
33af1f3b9220733f5e3a76fe38fbc397974678234Brian *  Copyright (C) 2009-2012 Broadcom Corporation
43af1f3b9220733f5e3a76fe38fbc397974678234Brian *
53af1f3b9220733f5e3a76fe38fbc397974678234Brian *  Licensed under the Apache License, Version 2.0 (the "License");
63af1f3b9220733f5e3a76fe38fbc397974678234Brian *  you may not use this file except in compliance with the License.
73af1f3b9220733f5e3a76fe38fbc397974678234Brian *  You may obtain a copy of the License at:
83af1f3b9220733f5e3a76fe38fbc397974678234Brian *
93af1f3b9220733f5e3a76fe38fbc397974678234Brian *  http://www.apache.org/licenses/LICENSE-2.0
103af1f3b9220733f5e3a76fe38fbc397974678234Brian *
113af1f3b9220733f5e3a76fe38fbc397974678234Brian *  Unless required by applicable law or agreed to in writing, software
123af1f3b9220733f5e3a76fe38fbc397974678234Brian *  distributed under the License is distributed on an "AS IS" BASIS,
133af1f3b9220733f5e3a76fe38fbc397974678234Brian *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143af1f3b9220733f5e3a76fe38fbc397974678234Brian *  See the License for the specific language governing permissions and
153af1f3b9220733f5e3a76fe38fbc397974678234Brian *  limitations under the License.
163af1f3b9220733f5e3a76fe38fbc397974678234Brian *
173af1f3b9220733f5e3a76fe38fbc397974678234Brian ******************************************************************************/
183af1f3b9220733f5e3a76fe38fbc397974678234Brian
193af1f3b9220733f5e3a76fe38fbc397974678234Brian/************************************************************************************
203af1f3b9220733f5e3a76fe38fbc397974678234Brian *
213af1f3b9220733f5e3a76fe38fbc397974678234Brian *  Filename:      btif_hf.c
223af1f3b9220733f5e3a76fe38fbc397974678234Brian *
233af1f3b9220733f5e3a76fe38fbc397974678234Brian *  Description:   Handsfree Profile Bluetooth Interface
243af1f3b9220733f5e3a76fe38fbc397974678234Brian *
253af1f3b9220733f5e3a76fe38fbc397974678234Brian *
263af1f3b9220733f5e3a76fe38fbc397974678234Brian ***********************************************************************************/
273af1f3b9220733f5e3a76fe38fbc397974678234Brian
28af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca#include <hardware/bluetooth.h>
29af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca#include <hardware/bt_hf.h>
30af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca#include <stdlib.h>
313af1f3b9220733f5e3a76fe38fbc397974678234Brian
323af1f3b9220733f5e3a76fe38fbc397974678234Brian#define LOG_TAG "BTIF_HF"
333af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "btif_common.h"
343af1f3b9220733f5e3a76fe38fbc397974678234Brian#include "btif_util.h"
35abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "btif_profile_queue.h"
364f25420bdd834e81a3e22733304efc5261c2998aBrian Paul
374f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "bd.h"
385b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca#include "bta_ag_api.h"
39c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca
40c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca/************************************************************************************
413af1f3b9220733f5e3a76fe38fbc397974678234Brian**  Constants & Macros
426acd63a4980951727939c0dd545a0324965b3834José Fonseca************************************************************************************/
43d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian#ifndef BTIF_HSAG_SERVICE_NAME
448f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY#define BTIF_HSAG_SERVICE_NAME ("Headset Gateway")
458f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY#endif
468f0a331040fc6fa700ab2c5f96061844a2289599Jon TURNEY
47d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian#ifndef BTIF_HFAG_SERVICE_NAME
480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define BTIF_HFAG_SERVICE_NAME ("Handsfree Gateway")
490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#endif
500d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#ifndef BTIF_HF_SERVICES
526512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin#define BTIF_HF_SERVICES    (BTA_HSP_SERVICE_MASK | BTA_HFP_SERVICE_MASK )
530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#endif
540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#ifndef BTIF_HF_SERVICE_NAMES
560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define BTIF_HF_SERVICE_NAMES {BTIF_HSAG_SERVICE_NAME , BTIF_HFAG_SERVICE_NAME}
570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#endif
5879a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin
5979a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin#ifndef BTIF_HF_SECURITY
6079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin#define BTIF_HF_SECURITY    (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)
610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#endif
620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#ifndef BTIF_HF_FEATURES
646512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin#define BTIF_HF_FEATURES   ( BTA_AG_FEAT_3WAY | \
650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                             BTA_AG_FEAT_ECNR   | \
666512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin                             BTA_AG_FEAT_REJECT | \
676512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin                             BTA_AG_FEAT_ECS    | \
680d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                             BTA_AG_FEAT_EXTERR | \
690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                             BTA_AG_FEAT_BTRH   | \
7079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin                             BTA_AG_FEAT_VREC   | \
7179a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin                             BTA_AG_FEAT_UNAT)
7279a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin#endif
730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define BTIF_HF_CALL_END_TIMEOUT       6
750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define BTIF_HF_INVALID_IDX       -1
770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/* Number of BTIF-HF control blocks */
793af1f3b9220733f5e3a76fe38fbc397974678234Brian#define BTIF_HF_NUM_CB       2
803af1f3b9220733f5e3a76fe38fbc397974678234Brian
81062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin/* Max HF clients supported from App */
825961732c1b59403b4e736fa354a64d4a0e5d8af2MichalUINT16 btif_max_hf_clients = -1;
835961732c1b59403b4e736fa354a64d4a0e5d8af2Michal
845961732c1b59403b4e736fa354a64d4a0e5d8af2Michal/* HF app ids for service registration */
853af1f3b9220733f5e3a76fe38fbc397974678234Briantypedef enum {
863af1f3b9220733f5e3a76fe38fbc397974678234Brian    BTIF_HF_ID_1 = 0,
873af1f3b9220733f5e3a76fe38fbc397974678234Brian    BTIF_HF_ID_2,
88062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin#if (BTIF_HF_NUM_CB == 3)
895961732c1b59403b4e736fa354a64d4a0e5d8af2Michal    BTIF_HF_ID_3
905961732c1b59403b4e736fa354a64d4a0e5d8af2Michal#endif
915961732c1b59403b4e736fa354a64d4a0e5d8af2Michal} bthf_hf_id_t;
923af1f3b9220733f5e3a76fe38fbc397974678234Brian
933af1f3b9220733f5e3a76fe38fbc397974678234BrianUINT16 bthf_hf_id[BTIF_HF_NUM_CB] = {BTIF_HF_ID_1, BTIF_HF_ID_2,
94fe36bc0c41ee7fd3aa7b364a8301d50613644f71Stéphane Marchesin                                    #if (BTIF_HF_NUM_CB == 3)
95062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin                                        BTIF_HF_ID_3
96062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin                                    #endif
97062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin                                    };
98062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin
99062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin/************************************************************************************
100062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin**  Local type definitions
101fe36bc0c41ee7fd3aa7b364a8301d50613644f71Stéphane Marchesin************************************************************************************/
102062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin
103062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin/************************************************************************************
104062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin**  Static variables
105062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin************************************************************************************/
106062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic bthf_callbacks_t *bt_hf_callbacks = NULL;
107062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesinstatic int hf_idx = BTIF_HF_INVALID_IDX;
1083af1f3b9220733f5e3a76fe38fbc397974678234Brian
1090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian#define CHECK_BTHF_INIT() if (bt_hf_callbacks == NULL)\
1105ac22877c98f4934cced4d42b9ec87245f266967Brian    {\
1115ac22877c98f4934cced4d42b9ec87245f266967Brian        BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);\
1125ac22877c98f4934cced4d42b9ec87245f266967Brian        return BT_STATUS_NOT_READY;\
1135ac22877c98f4934cced4d42b9ec87245f266967Brian    }\
1145ac22877c98f4934cced4d42b9ec87245f266967Brian    else\
1155ac22877c98f4934cced4d42b9ec87245f266967Brian    {\
1165ac22877c98f4934cced4d42b9ec87245f266967Brian        BTIF_TRACE_EVENT1("BTHF: %s", __FUNCTION__);\
1175ac22877c98f4934cced4d42b9ec87245f266967Brian    }
1185ac22877c98f4934cced4d42b9ec87245f266967Brian
1195ac22877c98f4934cced4d42b9ec87245f266967Brian#define CHECK_BTHF_SLC_CONNECTED() if (bt_hf_callbacks == NULL)\
1205ac22877c98f4934cced4d42b9ec87245f266967Brian    {\
1215ac22877c98f4934cced4d42b9ec87245f266967Brian        BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);\
1225ac22877c98f4934cced4d42b9ec87245f266967Brian        return BT_STATUS_NOT_READY;\
1235ac22877c98f4934cced4d42b9ec87245f266967Brian    }\
124c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    else if (btif_hf_cb.state != BTHF_CONNECTION_STATE_SLC_CONNECTED)\
125c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    {\
126c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian        BTIF_TRACE_WARNING2("BTHF: %s: SLC connection not up. state=%s", __FUNCTION__, dump_hf_conn_state(btif_hf_cb.state));\
127c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian        return BT_STATUS_NOT_READY;\
1280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    }\
129c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    else\
1300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    {\
1316512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin        BTIF_TRACE_EVENT1("BTHF: %s", __FUNCTION__);\
1326512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin    }
133c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian
1346512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin/* BTIF-HF control block to map bdaddr to BTA handle */
1356512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesintypedef struct _btif_hf_cb
1366512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin{
1376512bc4e67f0f2b53805d050e11f6a336b505f40Stéphane Marchesin    UINT16                  handle;
1385ac22877c98f4934cced4d42b9ec87245f266967Brian    bt_bdaddr_t             connected_bda;
139c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    bthf_connection_state_t state;
1400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    bthf_vr_state_t         vr_state;
1410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    tBTA_AG_PEER_FEAT       peer_feat;
1420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    int                     num_active;
1430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    int                     num_held;
144af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca    struct timespec         call_end_timestamp;
1450d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    struct timespec         connected_timestamp;
146af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca    bthf_call_state_t       call_setup_state;
1470e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal} btif_hf_cb_t;
148af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca
1499791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonsecastatic btif_hf_cb_t btif_hf_cb[BTIF_HF_NUM_CB];
150974c49ed176de55aadb335a2956ef5dfec774a23Stephane Marchesin
1515b8fa518476868530d748ce6d03674e9cca3d89fJosé Fonseca
152af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca/************************************************************************************
15396c9b39a6a9553573fcbdb5fd6db0e9d59768442Jakob Bornecrantz**  Static functions
1549791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca************************************************************************************/
155af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca
1560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/************************************************************************************
1570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian**  Externs
1580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian************************************************************************************/
159abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
160abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin/************************************************************************************
161abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**  Functions
162abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin************************************************************************************/
163abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
164abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin/*******************************************************************************
165abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
166abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Function         is_connected
167abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
168abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description      Internal function to check if HF is connected
169abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
170abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Returns          TRUE if connected
171abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
172abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin*******************************************************************************/
173abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic BOOLEAN is_connected(bt_bdaddr_t *bd_addr)
1740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian{
1753af1f3b9220733f5e3a76fe38fbc397974678234Brian        int i;
1763af1f3b9220733f5e3a76fe38fbc397974678234Brian        for (i = 0; i < btif_max_hf_clients; ++i)
1773af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
1783af1f3b9220733f5e3a76fe38fbc397974678234Brian            if (((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_CONNECTED) ||
1793af1f3b9220733f5e3a76fe38fbc397974678234Brian                 (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)) &&
1803af1f3b9220733f5e3a76fe38fbc397974678234Brian                 ((bd_addr == NULL) || (bdcmp(bd_addr->address,
1812bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                                     btif_hf_cb[i].connected_bda.address) == 0)))
182abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                return TRUE;
1833af1f3b9220733f5e3a76fe38fbc397974678234Brian        }
18491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell        return FALSE;
18596ad8a36003a21180ad6b61aa0b7d7c9452b3449Jakob Bornecrantz}
1863af1f3b9220733f5e3a76fe38fbc397974678234Brian
18791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell/*******************************************************************************
1883af1f3b9220733f5e3a76fe38fbc397974678234Brian**
18991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell** Function         btif_hf_idx_by_bdaddr
1903af1f3b9220733f5e3a76fe38fbc397974678234Brian**
1913af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      Internal function to get idx by bdaddr
1923af1f3b9220733f5e3a76fe38fbc397974678234Brian**
1933af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          idx
1943af1f3b9220733f5e3a76fe38fbc397974678234Brian**
1953af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
1963af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic int btif_hf_idx_by_bdaddr(bt_bdaddr_t *bd_addr)
1973af1f3b9220733f5e3a76fe38fbc397974678234Brian{
1983af1f3b9220733f5e3a76fe38fbc397974678234Brian        int i;
1993af1f3b9220733f5e3a76fe38fbc397974678234Brian        for (i = 0; i < btif_max_hf_clients; ++i)
2003af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
2013af1f3b9220733f5e3a76fe38fbc397974678234Brian            if ((bdcmp(bd_addr->address,
2023af1f3b9220733f5e3a76fe38fbc397974678234Brian                                  btif_hf_cb[i].connected_bda.address) == 0))
2033af1f3b9220733f5e3a76fe38fbc397974678234Brian                return i;
2043af1f3b9220733f5e3a76fe38fbc397974678234Brian        }
205d3eb25c575464bed7dbfc8be4717d85cb2928ec1Brian        return BTIF_HF_INVALID_IDX;
2064901410293b35ac6bb4759142b50fcc0be8a1b25Brian}
2074901410293b35ac6bb4759142b50fcc0be8a1b25Brian
20837cf13ed9a429c755f121daa1776b1b30a985ab3Brian/*******************************************************************************
209f69b5c56feb60791bad27d491ee9592238d4efb0Brian**
21037cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Function         callstate_to_callsetup
211d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin**
212d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin** Description      Converts HAL call state to BTA call setup indicator value
213d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin**
214d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin** Returns          BTA call indicator value
215d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin**
216d2f05283d2226f3285dccfc373ee9e314a8c95c8Stéphane Marchesin*******************************************************************************/
217f69b5c56feb60791bad27d491ee9592238d4efb0Brianstatic UINT8 callstate_to_callsetup(bthf_call_state_t call_state)
218f69b5c56feb60791bad27d491ee9592238d4efb0Brian{
219f69b5c56feb60791bad27d491ee9592238d4efb0Brian    UINT8 call_setup = 0;
220f69b5c56feb60791bad27d491ee9592238d4efb0Brian    if (call_state == BTHF_CALL_STATE_INCOMING)
221f69b5c56feb60791bad27d491ee9592238d4efb0Brian        call_setup = 1;
222f69b5c56feb60791bad27d491ee9592238d4efb0Brian    if (call_state == BTHF_CALL_STATE_DIALING)
223f69b5c56feb60791bad27d491ee9592238d4efb0Brian        call_setup = 2;
224f69b5c56feb60791bad27d491ee9592238d4efb0Brian    if (call_state == BTHF_CALL_STATE_ALERTING)
225f69b5c56feb60791bad27d491ee9592238d4efb0Brian        call_setup = 3;
226f69b5c56feb60791bad27d491ee9592238d4efb0Brian
22737cf13ed9a429c755f121daa1776b1b30a985ab3Brian    return call_setup;
22837cf13ed9a429c755f121daa1776b1b30a985ab3Brian}
22937cf13ed9a429c755f121daa1776b1b30a985ab3Brian
23037cf13ed9a429c755f121daa1776b1b30a985ab3Brian/*******************************************************************************
23137cf13ed9a429c755f121daa1776b1b30a985ab3Brian**
232e9259ad0d7f674a1f2f9156ba0baeedc0e7d0d54Brian** Function         send_at_result
233abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
234abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description      Send AT result code (OK/ERROR)
235abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
236abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Returns          void
237abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
238ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin*******************************************************************************/
239ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesinstatic void send_at_result(UINT8 ok_flag, UINT16 errcode, int idx)
240ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin{
241ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin    tBTA_AG_RES_DATA    ag_res;
242ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin    memset (&ag_res, 0, sizeof (ag_res));
243ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin
244ef3dac2aff5fda16d7b7662c2c8828f07c9842aeStéphane Marchesin    ag_res.ok_flag = ok_flag;
24537cf13ed9a429c755f121daa1776b1b30a985ab3Brian    if (ok_flag == BTA_AG_OK_ERROR)
24637cf13ed9a429c755f121daa1776b1b30a985ab3Brian    {
24737cf13ed9a429c755f121daa1776b1b30a985ab3Brian        ag_res.errcode = errcode;
24837cf13ed9a429c755f121daa1776b1b30a985ab3Brian    }
2493af1f3b9220733f5e3a76fe38fbc397974678234Brian
2503af1f3b9220733f5e3a76fe38fbc397974678234Brian    BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res);
2516c29be9f41470b22c87ef571e10b5a9824800608Brian}
252c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian
253c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian/*******************************************************************************
2546c29be9f41470b22c87ef571e10b5a9824800608Brian**
2553af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         send_indicator_update
2563af1f3b9220733f5e3a76fe38fbc397974678234Brian**
2573af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      Send indicator update (CIEV)
2583af1f3b9220733f5e3a76fe38fbc397974678234Brian**
2593af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          void
2603af1f3b9220733f5e3a76fe38fbc397974678234Brian**
2613af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
2623af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void send_indicator_update (UINT16 indicator, UINT16 value)
2633af1f3b9220733f5e3a76fe38fbc397974678234Brian{
264b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell    tBTA_AG_RES_DATA ag_res;
26591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell
26691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell    memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
26791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell    ag_res.ind.id = indicator;
26891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell    ag_res.ind.value = value;
26941b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian
2702154d1c5ac0bb37614ef00bed766e49635b519e8Brian    BTA_AgResult(BTA_AG_HANDLE_ALL, BTA_AG_IND_RES, &ag_res);
2712154d1c5ac0bb37614ef00bed766e49635b519e8Brian}
2722154d1c5ac0bb37614ef00bed766e49635b519e8Brian
2732154d1c5ac0bb37614ef00bed766e49635b519e8Brianvoid clear_phone_state_multihf(int idx)
27491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell{
275da253319f9e5d37d9c55b975ef9328545a3ac9b4Keith Whitwell    btif_hf_cb[idx].call_setup_state = BTHF_CALL_STATE_IDLE;
2762154d1c5ac0bb37614ef00bed766e49635b519e8Brian    btif_hf_cb[idx].num_active = btif_hf_cb[idx].num_held = 0;
2772154d1c5ac0bb37614ef00bed766e49635b519e8Brian}
27856ee132f9671f70ff2b3ee04659beac0dfc6126dKeith Whitwell
27937cf13ed9a429c755f121daa1776b1b30a985ab3Brian/*******************************************************************************
28037cf13ed9a429c755f121daa1776b1b30a985ab3Brian**
28137cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Function         btif_hf_latest_connected_idx
28291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell**
28337cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Description      Returns idx for latest connected HF
284de33b0dd231d646cbbc7ba6c25bf6dd04a96cd86Stéphane Marchesin**
2855d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin** Returns          int
286de33b0dd231d646cbbc7ba6c25bf6dd04a96cd86Stéphane Marchesin**
2873af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
2883af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic int btif_hf_latest_connected_idx()
2893af1f3b9220733f5e3a76fe38fbc397974678234Brian{
2903af1f3b9220733f5e3a76fe38fbc397974678234Brian      struct timespec         now, conn_time_delta;
2910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian      int latest_conn_idx = BTIF_HF_INVALID_IDX, i;
2920d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
2930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian      clock_gettime(CLOCK_MONOTONIC, &now);
2943af1f3b9220733f5e3a76fe38fbc397974678234Brian      conn_time_delta.tv_sec = now.tv_sec;
2953af1f3b9220733f5e3a76fe38fbc397974678234Brian
2962bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin      for (i = 0; i < btif_max_hf_clients; i++)
2973af1f3b9220733f5e3a76fe38fbc397974678234Brian      {
2985b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell          if (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)
2993af1f3b9220733f5e3a76fe38fbc397974678234Brian          {
300d0bca086ab6d032909e9a429720fea297c536f97Brian              if ((now.tv_sec - btif_hf_cb[i].connected_timestamp.tv_sec)
3015b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell                                            < conn_time_delta.tv_sec)
302d0bca086ab6d032909e9a429720fea297c536f97Brian              {
303d0bca086ab6d032909e9a429720fea297c536f97Brian                  conn_time_delta.tv_sec =
304d0bca086ab6d032909e9a429720fea297c536f97Brian                       now.tv_sec - btif_hf_cb[i].connected_timestamp.tv_sec;
305d0bca086ab6d032909e9a429720fea297c536f97Brian                  latest_conn_idx = i;
306d0bca086ab6d032909e9a429720fea297c536f97Brian              }
307d0bca086ab6d032909e9a429720fea297c536f97Brian          }
308d0bca086ab6d032909e9a429720fea297c536f97Brian      }
309d0bca086ab6d032909e9a429720fea297c536f97Brian      return latest_conn_idx;
310d0bca086ab6d032909e9a429720fea297c536f97Brian}
3113af1f3b9220733f5e3a76fe38fbc397974678234Brian
3123af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
3135b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell**
3143af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         btif_hf_check_if_slc_connected
3153af1f3b9220733f5e3a76fe38fbc397974678234Brian**
3163af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      Returns BT_STATUS_SUCCESS if SLC is up for any HF
3173af1f3b9220733f5e3a76fe38fbc397974678234Brian**
3183af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          bt_status_t
3193af1f3b9220733f5e3a76fe38fbc397974678234Brian**
3203af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
3213af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t btif_hf_check_if_slc_connected()
3223af1f3b9220733f5e3a76fe38fbc397974678234Brian{
3233af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (bt_hf_callbacks == NULL)
3243af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
3252bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        BTIF_TRACE_WARNING1("BTHF: %s: BTHF not initialized", __FUNCTION__);
3263af1f3b9220733f5e3a76fe38fbc397974678234Brian        return BT_STATUS_NOT_READY;
3273af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
3285b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell    else
3293af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
3303af1f3b9220733f5e3a76fe38fbc397974678234Brian        int i;
3313af1f3b9220733f5e3a76fe38fbc397974678234Brian        for (i = 0; i < btif_max_hf_clients; i++)
3323af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
3333af1f3b9220733f5e3a76fe38fbc397974678234Brian            if ((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED))
3343af1f3b9220733f5e3a76fe38fbc397974678234Brian            {
3353af1f3b9220733f5e3a76fe38fbc397974678234Brian                BTIF_TRACE_EVENT2("BTHF: %s: slc connected for idx = %d",
3363af1f3b9220733f5e3a76fe38fbc397974678234Brian                                         __FUNCTION__, i);
3373af1f3b9220733f5e3a76fe38fbc397974678234Brian                return BT_STATUS_SUCCESS;
3383af1f3b9220733f5e3a76fe38fbc397974678234Brian            }
3393af1f3b9220733f5e3a76fe38fbc397974678234Brian        }
3403af1f3b9220733f5e3a76fe38fbc397974678234Brian        BTIF_TRACE_WARNING1("BTHF: %s: No SLC connection up", __FUNCTION__);
3413af1f3b9220733f5e3a76fe38fbc397974678234Brian        return BT_STATUS_NOT_READY;
3423af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
3433af1f3b9220733f5e3a76fe38fbc397974678234Brian}
3443af1f3b9220733f5e3a76fe38fbc397974678234Brian
3453af1f3b9220733f5e3a76fe38fbc397974678234Brian/*****************************************************************************
3463af1f3b9220733f5e3a76fe38fbc397974678234Brian**   Section name (Group of functions)
3473af1f3b9220733f5e3a76fe38fbc397974678234Brian*****************************************************************************/
3483af1f3b9220733f5e3a76fe38fbc397974678234Brian
3493af1f3b9220733f5e3a76fe38fbc397974678234Brian/*****************************************************************************
3503af1f3b9220733f5e3a76fe38fbc397974678234Brian**
3513af1f3b9220733f5e3a76fe38fbc397974678234Brian**   btif hf api functions (no context switch)
3523af1f3b9220733f5e3a76fe38fbc397974678234Brian**
3533af1f3b9220733f5e3a76fe38fbc397974678234Brian*****************************************************************************/
354776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul
355776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul
3563af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
3573af1f3b9220733f5e3a76fe38fbc397974678234Brian**
358776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul** Function         btif_hf_upstreams_evt
359776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul**
360776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul** Description      Executes HF UPSTREAMS events in btif context
3613af1f3b9220733f5e3a76fe38fbc397974678234Brian**
3623af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          void
363776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul**
364776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul*******************************************************************************/
365776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paulstatic void btif_hf_upstreams_evt(UINT16 event, char* p_param)
3663af1f3b9220733f5e3a76fe38fbc397974678234Brian{
3673af1f3b9220733f5e3a76fe38fbc397974678234Brian    tBTA_AG *p_data = (tBTA_AG *)p_param;
368776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul    bdstr_t bdstr;
3693af1f3b9220733f5e3a76fe38fbc397974678234Brian    bt_bdaddr_t addr;
3703af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = p_data->hdr.handle - 1;
371776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul
3723af1f3b9220733f5e3a76fe38fbc397974678234Brian    BTIF_TRACE_DEBUG2("%s: event=%s", __FUNCTION__, dump_hf_event(event));
3733af1f3b9220733f5e3a76fe38fbc397974678234Brian
374776971218ef6c6749fcb882a95ae5fc3a1ff5059Brian Paul    switch (event)
3753af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
3763af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_ENABLE_EVT:
3773af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_DISABLE_EVT:
3783af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
3793af1f3b9220733f5e3a76fe38fbc397974678234Brian
3803af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_REGISTER_EVT:
381e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            btif_hf_cb[idx].handle = p_data->reg.hdr.handle;
382527235223abd8b64908b0c21311567e6c7d9920dStéphane Marchesin            BTIF_TRACE_DEBUG2("%s: BTA_AG_REGISTER_EVT,"
383e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin              "btif_hf_cb.handle = %d", __FUNCTION__, btif_hf_cb[idx].handle);
384e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            break;
385e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin
386e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin        case BTA_AG_OPEN_EVT:
387e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            if (p_data->open.status == BTA_AG_SUCCESS)
388e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            {
389e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                bdcpy(btif_hf_cb[idx].connected_bda.address,
390e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                                  p_data->open.bd_addr);
391e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_CONNECTED;
392e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                btif_hf_cb[idx].peer_feat = 0;
393e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                clear_phone_state_multihf(idx);
394e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            }
395e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            else if (btif_hf_cb[idx].state == BTHF_CONNECTION_STATE_CONNECTING)
396e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            {
397e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_DISCONNECTED;
398e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            }
399e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            else
400e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            {
401e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                BTIF_TRACE_WARNING4("%s: AG open failed, but another device connected. status=%d state=%d connected device=%s",
402e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                        __FUNCTION__, p_data->open.status, btif_hf_cb[idx].state,
403e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                                 bd2str(&btif_hf_cb[idx].connected_bda, &bdstr));
404e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin                break;
405e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            }
406e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin
407e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
4083af1f3b9220733f5e3a76fe38fbc397974678234Brian                                                        &btif_hf_cb[idx].connected_bda);
4093af1f3b9220733f5e3a76fe38fbc397974678234Brian
4103af1f3b9220733f5e3a76fe38fbc397974678234Brian            if (btif_hf_cb[idx].state == BTHF_CONNECTION_STATE_DISCONNECTED)
4113af1f3b9220733f5e3a76fe38fbc397974678234Brian                bdsetany(btif_hf_cb[idx].connected_bda.address);
4123af1f3b9220733f5e3a76fe38fbc397974678234Brian
4133af1f3b9220733f5e3a76fe38fbc397974678234Brian            if (p_data->open.status != BTA_AG_SUCCESS)
4142bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                btif_queue_advance();
415abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            break;
416abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
4173af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_CLOSE_EVT:
4187d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell            btif_hf_cb[idx].connected_timestamp.tv_sec = 0;
41991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell            btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_DISCONNECTED;
4203af1f3b9220733f5e3a76fe38fbc397974678234Brian            BTIF_TRACE_DEBUG3("%s: BTA_AG_CLOSE_EVT,"
4213af1f3b9220733f5e3a76fe38fbc397974678234Brian                 "idx = %d, btif_hf_cb.handle = %d", __FUNCTION__, idx,
422abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                          btif_hf_cb[idx].handle);
4233af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
4243af1f3b9220733f5e3a76fe38fbc397974678234Brian                                                        &btif_hf_cb[idx].connected_bda);
4257d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell            bdsetany(btif_hf_cb[idx].connected_bda.address);
4263af1f3b9220733f5e3a76fe38fbc397974678234Brian            btif_hf_cb[idx].peer_feat = 0;
4273af1f3b9220733f5e3a76fe38fbc397974678234Brian            clear_phone_state_multihf(idx);
4283af1f3b9220733f5e3a76fe38fbc397974678234Brian            hf_idx = btif_hf_latest_connected_idx();
429e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            /* If AG_OPEN was received but SLC was not setup in a specified time (10 seconds),
430e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin            ** then AG_CLOSE may be received. We need to advance the queue here
4313af1f3b9220733f5e3a76fe38fbc397974678234Brian            */
4323af1f3b9220733f5e3a76fe38fbc397974678234Brian            btif_queue_advance();
4333af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
4343af1f3b9220733f5e3a76fe38fbc397974678234Brian
4353af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_CONN_EVT:
4363af1f3b9220733f5e3a76fe38fbc397974678234Brian            clock_gettime(CLOCK_MONOTONIC,
4373af1f3b9220733f5e3a76fe38fbc397974678234Brian                            &btif_hf_cb[idx].connected_timestamp);
4383af1f3b9220733f5e3a76fe38fbc397974678234Brian            BTIF_TRACE_DEBUG2("%s: BTA_AG_CONN_EVT, idx = %d ",
4393af1f3b9220733f5e3a76fe38fbc397974678234Brian                                                __FUNCTION__, idx);
4403af1f3b9220733f5e3a76fe38fbc397974678234Brian            btif_hf_cb[idx].peer_feat = p_data->conn.peer_feat;
4412bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            btif_hf_cb[idx].state = BTHF_CONNECTION_STATE_SLC_CONNECTED;
442abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            hf_idx = btif_hf_latest_connected_idx();
443abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
4443af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, connection_state_cb, btif_hf_cb[idx].state,
4453af1f3b9220733f5e3a76fe38fbc397974678234Brian                             &btif_hf_cb[idx].connected_bda);
4463af1f3b9220733f5e3a76fe38fbc397974678234Brian            btif_queue_advance();
4473af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
4483af1f3b9220733f5e3a76fe38fbc397974678234Brian
449abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        case BTA_AG_AUDIO_OPEN_EVT:
450abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            hf_idx = idx;
451abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTED,
4523af1f3b9220733f5e3a76fe38fbc397974678234Brian                                                        &btif_hf_cb[idx].connected_bda);
4533af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
4543af1f3b9220733f5e3a76fe38fbc397974678234Brian
4557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell        case BTA_AG_AUDIO_CLOSE_EVT:
4563af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_DISCONNECTED,
4573af1f3b9220733f5e3a76fe38fbc397974678234Brian                                                           &btif_hf_cb[idx].connected_bda);
4583af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
4593af1f3b9220733f5e3a76fe38fbc397974678234Brian
4603af1f3b9220733f5e3a76fe38fbc397974678234Brian        /* BTA auto-responds, silently discard */
4613af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_SPK_EVT:
46220839b37ed61b044d6224c0e373ce10d74be4f3dBrian        case BTA_AG_MIC_EVT:
46320839b37ed61b044d6224c0e373ce10d74be4f3dBrian            HAL_CBACK(bt_hf_callbacks, volume_cmd_cb,
46420839b37ed61b044d6224c0e373ce10d74be4f3dBrian                (event == BTA_AG_SPK_EVT) ? BTHF_VOLUME_TYPE_SPK :
46520839b37ed61b044d6224c0e373ce10d74be4f3dBrian                      BTHF_VOLUME_TYPE_MIC, p_data->val.num,
4662bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                              &btif_hf_cb[idx].connected_bda);
467abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            break;
468abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
46920839b37ed61b044d6224c0e373ce10d74be4f3dBrian        case BTA_AG_AT_A_EVT:
4702bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            if ((btif_hf_cb[0].num_held + btif_hf_cb[0].num_active) == 0)
47120839b37ed61b044d6224c0e373ce10d74be4f3dBrian                hf_idx = idx;
47220839b37ed61b044d6224c0e373ce10d74be4f3dBrian            else
47320839b37ed61b044d6224c0e373ce10d74be4f3dBrian                BTIF_TRACE_DEBUG0("Donot set hf_idx for ATA since already in a call");
47420839b37ed61b044d6224c0e373ce10d74be4f3dBrian
47520839b37ed61b044d6224c0e373ce10d74be4f3dBrian            HAL_CBACK(bt_hf_callbacks, answer_call_cmd_cb,
4767d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                              &btif_hf_cb[idx].connected_bda);
4777d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell            break;
47820839b37ed61b044d6224c0e373ce10d74be4f3dBrian
479abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        /* Java needs to send OK/ERROR for these commands */
48020839b37ed61b044d6224c0e373ce10d74be4f3dBrian        case BTA_AG_AT_BLDN_EVT:
48120839b37ed61b044d6224c0e373ce10d74be4f3dBrian        case BTA_AG_AT_D_EVT:
4820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            if ((btif_hf_cb[0].num_held + btif_hf_cb[0].num_active) == 0)
4830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                hf_idx = idx;
4840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            else
4850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                BTIF_TRACE_DEBUG0("Donot set hf_idx for BLDN/D since already in a call");
4860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
487cc78eb63cdc0022684ca6816f258ea4492431916Stéphane Marchesin            HAL_CBACK(bt_hf_callbacks, dial_call_cmd_cb,
4880d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                (event == BTA_AG_AT_D_EVT) ? p_data->val.str : NULL,
4890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                              &btif_hf_cb[idx].connected_bda);
4900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            break;
49179a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin
4923af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_CHUP_EVT:
4933af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, hangup_call_cmd_cb,
4942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                              &btif_hf_cb[idx].connected_bda);
495abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            break;
4963af1f3b9220733f5e3a76fe38fbc397974678234Brian
4973af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_CIND_EVT:
4983af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, cind_cmd_cb,
4993af1f3b9220733f5e3a76fe38fbc397974678234Brian                              &btif_hf_cb[idx].connected_bda);
5003af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
5013af1f3b9220733f5e3a76fe38fbc397974678234Brian
5023af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_VTS_EVT:
503abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            HAL_CBACK(bt_hf_callbacks, dtmf_cmd_cb, p_data->val.str[0],
5043af1f3b9220733f5e3a76fe38fbc397974678234Brian                              &btif_hf_cb[idx].connected_bda);
5053af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
5067d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell
5073af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_BVRA_EVT:
5083af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, vr_cmd_cb,
5093af1f3b9220733f5e3a76fe38fbc397974678234Brian                (p_data->val.num == 1) ? BTHF_VR_STATE_STARTED :
5103af1f3b9220733f5e3a76fe38fbc397974678234Brian                      BTHF_VR_STATE_STOPPED, &btif_hf_cb[idx].connected_bda);
5113af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
512abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
5133af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_NREC_EVT:
5143af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, nrec_cmd_cb,
5156ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller                (p_data->val.num == 1) ? BTHF_NREC_START : BTHF_NREC_STOP,
5166ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller                                             &btif_hf_cb[idx].connected_bda);
5176ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller            break;
5186ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller
5196ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller        /* TODO: Add a callback for CBC */
5206ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller        case BTA_AG_AT_CBC_EVT:
5216ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller            break;
5226ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller
5236ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller        case BTA_AG_AT_CKPD_EVT:
5246ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller            HAL_CBACK(bt_hf_callbacks, key_pressed_cmd_cb,
5256ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller                              &btif_hf_cb[idx].connected_bda);
5266ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller            break;
5276ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller
5286ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller        /* Java needs to send OK/ERROR for these commands */
5296ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller        case BTA_AG_AT_CHLD_EVT:
5306ae12bac596ce3a6aa8e09f638ad2cb4a7c18e5cChristoph Bumiller            HAL_CBACK(bt_hf_callbacks, chld_cmd_cb, atoi(p_data->val.str),
5313af1f3b9220733f5e3a76fe38fbc397974678234Brian                              &btif_hf_cb[idx].connected_bda);
532abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            break;
533abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
534abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        case BTA_AG_AT_CLCC_EVT:
535c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin            HAL_CBACK(bt_hf_callbacks, clcc_cmd_cb,
5367d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                              &btif_hf_cb[idx].connected_bda);
537c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin            break;
5383af1f3b9220733f5e3a76fe38fbc397974678234Brian
5393af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_COPS_EVT:
5403af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, cops_cmd_cb,
5413af1f3b9220733f5e3a76fe38fbc397974678234Brian                              &btif_hf_cb[idx].connected_bda);
542abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            break;
5433af1f3b9220733f5e3a76fe38fbc397974678234Brian
5443af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_UNAT_EVT:
5453af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, unknown_at_cmd_cb, p_data->val.str,
5463af1f3b9220733f5e3a76fe38fbc397974678234Brian                              &btif_hf_cb[idx].connected_bda);
5473af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
5480e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal
5493af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_CNUM_EVT:
5503af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, cnum_cmd_cb,
5513af1f3b9220733f5e3a76fe38fbc397974678234Brian                              &btif_hf_cb[idx].connected_bda);
5523af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
553175adf0776d8df066a908b06055f243bd1325a34Stéphane Marchesin
5543af1f3b9220733f5e3a76fe38fbc397974678234Brian        /* TODO: Some of these commands may need to be sent to app. For now respond with error */
5553af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_BINP_EVT:
5563af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTA_AG_AT_BTRH_EVT:
5573af1f3b9220733f5e3a76fe38fbc397974678234Brian            send_at_result(BTA_AG_OK_ERROR, BTA_AG_ERR_OP_NOT_SUPPORTED, idx);
5583af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
5593af1f3b9220733f5e3a76fe38fbc397974678234Brian
5603af1f3b9220733f5e3a76fe38fbc397974678234Brian
5613af1f3b9220733f5e3a76fe38fbc397974678234Brian        default:
5623af1f3b9220733f5e3a76fe38fbc397974678234Brian            BTIF_TRACE_WARNING2("%s: Unhandled event: %d", __FUNCTION__, event);
5633af1f3b9220733f5e3a76fe38fbc397974678234Brian            break;
5643af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
5653af1f3b9220733f5e3a76fe38fbc397974678234Brian}
5663af1f3b9220733f5e3a76fe38fbc397974678234Brian
5673af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
5683af1f3b9220733f5e3a76fe38fbc397974678234Brian**
5693af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         bte_hf_evt
5703af1f3b9220733f5e3a76fe38fbc397974678234Brian**
5713af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      Switches context from BTE to BTIF for all HF events
5723af1f3b9220733f5e3a76fe38fbc397974678234Brian**
5733af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          void
5743af1f3b9220733f5e3a76fe38fbc397974678234Brian**
5753af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
5763af1f3b9220733f5e3a76fe38fbc397974678234Brian
5773af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic void bte_hf_evt(tBTA_AG_EVT event, tBTA_AG *p_data)
5787d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell{
5793af1f3b9220733f5e3a76fe38fbc397974678234Brian    bt_status_t status;
5803af1f3b9220733f5e3a76fe38fbc397974678234Brian    int param_len = 0;
5813af1f3b9220733f5e3a76fe38fbc397974678234Brian
5823af1f3b9220733f5e3a76fe38fbc397974678234Brian    /* TODO: BTA sends the union members and not tBTA_AG. If using param_len=sizeof(tBTA_AG), we get a crash on memcpy */
5833af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (BTA_AG_REGISTER_EVT == event)
584811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin        param_len = sizeof(tBTA_AG_REGISTER);
585811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin    else if (BTA_AG_OPEN_EVT == event)
586811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin        param_len = sizeof(tBTA_AG_OPEN);
587811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin    else if (BTA_AG_CONN_EVT == event)
588811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin        param_len = sizeof(tBTA_AG_CONN);
589811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin    else if ( (BTA_AG_CLOSE_EVT == event) || (BTA_AG_AUDIO_OPEN_EVT == event) || (BTA_AG_AUDIO_CLOSE_EVT == event))
590811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin        param_len = sizeof(tBTA_AG_HDR);
591811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin    else if (p_data)
592811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin        param_len = sizeof(tBTA_AG_VAL);
593811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin
594811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin    /* switch context to btif task context (copy full union size for convenience) */
595811963a7aed4d4ea9a3b2c8ad4db6a5c3f118956Stéphane Marchesin    status = btif_transfer_context(btif_hf_upstreams_evt, (uint16_t)event, (void*)p_data, param_len, NULL);
5962292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
597abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    /* catch any failed context transfers */
598abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
5992292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin}
6002292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
6012292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
6022292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin/*******************************************************************************
6032292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
6042292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Function         btif_in_hf_generic_evt
6052292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
6062292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Description     Processes generic events to be sent to JNI that are not triggered from the BTA.
6073af1f3b9220733f5e3a76fe38fbc397974678234Brian**                      Always runs in BTIF context
608abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
6093af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          void
6103af1f3b9220733f5e3a76fe38fbc397974678234Brian**
6113af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
612abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic void btif_in_hf_generic_evt(UINT16 event, char *p_param)
6133af1f3b9220733f5e3a76fe38fbc397974678234Brian{
6143af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = btif_hf_idx_by_bdaddr((bt_bdaddr_t *)p_param);
6153af1f3b9220733f5e3a76fe38fbc397974678234Brian
616abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    BTIF_TRACE_EVENT2("%s: event=%d", __FUNCTION__, event);
617abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    switch (event) {
6183af1f3b9220733f5e3a76fe38fbc397974678234Brian        case BTIF_HFP_CB_AUDIO_CONNECTING:
6193af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
6203af1f3b9220733f5e3a76fe38fbc397974678234Brian            HAL_CBACK(bt_hf_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTING,
6217d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell                      &btif_hf_cb[idx].connected_bda);
6223af1f3b9220733f5e3a76fe38fbc397974678234Brian        } break;
6233af1f3b9220733f5e3a76fe38fbc397974678234Brian        default:
6243af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
6253af1f3b9220733f5e3a76fe38fbc397974678234Brian            BTIF_TRACE_WARNING2("%s : Unknown event 0x%x", __FUNCTION__, event);
6263af1f3b9220733f5e3a76fe38fbc397974678234Brian        }
627abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        break;
628abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    }
6293af1f3b9220733f5e3a76fe38fbc397974678234Brian}
6303af1f3b9220733f5e3a76fe38fbc397974678234Brian
6313af1f3b9220733f5e3a76fe38fbc397974678234Brian
6323af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
6333af1f3b9220733f5e3a76fe38fbc397974678234Brian**
6343af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         btif_hf_init
6353af1f3b9220733f5e3a76fe38fbc397974678234Brian**
6363af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description     initializes the hf interface
6377d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell**
6383af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns         bt_status_t
6393af1f3b9220733f5e3a76fe38fbc397974678234Brian**
6403af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
6413af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t init( bthf_callbacks_t* callbacks, int max_hf_clients)
6423af1f3b9220733f5e3a76fe38fbc397974678234Brian{
6435e49ec339df1d23b1f1790c49c9f102098f42c0dBrian    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
6445e49ec339df1d23b1f1790c49c9f102098f42c0dBrian    int i;
6455e49ec339df1d23b1f1790c49c9f102098f42c0dBrian
6465e49ec339df1d23b1f1790c49c9f102098f42c0dBrian    bt_hf_callbacks = callbacks;
6473af1f3b9220733f5e3a76fe38fbc397974678234Brian
648abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    /* Invoke the enable service API to the core to set the appropriate service_id
6493af1f3b9220733f5e3a76fe38fbc397974678234Brian     * Internally, the HSP_SERVICE_ID shall also be enabled if HFP is enabled (phone)
6503af1f3b9220733f5e3a76fe38fbc397974678234Brian     * othwerwise only HSP is enabled (tablet)
6513af1f3b9220733f5e3a76fe38fbc397974678234Brian    */
6527d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell#if (defined(BTIF_HF_SERVICES) && (BTIF_HF_SERVICES & BTA_HFP_SERVICE_MASK))
6533af1f3b9220733f5e3a76fe38fbc397974678234Brian    btif_enable_service(BTA_HFP_SERVICE_ID);
6543af1f3b9220733f5e3a76fe38fbc397974678234Brian#else
6553af1f3b9220733f5e3a76fe38fbc397974678234Brian    btif_enable_service(BTA_HSP_SERVICE_ID);
6563af1f3b9220733f5e3a76fe38fbc397974678234Brian#endif
6573af1f3b9220733f5e3a76fe38fbc397974678234Brian
658abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    memset(&btif_hf_cb, 0, sizeof(btif_hf_cb));
6593af1f3b9220733f5e3a76fe38fbc397974678234Brian    btif_max_hf_clients = max_hf_clients;
6603af1f3b9220733f5e3a76fe38fbc397974678234Brian    BTIF_TRACE_DEBUG1("btif_max_hf_clients = %d", btif_max_hf_clients);
6613af1f3b9220733f5e3a76fe38fbc397974678234Brian    for (i = 0; i < btif_max_hf_clients; i++)
662abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    {
6633af1f3b9220733f5e3a76fe38fbc397974678234Brian        clear_phone_state_multihf(i);
6643af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
6653af1f3b9220733f5e3a76fe38fbc397974678234Brian
66641b3fcbf0404bc4a4f6588c0feef553bb65d4440Brian    return BT_STATUS_SUCCESS;
667abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin}
6683af1f3b9220733f5e3a76fe38fbc397974678234Brian
6693af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
6700235b3252100eda553babea42c014445358a2985Brian**
6710235b3252100eda553babea42c014445358a2985Brian** Function         connect
6720235b3252100eda553babea42c014445358a2985Brian**
6730235b3252100eda553babea42c014445358a2985Brian** Description     connect to headset
6740235b3252100eda553babea42c014445358a2985Brian**
675e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin** Returns         bt_status_t
676e3c94fac4eb159f8c35798d1ad7515a40f5a2ecaStéphane Marchesin**
6773af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
6783af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
679db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol{
680c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin    CHECK_BTHF_INIT();
681c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin    int i;
682c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin    for (i = 0; i < btif_max_hf_clients;)
6830e57b66fa1d7f4317f20571f19fd2ceb3593f04fStéphane Marchesin    {
6840e57b66fa1d7f4317f20571f19fd2ceb3593f04fStéphane Marchesin       if (((btif_hf_cb[i].state == BTHF_CONNECTION_STATE_CONNECTED) ||
685c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin              (btif_hf_cb[i].state == BTHF_CONNECTION_STATE_SLC_CONNECTED)))
686c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin           i++;
687c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin       else
688c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin           break;
689c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin    }
690c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin
691c661843ab6adc97b54debaccfb29b897b12ab76dStéphane Marchesin    if (i == btif_max_hf_clients)
692db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol        return BT_STATUS_BUSY;
693db38708c43d7e9bbc744893ad2e9c2a77e9ec15cMichal Krol
6943af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (!is_connected(bd_addr))
695abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    {
6963af1f3b9220733f5e3a76fe38fbc397974678234Brian        btif_hf_cb[i].state = BTHF_CONNECTION_STATE_CONNECTING;
6973af1f3b9220733f5e3a76fe38fbc397974678234Brian        bdcpy(btif_hf_cb[i].connected_bda.address, bd_addr->address);
6983af1f3b9220733f5e3a76fe38fbc397974678234Brian
6997d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell        BTA_AgOpen(btif_hf_cb[i].handle, btif_hf_cb[i].connected_bda.address,
7003af1f3b9220733f5e3a76fe38fbc397974678234Brian                   BTIF_HF_SECURITY, BTIF_HF_SERVICES);
7013af1f3b9220733f5e3a76fe38fbc397974678234Brian        return BT_STATUS_SUCCESS;
7023af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
7033af1f3b9220733f5e3a76fe38fbc397974678234Brian
7043af1f3b9220733f5e3a76fe38fbc397974678234Brian    return BT_STATUS_BUSY;
705abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin}
7063af1f3b9220733f5e3a76fe38fbc397974678234Brian
7073af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t connect( bt_bdaddr_t *bd_addr )
7083af1f3b9220733f5e3a76fe38fbc397974678234Brian{
7093af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
7103af1f3b9220733f5e3a76fe38fbc397974678234Brian    return btif_queue_connect(UUID_SERVCLASS_AG_HANDSFREE, bd_addr, connect_int);
7113af1f3b9220733f5e3a76fe38fbc397974678234Brian}
7123af1f3b9220733f5e3a76fe38fbc397974678234Brian
7133af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
7143af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7153af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         disconnect
7163af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7173af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      disconnect from headset
7183af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7193af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns         bt_status_t
7203af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7213af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
7223af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t disconnect( bt_bdaddr_t *bd_addr )
7233af1f3b9220733f5e3a76fe38fbc397974678234Brian{
7243af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
7253af1f3b9220733f5e3a76fe38fbc397974678234Brian
7263af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = btif_hf_idx_by_bdaddr(bd_addr);
7273af1f3b9220733f5e3a76fe38fbc397974678234Brian
7283af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
7297d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell    {
7303af1f3b9220733f5e3a76fe38fbc397974678234Brian        BTA_AgClose(btif_hf_cb[idx].handle);
7313af1f3b9220733f5e3a76fe38fbc397974678234Brian        return BT_STATUS_SUCCESS;
7323af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
7333af1f3b9220733f5e3a76fe38fbc397974678234Brian
7343af1f3b9220733f5e3a76fe38fbc397974678234Brian    return BT_STATUS_FAIL;
7353af1f3b9220733f5e3a76fe38fbc397974678234Brian}
7363af1f3b9220733f5e3a76fe38fbc397974678234Brian
7373af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
738abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
739abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Function         connect_audio
740abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
7413af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description     create an audio connection
7423af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7433af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns         bt_status_t
7443af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7453af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
7463af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t connect_audio( bt_bdaddr_t *bd_addr )
7473af1f3b9220733f5e3a76fe38fbc397974678234Brian{
7483af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
7493af1f3b9220733f5e3a76fe38fbc397974678234Brian
7503af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = btif_hf_idx_by_bdaddr(bd_addr);
7513af1f3b9220733f5e3a76fe38fbc397974678234Brian
7523af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
7533af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
7543af1f3b9220733f5e3a76fe38fbc397974678234Brian        BTA_AgAudioOpen(btif_hf_cb[idx].handle);
7557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell
7563af1f3b9220733f5e3a76fe38fbc397974678234Brian        /* Inform the application that the audio connection has been initiated successfully */
7573af1f3b9220733f5e3a76fe38fbc397974678234Brian        btif_transfer_context(btif_in_hf_generic_evt, BTIF_HFP_CB_AUDIO_CONNECTING,
7583af1f3b9220733f5e3a76fe38fbc397974678234Brian                              (char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
7593af1f3b9220733f5e3a76fe38fbc397974678234Brian        return BT_STATUS_SUCCESS;
760abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    }
7613af1f3b9220733f5e3a76fe38fbc397974678234Brian
7623af1f3b9220733f5e3a76fe38fbc397974678234Brian    return BT_STATUS_FAIL;
7633af1f3b9220733f5e3a76fe38fbc397974678234Brian}
764abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
7653af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
7663af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7673af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         disconnect_audio
768abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
769abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description      close the audio connection
7703af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7713af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns         bt_status_t
7723af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7733af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
7743af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t disconnect_audio( bt_bdaddr_t *bd_addr )
7753af1f3b9220733f5e3a76fe38fbc397974678234Brian{
7763af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
7773af1f3b9220733f5e3a76fe38fbc397974678234Brian
7783af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = btif_hf_idx_by_bdaddr(bd_addr);
7793af1f3b9220733f5e3a76fe38fbc397974678234Brian
7803af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
7817d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell    {
7823af1f3b9220733f5e3a76fe38fbc397974678234Brian        BTA_AgAudioClose(btif_hf_cb[idx].handle);
7833af1f3b9220733f5e3a76fe38fbc397974678234Brian        return BT_STATUS_SUCCESS;
7843af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
7853af1f3b9220733f5e3a76fe38fbc397974678234Brian
786abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    return BT_STATUS_FAIL;
7873af1f3b9220733f5e3a76fe38fbc397974678234Brian}
7883af1f3b9220733f5e3a76fe38fbc397974678234Brian
7893af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
790abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
7913af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         start_voice_recognition
7923af1f3b9220733f5e3a76fe38fbc397974678234Brian**
7932bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin** Description      start voice recognition
7942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin**
7952bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin** Returns          bt_status_t
7963af1f3b9220733f5e3a76fe38fbc397974678234Brian**
797abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin*******************************************************************************/
798abb436526974bd090853c0927ece0839f9143393Stéphane Marchesinstatic bt_status_t start_voice_recognition(bt_bdaddr_t *bd_addr)
7993af1f3b9220733f5e3a76fe38fbc397974678234Brian{
8003af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
8013af1f3b9220733f5e3a76fe38fbc397974678234Brian
8023af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = btif_hf_idx_by_bdaddr(bd_addr);
8033af1f3b9220733f5e3a76fe38fbc397974678234Brian
8043af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
8053af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
8063af1f3b9220733f5e3a76fe38fbc397974678234Brian        if (btif_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC)
8073af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
8083af1f3b9220733f5e3a76fe38fbc397974678234Brian            tBTA_AG_RES_DATA ag_res;
8093af1f3b9220733f5e3a76fe38fbc397974678234Brian            memset(&ag_res, 0, sizeof(ag_res));
8103af1f3b9220733f5e3a76fe38fbc397974678234Brian            ag_res.state = 1;
8113af1f3b9220733f5e3a76fe38fbc397974678234Brian            BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res);
8123af1f3b9220733f5e3a76fe38fbc397974678234Brian
8137d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell            return BT_STATUS_SUCCESS;
8143af1f3b9220733f5e3a76fe38fbc397974678234Brian        }
8153af1f3b9220733f5e3a76fe38fbc397974678234Brian        else
81679a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin        {
81744e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca            return BT_STATUS_UNSUPPORTED;
81844e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca        }
81944e6944e9dda3b78f2f4a9bdd583a4feeae1dcbaJosé Fonseca    }
82079a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin
8213af1f3b9220733f5e3a76fe38fbc397974678234Brian    return BT_STATUS_NOT_READY;
822abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin}
8233af1f3b9220733f5e3a76fe38fbc397974678234Brian
8243af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
8253af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8267d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell** Function         stop_voice_recognition
8272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
8283af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      stop voice recognition
8293af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8303af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          bt_status_t
8313af1f3b9220733f5e3a76fe38fbc397974678234Brian**
832abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin*******************************************************************************/
8333af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t stop_voice_recognition(bt_bdaddr_t *bd_addr)
8343af1f3b9220733f5e3a76fe38fbc397974678234Brian{
8353af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
8367d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell
8373af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = btif_hf_idx_by_bdaddr(bd_addr);
8383af1f3b9220733f5e3a76fe38fbc397974678234Brian
8393af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
8403af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
8413af1f3b9220733f5e3a76fe38fbc397974678234Brian        if (btif_hf_cb[idx].peer_feat & BTA_AG_PEER_FEAT_VREC)
842abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        {
8433af1f3b9220733f5e3a76fe38fbc397974678234Brian            tBTA_AG_RES_DATA ag_res;
8443af1f3b9220733f5e3a76fe38fbc397974678234Brian            memset(&ag_res, 0, sizeof(ag_res));
8453af1f3b9220733f5e3a76fe38fbc397974678234Brian            ag_res.state = 0;
8463af1f3b9220733f5e3a76fe38fbc397974678234Brian            BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_BVRA_RES, &ag_res);
8473af1f3b9220733f5e3a76fe38fbc397974678234Brian
8483af1f3b9220733f5e3a76fe38fbc397974678234Brian            return BT_STATUS_SUCCESS;
849062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin        }
8503af1f3b9220733f5e3a76fe38fbc397974678234Brian        else
851062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin        {
8523af1f3b9220733f5e3a76fe38fbc397974678234Brian            return BT_STATUS_UNSUPPORTED;
8533af1f3b9220733f5e3a76fe38fbc397974678234Brian        }
8543af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
8553af1f3b9220733f5e3a76fe38fbc397974678234Brian
8563af1f3b9220733f5e3a76fe38fbc397974678234Brian    return BT_STATUS_NOT_READY;
8573af1f3b9220733f5e3a76fe38fbc397974678234Brian}
8583af1f3b9220733f5e3a76fe38fbc397974678234Brian
8593af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
8603af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8613af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         volume_control
8623af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8633af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      volume control
8643af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8655b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell** Returns          bt_status_t
8663af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8673af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
8683af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t volume_control(bthf_volume_type_t type, int volume,
8693af1f3b9220733f5e3a76fe38fbc397974678234Brian                                                       bt_bdaddr_t *bd_addr)
8703af1f3b9220733f5e3a76fe38fbc397974678234Brian{
8713af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
8723af1f3b9220733f5e3a76fe38fbc397974678234Brian
8733af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = btif_hf_idx_by_bdaddr(bd_addr);
8743af1f3b9220733f5e3a76fe38fbc397974678234Brian
8753af1f3b9220733f5e3a76fe38fbc397974678234Brian    tBTA_AG_RES_DATA ag_res;
8763af1f3b9220733f5e3a76fe38fbc397974678234Brian    memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
8773af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
8783af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
8793af1f3b9220733f5e3a76fe38fbc397974678234Brian        ag_res.num = volume;
8803af1f3b9220733f5e3a76fe38fbc397974678234Brian        BTA_AgResult(btif_hf_cb[idx].handle,
8813af1f3b9220733f5e3a76fe38fbc397974678234Brian                     (type == BTHF_VOLUME_TYPE_SPK) ? BTA_AG_SPK_RES : BTA_AG_MIC_RES,
8823af1f3b9220733f5e3a76fe38fbc397974678234Brian                     &ag_res);
8837d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell        return BT_STATUS_SUCCESS;
8843af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
8853af1f3b9220733f5e3a76fe38fbc397974678234Brian
886062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin    return BT_STATUS_FAIL;
8873af1f3b9220733f5e3a76fe38fbc397974678234Brian}
8883af1f3b9220733f5e3a76fe38fbc397974678234Brian
8893af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
8903af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8913af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         device_status_notification
8923af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8933af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      Combined device status change notification
8943af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8953af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          bt_status_t
8963af1f3b9220733f5e3a76fe38fbc397974678234Brian**
8973af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
8987d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwellstatic bt_status_t device_status_notification(bthf_network_state_t ntk_state,
8993af1f3b9220733f5e3a76fe38fbc397974678234Brian                          bthf_service_type_t svc_type, int signal, int batt_chg)
9003af1f3b9220733f5e3a76fe38fbc397974678234Brian{
901062a1e291fdc0ef69b6677f8ae0e3471047e281dStéphane Marchesin    CHECK_BTHF_INIT();
9023af1f3b9220733f5e3a76fe38fbc397974678234Brian
9033af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (is_connected(NULL))
9043af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
9052292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        /* send all indicators to BTA.
9062292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        ** BTA will make sure no duplicates are sent out
907abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        */
908abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        send_indicator_update(BTA_AG_IND_SERVICE,
9092292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin                              (ntk_state == BTHF_NETWORK_STATE_AVAILABLE) ? 1 : 0);
9102292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        send_indicator_update(BTA_AG_IND_ROAM,
9112292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin                             (svc_type == BTHF_SERVICE_TYPE_HOME) ? 0 : 1);
9122292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        send_indicator_update(BTA_AG_IND_SIGNAL, signal);
9132292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        send_indicator_update(BTA_AG_IND_BATTCHG, batt_chg);
9142292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        return BT_STATUS_SUCCESS;
9152292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    }
9162292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
9172292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    return BT_STATUS_SUCCESS;
9182292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin}
9192292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
9202292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin/*******************************************************************************
9212292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
9222292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Function         cops_response
9232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
9242292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Description      Response for COPS command
9252292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
9262292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Returns          bt_status_t
9272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
9282292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin*******************************************************************************/
9292292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesinstatic bt_status_t cops_response(const char *cops, bt_bdaddr_t *bd_addr)
9302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin{
9313af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
9323af1f3b9220733f5e3a76fe38fbc397974678234Brian
9332292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    int idx = btif_hf_idx_by_bdaddr(bd_addr);
934abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
93520839b37ed61b044d6224c0e373ce10d74be4f3dBrian    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
93620839b37ed61b044d6224c0e373ce10d74be4f3dBrian    {
9373af1f3b9220733f5e3a76fe38fbc397974678234Brian        tBTA_AG_RES_DATA    ag_res;
938abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
9393af1f3b9220733f5e3a76fe38fbc397974678234Brian        /* Format the response */
9403af1f3b9220733f5e3a76fe38fbc397974678234Brian        sprintf (ag_res.str, "0,0,\"%s\"", cops);
9413af1f3b9220733f5e3a76fe38fbc397974678234Brian        ag_res.ok_flag = BTA_AG_OK_DONE;
9423af1f3b9220733f5e3a76fe38fbc397974678234Brian
9433af1f3b9220733f5e3a76fe38fbc397974678234Brian        BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_COPS_RES, &ag_res);
9440e31e24659a1e691bdfa213fcd073bbfaa4ed6e9Michal        return BT_STATUS_SUCCESS;
9453af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
9463af1f3b9220733f5e3a76fe38fbc397974678234Brian    return BT_STATUS_FAIL;
9473af1f3b9220733f5e3a76fe38fbc397974678234Brian}
9483af1f3b9220733f5e3a76fe38fbc397974678234Brian
9493af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
9503af1f3b9220733f5e3a76fe38fbc397974678234Brian**
9513af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         cind_response
9523af1f3b9220733f5e3a76fe38fbc397974678234Brian**
9533af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      Response for CIND command
9543af1f3b9220733f5e3a76fe38fbc397974678234Brian**
9553af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          bt_status_t
9563af1f3b9220733f5e3a76fe38fbc397974678234Brian**
9573af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
9583af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t cind_response(int svc, int num_active, int num_held,
9593af1f3b9220733f5e3a76fe38fbc397974678234Brian                                     bthf_call_state_t call_setup_state,
9603af1f3b9220733f5e3a76fe38fbc397974678234Brian                                     int signal, int roam, int batt_chg,
9613af1f3b9220733f5e3a76fe38fbc397974678234Brian                                                    bt_bdaddr_t *bd_addr)
9623af1f3b9220733f5e3a76fe38fbc397974678234Brian{
9633af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
9643af1f3b9220733f5e3a76fe38fbc397974678234Brian
9653af1f3b9220733f5e3a76fe38fbc397974678234Brian    int idx = btif_hf_idx_by_bdaddr(bd_addr);
9663af1f3b9220733f5e3a76fe38fbc397974678234Brian
9673af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
9683af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
9693af1f3b9220733f5e3a76fe38fbc397974678234Brian        tBTA_AG_RES_DATA    ag_res;
9703af1f3b9220733f5e3a76fe38fbc397974678234Brian
9713af1f3b9220733f5e3a76fe38fbc397974678234Brian        memset (&ag_res, 0, sizeof (ag_res));
9723af1f3b9220733f5e3a76fe38fbc397974678234Brian        /* per the errata 2043, call=1 implies atleast one call is in progress (active/held)
9733af1f3b9220733f5e3a76fe38fbc397974678234Brian        ** https://www.bluetooth.org/errata/errata_view.cfm?errata_id=2043
9747d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell        **/
9753af1f3b9220733f5e3a76fe38fbc397974678234Brian        sprintf (ag_res.str, "%d,%d,%d,%d,%d,%d,%d",
9763af1f3b9220733f5e3a76fe38fbc397974678234Brian                (num_active + num_held) ? 1 : 0,                       /* Call state */
9773af1f3b9220733f5e3a76fe38fbc397974678234Brian                callstate_to_callsetup(call_setup_state),              /* Callsetup state */
9783af1f3b9220733f5e3a76fe38fbc397974678234Brian                svc,                                                   /* network service */
9793af1f3b9220733f5e3a76fe38fbc397974678234Brian                signal,                                                /* Signal strength */
9802292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin                roam,                                                  /* Roaming indicator */
9812292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin                batt_chg,                                              /* Battery level */
982abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                ((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1))); /* Call held */
9832292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
9842292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_CIND_RES, &ag_res);
9853af1f3b9220733f5e3a76fe38fbc397974678234Brian
986abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        return BT_STATUS_SUCCESS;
9873af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
9883af1f3b9220733f5e3a76fe38fbc397974678234Brian
98920839b37ed61b044d6224c0e373ce10d74be4f3dBrian    return BT_STATUS_FAIL;
99020839b37ed61b044d6224c0e373ce10d74be4f3dBrian}
991abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
99220839b37ed61b044d6224c0e373ce10d74be4f3dBrian/*******************************************************************************
99320839b37ed61b044d6224c0e373ce10d74be4f3dBrian**
9942292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Function         formatted_at_response
995468c2c08414f0ad07e2c2c2a98506f6390124963Stéphane Marchesin**
996abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description      Pre-formatted AT response, typically in response to unknown AT cmd
997abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
9980f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin** Returns          bt_status_t
9990f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin**
10000f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin*******************************************************************************/
10012292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesinstatic bt_status_t formatted_at_response(const char *rsp, bt_bdaddr_t *bd_addr)
10022292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin{
10032292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    CHECK_BTHF_INIT();
10040f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin    tBTA_AG_RES_DATA    ag_res;
10050f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin    int idx = btif_hf_idx_by_bdaddr(bd_addr);
10060f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin
10070f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
10082292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    {
10090f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin        /* Format the response and send */
10100f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin        memset (&ag_res, 0, sizeof (ag_res));
10110f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin        strncpy(ag_res.str, rsp, BTA_AG_AT_MAX_LEN);
10120f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin        BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_UNAT_RES, &ag_res);
10130f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin
10140f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin        return BT_STATUS_SUCCESS;
10152292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    }
10160f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin
10170f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin    return BT_STATUS_FAIL;
10180f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin}
10190f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin
10202292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin/*******************************************************************************
10210f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin**
10222292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Function         at_response
10232292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
1024abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description      ok/error response
10252292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
10262292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin** Returns          bt_status_t
10272292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin**
10282292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin*******************************************************************************/
10292292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesinstatic bt_status_t at_response(bthf_at_response_t response_code,
10302292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin                                    int error_code, bt_bdaddr_t *bd_addr)
10312292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin{
10322292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    CHECK_BTHF_INIT();
10332292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
10342292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    int idx = btif_hf_idx_by_bdaddr(bd_addr);
10352292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
10362292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
10372292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    {
10382292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        send_at_result((response_code == BTHF_AT_RESPONSE_OK) ? BTA_AG_OK_DONE
10392292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin                        : BTA_AG_OK_ERROR, error_code, idx);
10402292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin        return BT_STATUS_SUCCESS;
10412292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    }
10422292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
10432292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
10442292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    return BT_STATUS_FAIL;
10452292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin}
10462292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
10470f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin/*******************************************************************************
10480f091333d1ef403a67a8639ac13d9a9bbe93092aStéphane Marchesin**
10493af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         clcc_response
1050abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin**
1051abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin** Description      response for CLCC command
10523af1f3b9220733f5e3a76fe38fbc397974678234Brian**                  Can be iteratively called for each call index. Call index
10533af1f3b9220733f5e3a76fe38fbc397974678234Brian**                  of 0 will be treated as NULL termination (Completes response)
10543af1f3b9220733f5e3a76fe38fbc397974678234Brian**
10557d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell** Returns          bt_status_t
10563af1f3b9220733f5e3a76fe38fbc397974678234Brian**
10573af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
10583af1f3b9220733f5e3a76fe38fbc397974678234Brianstatic bt_status_t clcc_response(int index, bthf_call_direction_t dir,
10593af1f3b9220733f5e3a76fe38fbc397974678234Brian                               bthf_call_state_t state, bthf_call_mode_t mode,
10603af1f3b9220733f5e3a76fe38fbc397974678234Brian                               bthf_call_mpty_type_t mpty, const char *number,
1061abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                               bthf_call_addrtype_t type, bt_bdaddr_t *bd_addr)
10623af1f3b9220733f5e3a76fe38fbc397974678234Brian{
10633af1f3b9220733f5e3a76fe38fbc397974678234Brian    CHECK_BTHF_INIT();
10642292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
1065abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin    int idx = btif_hf_idx_by_bdaddr(bd_addr);
10662292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin
10672292025c49f2165b59f578c926d320913b08b1b5Stéphane Marchesin    if (is_connected(bd_addr) && (idx != BTIF_HF_INVALID_IDX))
10683af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
1069abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin        tBTA_AG_RES_DATA    ag_res;
10703af1f3b9220733f5e3a76fe38fbc397974678234Brian        int                 xx;
10713af1f3b9220733f5e3a76fe38fbc397974678234Brian
1072ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol        memset (&ag_res, 0, sizeof (ag_res));
1073abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin
1074ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol        /* Format the response */
1075ba75e82b6ebaf88dd2e4a8f764b2d296d715bf8aMichal Krol        if (index == 0)
10763af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
10773af1f3b9220733f5e3a76fe38fbc397974678234Brian            ag_res.ok_flag = BTA_AG_OK_DONE;
10783af1f3b9220733f5e3a76fe38fbc397974678234Brian        }
10793af1f3b9220733f5e3a76fe38fbc397974678234Brian        else
10803af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
10813af1f3b9220733f5e3a76fe38fbc397974678234Brian            BTIF_TRACE_EVENT6("clcc_response: [%d] dir %d state %d mode %d number = %s type = %d",
10823af1f3b9220733f5e3a76fe38fbc397974678234Brian                          index, dir, state, mode, number, type);
1083abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin            xx = sprintf (ag_res.str, "%d,%d,%d,%d,%d",
1084abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                         index, dir, state, mode, mpty);
10853af1f3b9220733f5e3a76fe38fbc397974678234Brian
10863af1f3b9220733f5e3a76fe38fbc397974678234Brian            if (number)
10873af1f3b9220733f5e3a76fe38fbc397974678234Brian            {
10883af1f3b9220733f5e3a76fe38fbc397974678234Brian                if ((type == BTHF_CALL_ADDRTYPE_INTERNATIONAL) && (*number != '+'))
10893af1f3b9220733f5e3a76fe38fbc397974678234Brian                    sprintf (&ag_res.str[xx], ",\"+%s\",%d", number, type);
10903af1f3b9220733f5e3a76fe38fbc397974678234Brian                else
10913af1f3b9220733f5e3a76fe38fbc397974678234Brian                    sprintf (&ag_res.str[xx], ",\"%s\",%d", number, type);
10923af1f3b9220733f5e3a76fe38fbc397974678234Brian            }
10933af1f3b9220733f5e3a76fe38fbc397974678234Brian        }
10943af1f3b9220733f5e3a76fe38fbc397974678234Brian        BTA_AgResult (btif_hf_cb[idx].handle, BTA_AG_CLCC_RES, &ag_res);
10957d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell
10963af1f3b9220733f5e3a76fe38fbc397974678234Brian        return BT_STATUS_SUCCESS;
10973af1f3b9220733f5e3a76fe38fbc397974678234Brian    }
10983af1f3b9220733f5e3a76fe38fbc397974678234Brian
10993af1f3b9220733f5e3a76fe38fbc397974678234Brian    return BT_STATUS_FAIL;
11003af1f3b9220733f5e3a76fe38fbc397974678234Brian}
11013af1f3b9220733f5e3a76fe38fbc397974678234Brian
11023af1f3b9220733f5e3a76fe38fbc397974678234Brian/*******************************************************************************
1103af60ebc4eedcfec2090e1ddd7630137948c26866José Fonseca**
110420839b37ed61b044d6224c0e373ce10d74be4f3dBrian** Function         phone_state_change
11053af1f3b9220733f5e3a76fe38fbc397974678234Brian**
11063af1f3b9220733f5e3a76fe38fbc397974678234Brian** Description      notify of a call state change
11073af1f3b9220733f5e3a76fe38fbc397974678234Brian**                  number & type: valid only for incoming & waiting call
11083af1f3b9220733f5e3a76fe38fbc397974678234Brian**
11093af1f3b9220733f5e3a76fe38fbc397974678234Brian** Returns          bt_status_t
11103af1f3b9220733f5e3a76fe38fbc397974678234Brian**
11113af1f3b9220733f5e3a76fe38fbc397974678234Brian*******************************************************************************/
11122bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11132bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesinstatic bt_status_t phone_state_change(int num_active, int num_held, bthf_call_state_t call_setup_state,
11142bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                                            const char *number, bthf_call_addrtype_t type)
11153af1f3b9220733f5e3a76fe38fbc397974678234Brian{
1116c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    tBTA_AG_RES res = 0xff;
11172bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    tBTA_AG_RES_DATA ag_res;
11182bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    bt_status_t status = BT_STATUS_SUCCESS;
11192bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    BOOLEAN activeCallUpdated = FALSE;
11202bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    int idx, i;
11212bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11222bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    /* hf_idx is index of connected HS that sent ATA/BLDN,
11232bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            otherwise index of latest connected HS */
11242bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    if (hf_idx != BTIF_HF_INVALID_IDX)
11252bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        idx = hf_idx;
11263af1f3b9220733f5e3a76fe38fbc397974678234Brian    else
11272bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        idx = btif_hf_latest_connected_idx();
11282bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11292bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    BTIF_TRACE_DEBUG1("phone_state_change: idx = %d", idx);
11302bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11312bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    /* Check if SLC is connected */
11322bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    if (btif_hf_check_if_slc_connected() != BT_STATUS_SUCCESS)
11332bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        return BT_STATUS_NOT_READY;
11342bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11352bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    BTIF_TRACE_DEBUG6("phone_state_change: num_active=%d [prev: %d]  num_held=%d[prev: %d]"
11362bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                      " call_setup=%s [prev: %s]", num_active, btif_hf_cb[idx].num_active,
1137c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                       num_held, btif_hf_cb[idx].num_held, dump_hf_call_state(call_setup_state),
11382bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                       dump_hf_call_state(btif_hf_cb[idx].call_setup_state));
11392bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11402bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    /* if all indicators are 0, send end call and return */
11412bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    if (num_active == 0 && num_held == 0 && call_setup_state == BTHF_CALL_STATE_IDLE)
11422bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    {
11432bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        BTIF_TRACE_DEBUG1("%s: Phone on hook", __FUNCTION__);
11442bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11452bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        /* record call termination timestamp  if  there was an active/held call  or
11462bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                   callsetup state > BTHF_CALL_STATE_IDLE */
11472bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        if ((btif_hf_cb[idx].call_setup_state != BTHF_CALL_STATE_IDLE ) ||
11482bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                 (btif_hf_cb[idx].num_active) ||(btif_hf_cb[idx].num_held))
11492bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        {
11500235b3252100eda553babea42c014445358a2985Brian            BTIF_TRACE_DEBUG1("%s: Record call termination timestamp", __FUNCTION__);
11512bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            clock_gettime(CLOCK_MONOTONIC, &btif_hf_cb[0].call_end_timestamp);
11522bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        }
11533af1f3b9220733f5e3a76fe38fbc397974678234Brian        BTA_AgResult (BTA_AG_HANDLE_ALL, BTA_AG_END_CALL_RES, NULL);
11542bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        hf_idx = BTIF_HF_INVALID_IDX;
11552bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11562bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        /* if held call was present, reset that as well */
11572bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        if (btif_hf_cb[idx].num_held)
11582bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            send_indicator_update(BTA_AG_IND_CALLHELD, 0);
11592bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11602bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        goto update_call_states;
11612bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    }
11622bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
1163c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    /* active state can change when:
11642bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    ** 1. an outgoing/incoming call was answered
11652bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    ** 2. an held was resumed
11663af1f3b9220733f5e3a76fe38fbc397974678234Brian    ** 3. without callsetup notifications, call became active
11672bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    ** (3) can happen if call is active and a headset connects to us
11682bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    **
11692bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    ** In the case of (3), we will have to notify the stack of an active
11702bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    ** call, instead of sending an indicator update. This will also
11712bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    ** force the SCO to be setup. Handle this special case here prior to
11722bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    ** call setup handling
11732bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    */
11742bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    if ( (num_active == 1) && (btif_hf_cb[idx].num_active == 0) && (btif_hf_cb[idx].num_held == 0)
11752bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin         && (btif_hf_cb[idx].call_setup_state == BTHF_CALL_STATE_IDLE) )
11762bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    {
11772bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        BTIF_TRACE_DEBUG1("%s: Active call notification received without call setup update",
11782bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                          __FUNCTION__);
11792bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11802bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
11812bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        ag_res.audio_handle = btif_hf_cb[idx].handle;
11822bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        res = BTA_AG_OUT_CALL_CONN_RES;
1183c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian        BTA_AgResult(BTA_AG_HANDLE_ALL, res, &ag_res);
1184c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian        activeCallUpdated = TRUE;
1185c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    }
1186c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian
11872bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    /* Ringing call changed? */
11883af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (call_setup_state != btif_hf_cb[idx].call_setup_state)
11893af1f3b9220733f5e3a76fe38fbc397974678234Brian    {
11902bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        BTIF_TRACE_DEBUG3("%s: Call setup states changed. old: %s new: %s",
11912bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            __FUNCTION__, dump_hf_call_state(btif_hf_cb[idx].call_setup_state),
11922bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            dump_hf_call_state(call_setup_state));
11932bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
11942bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin
11952bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin        switch (call_setup_state)
11963af1f3b9220733f5e3a76fe38fbc397974678234Brian        {
11972bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            case BTHF_CALL_STATE_IDLE:
11982bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin            {
11992bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                switch (btif_hf_cb[idx].call_setup_state)
12002bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                {
12012bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                    case BTHF_CALL_STATE_INCOMING:
12022bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                        if (num_active > btif_hf_cb[idx].num_active)
12032bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                        {
12042bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                            res = BTA_AG_IN_CALL_CONN_RES;
12052bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                            ag_res.audio_handle = btif_hf_cb[idx].handle;
12062bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                        }
12072bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                        else if (num_held > btif_hf_cb[idx].num_held)
12082bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                            res = BTA_AG_IN_CALL_HELD_RES;
12092bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                        else
12102bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                            res = BTA_AG_CALL_CANCEL_RES;
12112bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                        break;
12122bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin                    case BTHF_CALL_STATE_DIALING:
12133af1f3b9220733f5e3a76fe38fbc397974678234Brian                    case BTHF_CALL_STATE_ALERTING:
12143af1f3b9220733f5e3a76fe38fbc397974678234Brian                        if (num_active > btif_hf_cb[idx].num_active)
12153af1f3b9220733f5e3a76fe38fbc397974678234Brian                        {
12160d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                            ag_res.audio_handle = BTA_AG_HANDLE_SCO_NO_CHANGE;
12170d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                            res = BTA_AG_OUT_CALL_CONN_RES;
1218c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                        }
12190d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                        else
12200d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                            res = BTA_AG_CALL_CANCEL_RES;
1221abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                        break;
12220d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                    default:
1223c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                        BTIF_TRACE_ERROR1("%s: Incorrect Call setup state transition", __FUNCTION__);
12240d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                        status = BT_STATUS_PARM_INVALID;
1225c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                        break;
1226c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                }
1227c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian            } break;
1228c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian
1229c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian            case BTHF_CALL_STATE_INCOMING:
1230c0bb4ba9e665e40a325d82aa2ee48d7b8abd603bBrian                if (num_active || num_held)
1231c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                    res = BTA_AG_CALL_WAIT_RES;
1232c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                else
1233c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                    res = BTA_AG_IN_CALL_RES;
12345d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin                if (number)
12355d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin                {
1236abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                    int xx = 0;
1237abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                    if ((type == BTHF_CALL_ADDRTYPE_INTERNATIONAL) && (*number != '+'))
1238abb436526974bd090853c0927ece0839f9143393Stéphane Marchesin                        xx = sprintf (ag_res.str, "\"+%s\"", number);
1239c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian                    else
12400d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                        xx = sprintf (ag_res.str, "\"%s\"", number);
12410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                    ag_res.num = type;
12420d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
12430d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                    if (res == BTA_AG_CALL_WAIT_RES)
12440d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                        sprintf(&ag_res.str[xx], ",%d", type);
12450d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                }
12460d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                break;
12470d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            case BTHF_CALL_STATE_DIALING:
12480d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                ag_res.audio_handle = btif_hf_cb[idx].handle;
12490d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                res = BTA_AG_OUT_CALL_ORIG_RES;
12500235b3252100eda553babea42c014445358a2985Brian                break;
12510d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            case BTHF_CALL_STATE_ALERTING:
12520d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                /* if we went from idle->alert, force SCO setup here. dialing usually triggers it */
12530d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                if (btif_hf_cb[idx].call_setup_state == BTHF_CALL_STATE_IDLE)
12540d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                ag_res.audio_handle = btif_hf_cb[idx].handle;
12550d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                res = BTA_AG_OUT_CALL_ALERT_RES;
12560d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                break;
12570d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            default:
12580d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                BTIF_TRACE_ERROR1("%s: Incorrect new ringing call state", __FUNCTION__);
12595ac22877c98f4934cced4d42b9ec87245f266967Brian                status = BT_STATUS_PARM_INVALID;
12600d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                break;
12610d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        }
12620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        BTIF_TRACE_DEBUG3("%s: Call setup state changed. res=%d, audio_handle=%d", __FUNCTION__, res, ag_res.audio_handle);
12630d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
12640d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        if (res)
12650d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            BTA_AgResult(BTA_AG_HANDLE_ALL, res, &ag_res);
1266c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian
12675961732c1b59403b4e736fa354a64d4a0e5d8af2Michal        /* if call setup is idle, we have already updated call indicator, jump out */
12685961732c1b59403b4e736fa354a64d4a0e5d8af2Michal        if (call_setup_state == BTHF_CALL_STATE_IDLE)
12690d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        {
12700d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            /* check & update callheld */
12715d7609715a44d08f29d4b605c4bea2742a194493Stéphane Marchesin            if ((num_held > 0) && (num_active > 0))
12720d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                send_indicator_update(BTA_AG_IND_CALLHELD, 1);
12730d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian            goto update_call_states;
12740d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        }
12750d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    }
12760d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
12770d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    memset(&ag_res, 0, sizeof(tBTA_AG_RES_DATA));
12780d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
12790d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    /* per the errata 2043, call=1 implies atleast one call is in progress (active/held)
12800d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    ** https://www.bluetooth.org/errata/errata_view.cfm?errata_id=2043
12810d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    ** Handle call indicator change
12820d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    **/
12830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    if (!activeCallUpdated && ((num_active + num_held) !=
12840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                 (btif_hf_cb[idx].num_active + btif_hf_cb[idx].num_held)) )
12850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    {
12860d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        BTIF_TRACE_DEBUG3("%s: Active call states changed. old: %d new: %d", __FUNCTION__, btif_hf_cb[idx].num_active, num_active);
12870d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        send_indicator_update(BTA_AG_IND_CALL, ((num_active + num_held) > 0) ? 1 : 0);
1288c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    }
12890d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
12900d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    /* Held Changed? */
12915ac22877c98f4934cced4d42b9ec87245f266967Brian    if (num_held != btif_hf_cb[idx].num_held)
12925ac22877c98f4934cced4d42b9ec87245f266967Brian    {
12930d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        BTIF_TRACE_DEBUG3("%s: Held call states changed. old: %d new: %d",
12940d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                        __FUNCTION__, btif_hf_cb[idx].num_held, num_held);
12950d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian        send_indicator_update(BTA_AG_IND_CALLHELD, ((num_held == 0) ? 0 : ((num_active == 0) ? 2 : 1)));
12960d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    }
12970d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
12980d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    /* Calls Swapped? */
12990d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    if ( (call_setup_state == btif_hf_cb[idx].call_setup_state) &&
13000d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian         (num_active && num_held) &&
13010d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian         (num_active == btif_hf_cb[idx].num_active) &&
13028e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin         (num_held == btif_hf_cb[idx].num_held) )
1303c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    {
13048e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin        BTIF_TRACE_DEBUG1("%s: Calls swapped", __FUNCTION__);
13058e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin        send_indicator_update(BTA_AG_IND_CALLHELD, 1);
13068e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin    }
1307c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian
13088e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesinupdate_call_states:
13090d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    for (i = 0; i < btif_max_hf_clients; i++)
13108e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin    {
13118e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin        btif_hf_cb[i].num_active = num_active;
13128e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin        btif_hf_cb[i].num_held = num_held;
13138e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin        btif_hf_cb[i].call_setup_state = call_setup_state;
131479a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin    }
13155ac22877c98f4934cced4d42b9ec87245f266967Brian    return status;
13168e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin}
13178e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin
13188e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin
13198e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin/*******************************************************************************
13203af1f3b9220733f5e3a76fe38fbc397974678234Brian**
13218e4540ec2a82e72be491bc8fe23c10551d29a96cStéphane Marchesin** Function         btif_hf_call_terminated_recently
132279a0499369470a2a9b2cb5cfc83b1790283f4556Stéphane Marchesin**
13235ac22877c98f4934cced4d42b9ec87245f266967Brian** Description      Checks if a call has been terminated
13245ac22877c98f4934cced4d42b9ec87245f266967Brian**
13250d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian** Returns          bt_status_t
13260d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian**
13270d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian*******************************************************************************/
13280d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7BrianBOOLEAN btif_hf_call_terminated_recently()
13295961732c1b59403b4e736fa354a64d4a0e5d8af2Michal{
13300d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian      struct timespec         now;
13310d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
13320d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian      clock_gettime(CLOCK_MONOTONIC, &now);
13330d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian      if (now.tv_sec < btif_hf_cb[0].call_end_timestamp.tv_sec +
13340d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian                                  BTIF_HF_CALL_END_TIMEOUT)
13350d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian      {
13360d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian          return TRUE;
13370d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian      }
13383af1f3b9220733f5e3a76fe38fbc397974678234Brian      else
13393af1f3b9220733f5e3a76fe38fbc397974678234Brian      {
13403af1f3b9220733f5e3a76fe38fbc397974678234Brian          btif_hf_cb[0].call_end_timestamp.tv_sec = 0;
13410d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian          return FALSE;
13423af1f3b9220733f5e3a76fe38fbc397974678234Brian      }
13433af1f3b9220733f5e3a76fe38fbc397974678234Brian}
1344f69b5c56feb60791bad27d491ee9592238d4efb0Brian
13454901410293b35ac6bb4759142b50fcc0be8a1b25Brian/*******************************************************************************
134637cf13ed9a429c755f121daa1776b1b30a985ab3Brian**
13473af1f3b9220733f5e3a76fe38fbc397974678234Brian** Function         cleanup
13483af1f3b9220733f5e3a76fe38fbc397974678234Brian**
134937cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Description      Closes the HF interface
135037cf13ed9a429c755f121daa1776b1b30a985ab3Brian**
135137cf13ed9a429c755f121daa1776b1b30a985ab3Brian** Returns          bt_status_t
135237cf13ed9a429c755f121daa1776b1b30a985ab3Brian**
135337cf13ed9a429c755f121daa1776b1b30a985ab3Brian*******************************************************************************/
135437cf13ed9a429c755f121daa1776b1b30a985ab3Brianstatic void  cleanup( void )
13553af1f3b9220733f5e3a76fe38fbc397974678234Brian{
13563af1f3b9220733f5e3a76fe38fbc397974678234Brian    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
13573af1f3b9220733f5e3a76fe38fbc397974678234Brian
13583af1f3b9220733f5e3a76fe38fbc397974678234Brian    if (bt_hf_callbacks)
13590d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    {
1360c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian        btif_disable_service(BTA_HFP_SERVICE_ID);
1361c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian        bt_hf_callbacks = NULL;
13620d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian    }
136398b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter}
1364c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian
13659726947b681225a5a438eaa7cb70c5fa36ce85eaBrian Paulstatic const bthf_interface_t bthfInterface = {
13663af1f3b9220733f5e3a76fe38fbc397974678234Brian    sizeof(bthfInterface),
1367c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    init,
1368c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    connect,
1369c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    disconnect,
1370c74900ee5d80c7c2b7cbe4ed87395526a742a13eBrian    connect_audio,
137198b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    disconnect_audio,
137298b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    start_voice_recognition,
13739f0acfe1384d3236ac30ffca4be96e9531d2e876Jakob Bornecrantz    stop_voice_recognition,
137498b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    volume_control,
137598b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    device_status_notification,
137698b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    cops_response,
137798b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    cind_response,
137898b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    formatted_at_response,
137998b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    at_response,
138098b418e56e9592cb796f2f814b3c8b46238d05afDaniel Vetter    clcc_response,
13819726947b681225a5a438eaa7cb70c5fa36ce85eaBrian Paul    phone_state_change,
13822bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin    cleanup,
13830d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian};
13840d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian
13850d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian/*******************************************************************************
13862bc5e0e97ba7b6c32f6ff90cb90448173d74b89bStéphane Marchesin**
1387ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin** Function         btif_hf_execute_service
1388ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin**
1389ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin** Description      Initializes/Shuts down the service
1390ef1fa4467f269e70f9f42764d6bfaffdee27cd6aStéphane Marchesin**
13910d9bcdbeb11ad1ce7e5257f652ccf9ebf1aa59a7Brian** Returns          BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
1392**
1393*******************************************************************************/
1394bt_status_t btif_hf_execute_service(BOOLEAN b_enable)
1395{
1396     char * p_service_names[] = BTIF_HF_SERVICE_NAMES;
1397     int i;
1398     if (b_enable)
1399     {
1400          /* Enable and register with BTA-AG */
1401          BTA_AgEnable (BTA_AG_PARSE, bte_hf_evt);
1402              for (i = 0; i < btif_max_hf_clients; i++)
1403              {
1404                  BTA_AgRegister(BTIF_HF_SERVICES, BTIF_HF_SECURITY,
1405                      BTIF_HF_FEATURES, p_service_names, bthf_hf_id[i]);
1406              }
1407     }
1408     else {
1409         /* De-register AG */
1410         for (i = 0; i < btif_max_hf_clients; i++)
1411         {
1412             BTA_AgDeregister(btif_hf_cb[i].handle);
1413         }
1414         /* Disable AG */
1415         BTA_AgDisable();
1416     }
1417     return BT_STATUS_SUCCESS;
1418}
1419
1420/*******************************************************************************
1421**
1422** Function         btif_hf_get_interface
1423**
1424** Description      Get the hf callback interface
1425**
1426** Returns          bthf_interface_t
1427**
1428*******************************************************************************/
1429const bthf_interface_t *btif_hf_get_interface()
1430{
1431    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
1432    return &bthfInterface;
1433}
1434