blob: 22d5ba281bea047acce508f9cf36c37abafe8046 [file] [log] [blame]
Hemant Gupta3fe1b492014-04-29 16:23:59 +05301/******************************************************************************
2 *
Hemant Gupta10256872013-08-19 18:33:01 +05303 * Copyright (c) 2014 The Android Open Source Project
Hemant Gupta3fe1b492014-04-29 16:23:59 +05304 * Copyright (C) 2009-2012 Broadcom Corporation
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 ******************************************************************************/
19
20/************************************************************************************
21 *
Hemant Gupta10256872013-08-19 18:33:01 +053022 * Filename: btif_hf_client.c
Hemant Gupta3fe1b492014-04-29 16:23:59 +053023 *
Hemant Gupta10256872013-08-19 18:33:01 +053024 * Description: Handsfree Profile (HF role) Bluetooth Interface
Hemant Gupta3fe1b492014-04-29 16:23:59 +053025 *
26 *
27 ***********************************************************************************/
28
29#include <hardware/bluetooth.h>
Hemant Gupta10256872013-08-19 18:33:01 +053030#include <hardware/bt_hf_client.h>
Hemant Gupta3fe1b492014-04-29 16:23:59 +053031#include <stdlib.h>
Hemant Gupta10256872013-08-19 18:33:01 +053032#include <cutils/properties.h>
Hemant Gupta3fe1b492014-04-29 16:23:59 +053033
Hemant Gupta10256872013-08-19 18:33:01 +053034#define LOG_TAG "BTIF_HF_CLIENT"
Hemant Gupta3fe1b492014-04-29 16:23:59 +053035#include "btif_common.h"
36#include "btif_util.h"
37#include "btif_profile_queue.h"
Hemant Gupta10256872013-08-19 18:33:01 +053038#include "bt_utils.h"
Hemant Gupta3fe1b492014-04-29 16:23:59 +053039#include "bd.h"
Hemant Gupta10256872013-08-19 18:33:01 +053040#include "bta_hf_client_api.h"
Hemant Gupta3fe1b492014-04-29 16:23:59 +053041
42/************************************************************************************
43** Constants & Macros
44************************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +053045
46#ifndef BTIF_HF_CLIENT_SERVICE_NAME
47#define BTIF_HF_CLIENT_SERVICE_NAME ("Handsfree")
Hemant Gupta3fe1b492014-04-29 16:23:59 +053048#endif
49
Hemant Gupta10256872013-08-19 18:33:01 +053050#ifndef BTIF_HF_CLIENT_SECURITY
51#define BTIF_HF_CLIENT_SECURITY (BTA_SEC_AUTHENTICATE | BTA_SEC_ENCRYPT)
Hemant Gupta3fe1b492014-04-29 16:23:59 +053052#endif
53
Hemant Gupta10256872013-08-19 18:33:01 +053054#ifndef BTIF_HF_CLIENT_FEATURES
55#define BTIF_HF_CLIENT_FEATURES ( BTA_HF_CLIENT_FEAT_ECNR | \
56 BTA_HF_CLIENT_FEAT_3WAY | \
57 BTA_HF_CLIENT_FEAT_CLI | \
58 BTA_HF_CLIENT_FEAT_VREC | \
59 BTA_HF_CLIENT_FEAT_VOL | \
60 BTA_HF_CLIENT_FEAT_ECS | \
61 BTA_HF_CLIENT_FEAT_ECC | \
62 BTA_HF_CLIENT_FEAT_CODEC)
Hemant Gupta3fe1b492014-04-29 16:23:59 +053063#endif
64
Hemant Gupta3fe1b492014-04-29 16:23:59 +053065/************************************************************************************
66** Local type definitions
67************************************************************************************/
68
69/************************************************************************************
70** Static variables
71************************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +053072static bthf_client_callbacks_t *bt_hf_client_callbacks = NULL;
73char btif_hf_client_version[PROPERTY_VALUE_MAX];
74static UINT32 btif_hf_client_features = 0;
Hemant Gupta3fe1b492014-04-29 16:23:59 +053075
Hemant Gupta10256872013-08-19 18:33:01 +053076
77#define CHECK_BTHF_CLIENT_INIT() if (bt_hf_client_callbacks == NULL)\
Hemant Gupta3fe1b492014-04-29 16:23:59 +053078 {\
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -070079 BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __FUNCTION__);\
Hemant Gupta3fe1b492014-04-29 16:23:59 +053080 return BT_STATUS_NOT_READY;\
81 }\
82 else\
83 {\
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -070084 BTIF_TRACE_EVENT("BTHF CLIENT: %s", __FUNCTION__);\
Hemant Gupta3fe1b492014-04-29 16:23:59 +053085 }
86
Hemant Gupta10256872013-08-19 18:33:01 +053087#define CHECK_BTHF_CLIENT_SLC_CONNECTED() if (bt_hf_client_callbacks == NULL)\
Hemant Gupta3fe1b492014-04-29 16:23:59 +053088 {\
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -070089 BTIF_TRACE_WARNING("BTHF CLIENT: %s: not initialized", __FUNCTION__);\
Hemant Gupta3fe1b492014-04-29 16:23:59 +053090 return BT_STATUS_NOT_READY;\
91 }\
Hemant Gupta10256872013-08-19 18:33:01 +053092 else if (btif_hf_client_cb.state != BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED)\
Hemant Gupta3fe1b492014-04-29 16:23:59 +053093 {\
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -070094 BTIF_TRACE_WARNING("BTHF CLIENT: %s: SLC connection not up. state=%s",\
Hemant Gupta10256872013-08-19 18:33:01 +053095 __FUNCTION__, \
96 dump_hf_conn_state(btif_hf_client_cb.state));\
Hemant Gupta3fe1b492014-04-29 16:23:59 +053097 return BT_STATUS_NOT_READY;\
98 }\
99 else\
100 {\
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700101 BTIF_TRACE_EVENT("BTHF CLIENT: %s", __FUNCTION__);\
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530102 }
103
104/* BTIF-HF control block to map bdaddr to BTA handle */
Hemant Gupta10256872013-08-19 18:33:01 +0530105typedef struct
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530106{
Hemant Gupta10256872013-08-19 18:33:01 +0530107 UINT16 handle;
108 bt_bdaddr_t connected_bda;
109 bthf_client_connection_state_t state;
110 bthf_client_vr_state_t vr_state;
111 tBTA_HF_CLIENT_PEER_FEAT peer_feat;
112 tBTA_HF_CLIENT_CHLD_FEAT chld_feat;
113} btif_hf_client_cb_t;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530114
Hemant Gupta10256872013-08-19 18:33:01 +0530115static btif_hf_client_cb_t btif_hf_client_cb;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530116
117
118/************************************************************************************
119** Static functions
120************************************************************************************/
121
Hemant Gupta10256872013-08-19 18:33:01 +0530122/*******************************************************************************
123**
124** Function btif_in_hf_client_generic_evt
125**
126** Description Processes generic events to be sent to JNI that are not triggered from the BTA.
127** Always runs in BTIF context
128**
129** Returns void
130**
131*******************************************************************************/
132static void btif_in_hf_client_generic_evt(UINT16 event, char *p_param)
133{
134 UNUSED(p_param);
135
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700136 BTIF_TRACE_EVENT("%s: event=%d", __FUNCTION__, event);
Hemant Gupta10256872013-08-19 18:33:01 +0530137 switch (event) {
138 case BTIF_HF_CLIENT_CB_AUDIO_CONNECTING:
139 {
140 HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_AUDIO_STATE_CONNECTING,
141 &btif_hf_client_cb.connected_bda);
142 } break;
143 default:
144 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700145 BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __FUNCTION__, event);
Hemant Gupta10256872013-08-19 18:33:01 +0530146 }
147 break;
148 }
149}
150
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530151/************************************************************************************
152** Externs
153************************************************************************************/
154
155/************************************************************************************
156** Functions
157************************************************************************************/
158
Hemant Gupta10256872013-08-19 18:33:01 +0530159static void clear_state(void)
160{
161 memset(&btif_hf_client_cb, 0, sizeof(btif_hf_client_cb_t));
162}
163
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530164static BOOLEAN is_connected(bt_bdaddr_t *bd_addr)
165{
Hemant Gupta10256872013-08-19 18:33:01 +0530166 if (((btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_CONNECTED) ||
167 (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED))&&
168 ((bd_addr == NULL) || (bdcmp(bd_addr->address, btif_hf_client_cb.connected_bda.address) == 0)))
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530169 return TRUE;
Hemant Gupta10256872013-08-19 18:33:01 +0530170 return FALSE;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530171}
172
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530173/*****************************************************************************
174** Section name (Group of functions)
175*****************************************************************************/
176
177/*****************************************************************************
178**
179** btif hf api functions (no context switch)
180**
181*****************************************************************************/
182
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530183/*******************************************************************************
184**
Hemant Gupta10256872013-08-19 18:33:01 +0530185** Function btif_hf_client_init
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530186**
187** Description initializes the hf interface
188**
189** Returns bt_status_t
190**
191*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530192static bt_status_t init( bthf_client_callbacks_t* callbacks )
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530193{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700194 BTIF_TRACE_EVENT("%s", __FUNCTION__);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530195
Hemant Gupta10256872013-08-19 18:33:01 +0530196 bt_hf_client_callbacks = callbacks;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530197
Hemant Gupta10256872013-08-19 18:33:01 +0530198 btif_enable_service(BTA_HFP_HS_SERVICE_ID);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530199
Hemant Gupta10256872013-08-19 18:33:01 +0530200 clear_state();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530201
202 return BT_STATUS_SUCCESS;
203}
204
205/*******************************************************************************
206**
207** Function connect
208**
Hemant Gupta10256872013-08-19 18:33:01 +0530209** Description connect to audio gateway
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530210**
211** Returns bt_status_t
212**
213*******************************************************************************/
Hemant Guptacc355592013-10-24 15:37:17 +0530214static bt_status_t connect_int( bt_bdaddr_t *bd_addr, uint16_t uuid )
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530215{
Hemant Gupta10256872013-08-19 18:33:01 +0530216 if (is_connected(bd_addr))
217 return BT_STATUS_BUSY;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530218
Hemant Gupta10256872013-08-19 18:33:01 +0530219 btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_CONNECTING;
220 bdcpy(btif_hf_client_cb.connected_bda.address, bd_addr->address);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530221
Hemant Gupta10256872013-08-19 18:33:01 +0530222 BTA_HfClientOpen(btif_hf_client_cb.handle, btif_hf_client_cb.connected_bda.address,
223 BTIF_HF_CLIENT_SECURITY);
224
225 return BT_STATUS_SUCCESS;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530226}
227
228static bt_status_t connect( bt_bdaddr_t *bd_addr )
229{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700230 BTIF_TRACE_EVENT("HFP Client version is %s", btif_hf_client_version);
Hemant Gupta10256872013-08-19 18:33:01 +0530231 CHECK_BTHF_CLIENT_INIT();
232 return btif_queue_connect(UUID_SERVCLASS_HF_HANDSFREE, bd_addr, connect_int);
233
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530234}
235
236/*******************************************************************************
237**
238** Function disconnect
239**
Hemant Gupta10256872013-08-19 18:33:01 +0530240** Description disconnect from audio gateway
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530241**
242** Returns bt_status_t
243**
244*******************************************************************************/
245static bt_status_t disconnect( bt_bdaddr_t *bd_addr )
246{
Hemant Gupta10256872013-08-19 18:33:01 +0530247 CHECK_BTHF_CLIENT_INIT();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530248
249 if (is_connected(bd_addr))
250 {
Hemant Gupta10256872013-08-19 18:33:01 +0530251 BTA_HfClientClose(btif_hf_client_cb.handle);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530252 return BT_STATUS_SUCCESS;
253 }
254
255 return BT_STATUS_FAIL;
256}
257
258/*******************************************************************************
259**
260** Function connect_audio
261**
262** Description create an audio connection
263**
264** Returns bt_status_t
265**
266*******************************************************************************/
267static bt_status_t connect_audio( bt_bdaddr_t *bd_addr )
268{
Hemant Gupta10256872013-08-19 18:33:01 +0530269 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530270
271 if (is_connected(bd_addr))
272 {
Hemant Gupta10256872013-08-19 18:33:01 +0530273 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_CODEC)
274 {
275 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BCC, 0, 0, NULL);
276 }
277 else
278 {
279 BTA_HfClientAudioOpen(btif_hf_client_cb.handle);
280 }
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530281
282 /* Inform the application that the audio connection has been initiated successfully */
Hemant Gupta10256872013-08-19 18:33:01 +0530283 btif_transfer_context(btif_in_hf_client_generic_evt, BTIF_HF_CLIENT_CB_AUDIO_CONNECTING,
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530284 (char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
285 return BT_STATUS_SUCCESS;
286 }
287
288 return BT_STATUS_FAIL;
289}
290
291/*******************************************************************************
292**
293** Function disconnect_audio
294**
295** Description close the audio connection
296**
297** Returns bt_status_t
298**
299*******************************************************************************/
300static bt_status_t disconnect_audio( bt_bdaddr_t *bd_addr )
301{
Hemant Gupta10256872013-08-19 18:33:01 +0530302 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530303
304 if (is_connected(bd_addr))
305 {
Hemant Gupta10256872013-08-19 18:33:01 +0530306 BTA_HfClientAudioClose(btif_hf_client_cb.handle);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530307 return BT_STATUS_SUCCESS;
308 }
309
310 return BT_STATUS_FAIL;
311}
312
313/*******************************************************************************
314**
315** Function start_voice_recognition
316**
317** Description start voice recognition
318**
319** Returns bt_status_t
320**
321*******************************************************************************/
322static bt_status_t start_voice_recognition()
323{
Hemant Gupta10256872013-08-19 18:33:01 +0530324 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530325
Hemant Gupta10256872013-08-19 18:33:01 +0530326 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC)
327 {
328 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BVRA, 1, 0, NULL);
329
330 return BT_STATUS_SUCCESS;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530331 }
332
Hemant Gupta10256872013-08-19 18:33:01 +0530333 return BT_STATUS_UNSUPPORTED;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530334}
335
336/*******************************************************************************
337**
338** Function stop_voice_recognition
339**
340** Description stop voice recognition
341**
342** Returns bt_status_t
343**
344*******************************************************************************/
345static bt_status_t stop_voice_recognition()
346{
Hemant Gupta10256872013-08-19 18:33:01 +0530347 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530348
Hemant Gupta10256872013-08-19 18:33:01 +0530349 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_VREC)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530350 {
Hemant Gupta10256872013-08-19 18:33:01 +0530351 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BVRA, 0, 0, NULL);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530352
Hemant Gupta10256872013-08-19 18:33:01 +0530353 return BT_STATUS_SUCCESS;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530354 }
355
Hemant Gupta10256872013-08-19 18:33:01 +0530356 return BT_STATUS_UNSUPPORTED;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530357}
358
359/*******************************************************************************
360**
361** Function volume_control
362**
363** Description volume control
364**
365** Returns bt_status_t
366**
367*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530368static bt_status_t volume_control(bthf_client_volume_type_t type, int volume)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530369{
Hemant Gupta10256872013-08-19 18:33:01 +0530370 BOOLEAN speaker;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530371
Hemant Gupta10256872013-08-19 18:33:01 +0530372 CHECK_BTHF_CLIENT_SLC_CONNECTED();
373
374 switch (type)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530375 {
Hemant Gupta10256872013-08-19 18:33:01 +0530376 case BTHF_CLIENT_VOLUME_TYPE_SPK:
377 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VGS, volume, 0, NULL);
378 break;
379 case BTHF_CLIENT_VOLUME_TYPE_MIC:
380 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VGM, volume, 0, NULL);
381 break;
382 default:
383 return BT_STATUS_UNSUPPORTED;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530384 }
385
386 return BT_STATUS_SUCCESS;
387}
388
389/*******************************************************************************
390**
Hemant Gupta10256872013-08-19 18:33:01 +0530391** Function dial
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530392**
Hemant Gupta10256872013-08-19 18:33:01 +0530393** Description place a call
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530394**
395** Returns bt_status_t
396**
397*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530398static bt_status_t dial(const char *number)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530399{
Hemant Gupta10256872013-08-19 18:33:01 +0530400 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530401
Hemant Gupta10256872013-08-19 18:33:01 +0530402 if (number)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530403 {
Hemant Gupta10256872013-08-19 18:33:01 +0530404 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATD, 0, 0, number);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530405 }
Hemant Gupta10256872013-08-19 18:33:01 +0530406 else
407 {
408 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BLDN, 0, 0, NULL);
409 }
410
411 return BT_STATUS_SUCCESS;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530412}
413
414/*******************************************************************************
415**
Hemant Gupta10256872013-08-19 18:33:01 +0530416** Function dial_memory
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530417**
Hemant Gupta10256872013-08-19 18:33:01 +0530418** Description place a call with number specified by location (speed dial)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530419**
420** Returns bt_status_t
421**
422*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530423static bt_status_t dial_memory(int location)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530424{
Hemant Gupta10256872013-08-19 18:33:01 +0530425 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530426
Hemant Gupta10256872013-08-19 18:33:01 +0530427 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATD, location, 0, NULL);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530428
Hemant Gupta10256872013-08-19 18:33:01 +0530429 return BT_STATUS_SUCCESS;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530430}
431
432/*******************************************************************************
433**
Hemant Gupta10256872013-08-19 18:33:01 +0530434** Function handle_call_action
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530435**
Hemant Gupta10256872013-08-19 18:33:01 +0530436** Description handle specified call related action
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530437**
438** Returns bt_status_t
439**
440*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530441static bt_status_t handle_call_action(bthf_client_call_action_t action, int idx)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530442{
Hemant Gupta10256872013-08-19 18:33:01 +0530443 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530444
Hemant Gupta10256872013-08-19 18:33:01 +0530445 switch (action)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530446 {
Hemant Gupta10256872013-08-19 18:33:01 +0530447 case BTHF_CLIENT_CALL_ACTION_CHLD_0:
448 if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_REL)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530449 {
Hemant Gupta10256872013-08-19 18:33:01 +0530450 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 0, 0, NULL);
451 break;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530452 }
Hemant Gupta10256872013-08-19 18:33:01 +0530453 return BT_STATUS_UNSUPPORTED;
454 case BTHF_CLIENT_CALL_ACTION_CHLD_1:
455 // CHLD 1 is mandatory for 3 way calling
456 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530457 {
Hemant Gupta10256872013-08-19 18:33:01 +0530458 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, 0, NULL);
459 break;
460 }
461 return BT_STATUS_UNSUPPORTED;
462 case BTHF_CLIENT_CALL_ACTION_CHLD_2:
463 // CHLD 2 is mandatory for 3 way calling
464 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_FEAT_3WAY)
465 {
466 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, 0, NULL);
467 break;
468 }
469 return BT_STATUS_UNSUPPORTED;
470 case BTHF_CLIENT_CALL_ACTION_CHLD_3:
471 if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_MERGE)
472 {
473 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 3, 0, NULL);
474 break;
475 }
476 return BT_STATUS_UNSUPPORTED;
477 case BTHF_CLIENT_CALL_ACTION_CHLD_4:
478 if (btif_hf_client_cb.chld_feat & BTA_HF_CLIENT_CHLD_MERGE_DETACH)
479 {
480 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 4, 0, NULL);
481 break;
482 }
483 return BT_STATUS_UNSUPPORTED;
484 case BTHF_CLIENT_CALL_ACTION_CHLD_1x:
485 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECC)
486 {
487 if (idx < 1)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530488 {
Hemant Gupta10256872013-08-19 18:33:01 +0530489 return BT_STATUS_FAIL;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530490 }
Hemant Gupta10256872013-08-19 18:33:01 +0530491 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 1, idx, NULL);
492 break;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530493 }
Hemant Gupta10256872013-08-19 18:33:01 +0530494 return BT_STATUS_UNSUPPORTED;
495 case BTHF_CLIENT_CALL_ACTION_CHLD_2x:
496 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECC)
497 {
498 if (idx < 1)
499 {
500 return BT_STATUS_FAIL;
501 }
502 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHLD, 2, idx, NULL);
503 break;
504 }
505 return BT_STATUS_UNSUPPORTED;
506 case BTHF_CLIENT_CALL_ACTION_ATA:
507 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_ATA, 0, 0, NULL);
508 break;
509 case BTHF_CLIENT_CALL_ACTION_CHUP:
510 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CHUP, 0, 0, NULL);
511 break;
512 case BTHF_CLIENT_CALL_ACTION_BTRH_0:
513 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 0, 0, NULL);
514 break;
515 case BTHF_CLIENT_CALL_ACTION_BTRH_1:
516 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 1, 0, NULL);
517 break;
518 case BTHF_CLIENT_CALL_ACTION_BTRH_2:
519 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BTRH, 2, 0, NULL);
520 break;
521 default:
522 return BT_STATUS_FAIL;
523
524 }
525
526 return BT_STATUS_SUCCESS;
527}
528
529/*******************************************************************************
530**
531** Function query_current_calls
532**
533** Description query list of current calls
534**
535** Returns bt_status_t
536**
537*******************************************************************************/
538static bt_status_t query_current_calls(void)
539{
540 CHECK_BTHF_CLIENT_SLC_CONNECTED();
541
542 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_ECS)
543 {
544 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CLCC, 0, 0, NULL);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530545
546 return BT_STATUS_SUCCESS;
547 }
548
Hemant Gupta10256872013-08-19 18:33:01 +0530549 return BT_STATUS_UNSUPPORTED;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530550}
551
552/*******************************************************************************
553**
Hemant Gupta10256872013-08-19 18:33:01 +0530554** Function query_current_operator_name
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530555**
Hemant Gupta10256872013-08-19 18:33:01 +0530556** Description query current selected operator name
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530557**
558** Returns bt_status_t
559**
560*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530561static bt_status_t query_current_operator_name(void)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530562{
Hemant Gupta10256872013-08-19 18:33:01 +0530563 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530564
Hemant Gupta10256872013-08-19 18:33:01 +0530565 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_COPS, 0, 0, NULL);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530566
Hemant Gupta10256872013-08-19 18:33:01 +0530567 return BT_STATUS_SUCCESS;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530568}
569
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530570/*******************************************************************************
571**
Hemant Gupta10256872013-08-19 18:33:01 +0530572** Function retieve_subscriber_info
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530573**
Hemant Gupta10256872013-08-19 18:33:01 +0530574** Description retrieve subscriber number information
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530575**
576** Returns bt_status_t
577**
578*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530579static bt_status_t retrieve_subscriber_info(void)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530580{
Hemant Gupta10256872013-08-19 18:33:01 +0530581 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530582
Hemant Gupta10256872013-08-19 18:33:01 +0530583 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_CNUM, 0, 0, NULL);
584
585 return BT_STATUS_SUCCESS;
586}
587
588/*******************************************************************************
589**
590** Function send_dtmf
591**
592** Description send dtmf
593**
594** Returns bt_status_t
595**
596*******************************************************************************/
597static bt_status_t send_dtmf(char code)
598{
599 CHECK_BTHF_CLIENT_SLC_CONNECTED();
600
601 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_VTS, code, 0, NULL);
602
603 return BT_STATUS_SUCCESS;
604}
605
606/*******************************************************************************
607**
608** Function request_last_voice_tag_number
609**
610** Description Request number from AG for VR purposes
611**
612** Returns bt_status_t
613**
614*******************************************************************************/
615static bt_status_t request_last_voice_tag_number(void)
616{
617 CHECK_BTHF_CLIENT_SLC_CONNECTED();
618
619 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_VTAG)
620 {
621 BTA_HfClientSendAT(btif_hf_client_cb.handle, BTA_HF_CLIENT_AT_CMD_BINP, 1, 0, NULL);
622
623 return BT_STATUS_SUCCESS;
624 }
625
626 return BT_STATUS_UNSUPPORTED;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530627}
628
629/*******************************************************************************
630**
631** Function cleanup
632**
633** Description Closes the HF interface
634**
635** Returns bt_status_t
636**
637*******************************************************************************/
638static void cleanup( void )
639{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700640 BTIF_TRACE_EVENT("%s", __FUNCTION__);
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530641
Hemant Gupta10256872013-08-19 18:33:01 +0530642 if (bt_hf_client_callbacks)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530643 {
Hemant Gupta10256872013-08-19 18:33:01 +0530644 btif_disable_service(BTA_HFP_HS_SERVICE_ID);
645 bt_hf_client_callbacks = NULL;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530646 }
647}
648
Hemant Gupta10256872013-08-19 18:33:01 +0530649/*******************************************************************************
650**
651** Function send_at_cmd
652**
653** Description Send requested AT command to rempte device.
654**
655** Returns bt_status_t
656**
657*******************************************************************************/
658static bt_status_t send_at_cmd(int cmd,int val1,int val2,const char *arg)
659{
660 CHECK_BTHF_CLIENT_SLC_CONNECTED();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700661 BTIF_TRACE_EVENT("%s Cmd %d val1 %d val2 %d arg %s",
Hemant Gupta10256872013-08-19 18:33:01 +0530662 __FUNCTION__,cmd,val1,val2,arg);
663 BTA_HfClientSendAT(btif_hf_client_cb.handle, cmd, val1, val2, arg);
664
665 return BT_STATUS_SUCCESS;
666}
667
668static const bthf_client_interface_t bthfClientInterface = {
669 sizeof(bthf_client_interface_t),
670 .init = init,
671 .connect = connect,
672 .disconnect = disconnect,
673 .connect_audio = connect_audio,
674 .disconnect_audio = disconnect_audio,
675 .start_voice_recognition = start_voice_recognition,
676 .stop_voice_recognition = stop_voice_recognition,
677 .volume_control = volume_control,
678 .dial = dial,
679 .dial_memory = dial_memory,
680 .handle_call_action = handle_call_action,
681 .query_current_calls = query_current_calls,
682 .query_current_operator_name = query_current_operator_name,
683 .retrieve_subscriber_info = retrieve_subscriber_info,
684 .send_dtmf = send_dtmf,
685 .request_last_voice_tag_number = request_last_voice_tag_number,
686 .cleanup = cleanup,
687 .send_at_cmd = send_at_cmd,
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530688};
689
Hemant Gupta10256872013-08-19 18:33:01 +0530690static void process_ind_evt(tBTA_HF_CLIENT_IND *ind)
691{
692 switch (ind->type)
693 {
694 case BTA_HF_CLIENT_IND_CALL:
695 HAL_CBACK(bt_hf_client_callbacks, call_cb, ind->value);
696 break;
697
698 case BTA_HF_CLIENT_IND_CALLSETUP:
699 HAL_CBACK(bt_hf_client_callbacks, callsetup_cb, ind->value);
700 break;
701 case BTA_HF_CLIENT_IND_CALLHELD:
702 HAL_CBACK(bt_hf_client_callbacks, callheld_cb, ind->value);
703 break;
704
705 case BTA_HF_CLIENT_IND_SERVICE:
706 HAL_CBACK(bt_hf_client_callbacks, network_state_cb, ind->value);
707 break;
708
709 case BTA_HF_CLIENT_IND_SIGNAL:
710 HAL_CBACK(bt_hf_client_callbacks, network_signal_cb, ind->value);
711 break;
712
713 case BTA_HF_CLIENT_IND_ROAM:
714 HAL_CBACK(bt_hf_client_callbacks, network_roaming_cb, ind->value);
715 break;
716
717 case BTA_HF_CLIENT_IND_BATTCH:
718 HAL_CBACK(bt_hf_client_callbacks, battery_level_cb, ind->value);
719 break;
720
721 default:
722 break;
723 }
724}
725
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530726/*******************************************************************************
727**
Hemant Gupta10256872013-08-19 18:33:01 +0530728** Function btif_hf_client_upstreams_evt
729**
730** Description Executes HF CLIENT UPSTREAMS events in btif context
731**
732** Returns void
733**
734*******************************************************************************/
735static void btif_hf_client_upstreams_evt(UINT16 event, char* p_param)
736{
737 tBTA_HF_CLIENT *p_data = (tBTA_HF_CLIENT *)p_param;
738 bdstr_t bdstr;
739
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700740 BTIF_TRACE_DEBUG("%s: event=%s (%u)", __FUNCTION__, dump_hf_client_event(event), event);
Hemant Gupta10256872013-08-19 18:33:01 +0530741
742 switch (event)
743 {
744 case BTA_HF_CLIENT_ENABLE_EVT:
745 case BTA_HF_CLIENT_DISABLE_EVT:
746 break;
747
748 case BTA_HF_CLIENT_REGISTER_EVT:
749 btif_hf_client_cb.handle = p_data->reg.handle;
750 break;
751
752 case BTA_HF_CLIENT_OPEN_EVT:
753 if (p_data->open.status == BTA_HF_CLIENT_SUCCESS)
754 {
755 bdcpy(btif_hf_client_cb.connected_bda.address, p_data->open.bd_addr);
756 btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_CONNECTED;
757 btif_hf_client_cb.peer_feat = 0;
758 btif_hf_client_cb.chld_feat = 0;
759 //clear_phone_state();
760 }
761 else if (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_CONNECTING)
762 {
763 btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED;
764 }
765 else
766 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700767 BTIF_TRACE_WARNING("%s: HF CLient open failed, but another device connected. status=%d state=%d connected device=%s",
Hemant Gupta10256872013-08-19 18:33:01 +0530768 __FUNCTION__, p_data->open.status, btif_hf_client_cb.state, bd2str(&btif_hf_client_cb.connected_bda, &bdstr));
769 break;
770 }
771
772 HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, btif_hf_client_cb.state,
773 0, 0, &btif_hf_client_cb.connected_bda);
774
775 if (btif_hf_client_cb.state == BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED)
776 bdsetany(btif_hf_client_cb.connected_bda.address);
777
778 if (p_data->open.status != BTA_HF_CLIENT_SUCCESS)
779 btif_queue_advance();
780 break;
781
782 case BTA_HF_CLIENT_CONN_EVT:
783 btif_hf_client_cb.peer_feat = p_data->conn.peer_feat;
784 btif_hf_client_cb.chld_feat = p_data->conn.chld_feat;
785 btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED;
786
787 HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, btif_hf_client_cb.state,
788 btif_hf_client_cb.peer_feat, btif_hf_client_cb.chld_feat,
789 &btif_hf_client_cb.connected_bda);
790
791 /* Inform the application about in-band ringtone */
792 if (btif_hf_client_cb.peer_feat & BTA_HF_CLIENT_PEER_INBAND)
793 {
794 HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED);
795 }
796
797 btif_queue_advance();
798 break;
799
800 case BTA_HF_CLIENT_CLOSE_EVT:
801 btif_hf_client_cb.state = BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED;
802 HAL_CBACK(bt_hf_client_callbacks, connection_state_cb, btif_hf_client_cb.state,
803 0, 0, &btif_hf_client_cb.connected_bda);
804 bdsetany(btif_hf_client_cb.connected_bda.address);
805 btif_hf_client_cb.peer_feat = 0;
806 btif_hf_client_cb.chld_feat = 0;
807 btif_queue_advance();
808 break;
809
810 case BTA_HF_CLIENT_IND_EVT:
811 process_ind_evt(&p_data->ind);
812 break;
813
814 case BTA_HF_CLIENT_MIC_EVT:
815 HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, BTHF_CLIENT_VOLUME_TYPE_MIC, p_data->val.value);
816 break;
817
818 case BTA_HF_CLIENT_SPK_EVT:
819 HAL_CBACK(bt_hf_client_callbacks, volume_change_cb, BTHF_CLIENT_VOLUME_TYPE_SPK, p_data->val.value);
820 break;
821
822 case BTA_HF_CLIENT_VOICE_REC_EVT:
823 HAL_CBACK(bt_hf_client_callbacks, vr_cmd_cb, p_data->val.value);
824 break;
825
826 case BTA_HF_CLIENT_OPERATOR_NAME_EVT:
827 HAL_CBACK(bt_hf_client_callbacks, current_operator_cb, p_data->operator.name);
828 break;
829
830 case BTA_HF_CLIENT_CLIP_EVT:
831 HAL_CBACK(bt_hf_client_callbacks, clip_cb, p_data->number.number);
832 break;
833
834 case BTA_HF_CLIENT_BINP_EVT:
835 HAL_CBACK(bt_hf_client_callbacks, last_voice_tag_number_callback, p_data->number.number);
836 break;
837
838 case BTA_HF_CLIENT_CCWA_EVT:
839 HAL_CBACK(bt_hf_client_callbacks, call_waiting_cb, p_data->number.number);
840 break;
841
842 case BTA_HF_CLIENT_AT_RESULT_EVT:
843 HAL_CBACK(bt_hf_client_callbacks, cmd_complete_cb, p_data->result.type, p_data->result.cme);
844 break;
845
846 case BTA_HF_CLIENT_CLCC_EVT:
847 HAL_CBACK(bt_hf_client_callbacks, current_calls_cb, p_data->clcc.idx,
848 p_data->clcc.inc ? BTHF_CLIENT_CALL_DIRECTION_INCOMING : BTHF_CLIENT_CALL_DIRECTION_OUTGOING,
849 p_data->clcc.status,
850 p_data->clcc.mpty ? BTHF_CLIENT_CALL_MPTY_TYPE_MULTI : BTHF_CLIENT_CALL_MPTY_TYPE_SINGLE,
851 p_data->clcc.number_present ? p_data->clcc.number : NULL);
852 break;
853
854 case BTA_HF_CLIENT_CNUM_EVT:
855 if (p_data->cnum.service == 4)
856 {
857 HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_VOICE);
858 }
859 else if (p_data->cnum.service == 5)
860 {
861 HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_FAX);
862 }
863 else
864 {
865 HAL_CBACK(bt_hf_client_callbacks, subscriber_info_cb, p_data->cnum.number, BTHF_CLIENT_SERVICE_UNKNOWN);
866 }
867 break;
868
869 case BTA_HF_CLIENT_BTRH_EVT:
870 if (p_data->val.value <= BTRH_CLIENT_RESP_AND_HOLD_REJECT)
871 {
872 HAL_CBACK(bt_hf_client_callbacks, resp_and_hold_cb, p_data->val.value);
873 }
874 break;
875
876 case BTA_HF_CLIENT_BSIR_EVT:
877 if (p_data->val.value != 0)
878 {
879 HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED);
880 }
881 else
882 {
883 HAL_CBACK(bt_hf_client_callbacks, in_band_ring_tone_cb, BTHF_CLIENT_IN_BAND_RINGTONE_NOT_PROVIDED);
884 }
885 break;
886
887 case BTA_HF_CLIENT_AUDIO_OPEN_EVT:
888 HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_CONNECTED, &btif_hf_client_cb.connected_bda);
889 break;
890
891 case BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT:
892 HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_CONNECTED_MSBC, &btif_hf_client_cb.connected_bda);
893 break;
894
895 case BTA_HF_CLIENT_AUDIO_CLOSE_EVT:
896 HAL_CBACK(bt_hf_client_callbacks, audio_state_cb, BTHF_CLIENT_AUDIO_STATE_DISCONNECTED, &btif_hf_client_cb.connected_bda);
897 break;
898 case BTA_HF_CLIENT_RING_INDICATION:
899 HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb);
900 break;
901 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700902 BTIF_TRACE_WARNING("%s: Unhandled event: %d", __FUNCTION__, event);
Hemant Gupta10256872013-08-19 18:33:01 +0530903 break;
904 }
905}
906
907/*******************************************************************************
908**
909** Function bte_hf_client_evt
910**
911** Description Switches context from BTE to BTIF for all HF Client events
912**
913** Returns void
914**
915*******************************************************************************/
916
917static void bte_hf_client_evt(tBTA_HF_CLIENT_EVT event, tBTA_HF_CLIENT *p_data)
918{
919 bt_status_t status;
920
921 /* switch context to btif task context (copy full union size for convenience) */
922 status = btif_transfer_context(btif_hf_client_upstreams_evt, (uint16_t)event, (void*)p_data, sizeof(*p_data), NULL);
923
924 /* catch any failed context transfers */
925 ASSERTC(status == BT_STATUS_SUCCESS, "context transfer failed", status);
926}
927
928/*******************************************************************************
929**
930** Function btif_hf_client_execute_service
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530931**
932** Description Initializes/Shuts down the service
933**
934** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
935**
936*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530937bt_status_t btif_hf_client_execute_service(BOOLEAN b_enable)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530938{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700939 BTIF_TRACE_EVENT("%s enable:%d", __FUNCTION__, b_enable);
Hemant Gupta10256872013-08-19 18:33:01 +0530940
941 property_get("ro.bluetooth.hfp.ver", btif_hf_client_version, "1.5");
942
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530943 if (b_enable)
944 {
Hemant Gupta10256872013-08-19 18:33:01 +0530945 /* Enable and register with BTA-HFClient */
946 BTA_HfClientEnable(bte_hf_client_evt);
947 if (strcmp(btif_hf_client_version, "1.6") == 0)
948 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700949 BTIF_TRACE_EVENT("Support Codec Nego. %d ", BTIF_HF_CLIENT_FEATURES);
Hemant Gupta10256872013-08-19 18:33:01 +0530950 BTA_HfClientRegister(BTIF_HF_CLIENT_SECURITY, BTIF_HF_CLIENT_FEATURES,
951 BTIF_HF_CLIENT_SERVICE_NAME);
952 }
953 else
954 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700955 BTIF_TRACE_EVENT("No Codec Nego Supported");
Hemant Gupta10256872013-08-19 18:33:01 +0530956 btif_hf_client_features = BTIF_HF_CLIENT_FEATURES;
957 btif_hf_client_features = btif_hf_client_features & (~BTA_HF_CLIENT_FEAT_CODEC);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700958 BTIF_TRACE_EVENT("btif_hf_client_features is %d", btif_hf_client_features);
Hemant Gupta10256872013-08-19 18:33:01 +0530959 BTA_HfClientRegister(BTIF_HF_CLIENT_SECURITY, btif_hf_client_features,
960 BTIF_HF_CLIENT_SERVICE_NAME);
961 }
962
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530963 }
Hemant Gupta10256872013-08-19 18:33:01 +0530964 else
965 {
966 BTA_HfClientDeregister(btif_hf_client_cb.handle);
967 BTA_HfClientDisable();
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530968 }
969 return BT_STATUS_SUCCESS;
970}
971
972/*******************************************************************************
973**
974** Function btif_hf_get_interface
975**
976** Description Get the hf callback interface
977**
978** Returns bthf_interface_t
979**
980*******************************************************************************/
Hemant Gupta10256872013-08-19 18:33:01 +0530981const bthf_client_interface_t *btif_hf_client_get_interface(void)
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530982{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700983 BTIF_TRACE_EVENT("%s", __FUNCTION__);
Hemant Gupta10256872013-08-19 18:33:01 +0530984 return &bthfClientInterface;
Hemant Gupta3fe1b492014-04-29 16:23:59 +0530985}