Loading system/binder/android/bluetooth/IBluetoothHeadsetClient.aidl +1 −0 Original line number Original line Diff line number Diff line Loading @@ -59,6 +59,7 @@ interface IBluetoothHeadsetClient { boolean disconnectAudio(in BluetoothDevice device); boolean disconnectAudio(in BluetoothDevice device); void setAudioRouteAllowed(in BluetoothDevice device, boolean allowed); void setAudioRouteAllowed(in BluetoothDevice device, boolean allowed); boolean getAudioRouteAllowed(in BluetoothDevice device); boolean getAudioRouteAllowed(in BluetoothDevice device); boolean sendVendorAtCommand(in BluetoothDevice device, int vendorId, String atCommand); Bundle getCurrentAgFeatures(in BluetoothDevice device); Bundle getCurrentAgFeatures(in BluetoothDevice device); } } system/bta/hf_client/bta_hf_client_at.cc +66 −4 Original line number Original line Diff line number Diff line Loading @@ -724,9 +724,7 @@ void bta_hf_client_clcc(tBTA_HF_CLIENT_CB* client_cb, uint32_t idx, ******************************************************************************/ ******************************************************************************/ void bta_hf_client_cnum(tBTA_HF_CLIENT_CB* client_cb, char* number, void bta_hf_client_cnum(tBTA_HF_CLIENT_CB* client_cb, char* number, uint16_t service) { uint16_t service) { tBTA_HF_CLIENT evt; tBTA_HF_CLIENT evt = {}; memset(&evt, 0, sizeof(evt)); evt.cnum.service = service; evt.cnum.service = service; strlcpy(evt.cnum.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1); strlcpy(evt.cnum.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1); Loading @@ -736,6 +734,18 @@ void bta_hf_client_cnum(tBTA_HF_CLIENT_CB* client_cb, char* number, bta_hf_client_app_callback(BTA_HF_CLIENT_CNUM_EVT, &evt); bta_hf_client_app_callback(BTA_HF_CLIENT_CNUM_EVT, &evt); } } void bta_hf_client_unknown_response(tBTA_HF_CLIENT_CB* client_cb, const char* evt_buffer) { tBTA_HF_CLIENT evt = {}; strlcpy(evt.unknown.event_string, evt_buffer, BTA_HF_CLIENT_UNKOWN_EVENT_LEN + 1); evt.unknown.event_string[BTA_HF_CLIENT_UNKOWN_EVENT_LEN] = '\0'; evt.unknown.bd_addr = client_cb->peer_addr; bta_hf_client_app_callback(BTA_HF_CLIENT_UNKNOWN_EVT, &evt); } /******************************************************************************* /******************************************************************************* * * * Function bta_hf_client_binp * Function bta_hf_client_binp Loading Loading @@ -1436,6 +1446,36 @@ static char* bta_hf_client_skip_unknown(tBTA_HF_CLIENT_CB* client_cb, return buffer; return buffer; } } static char* bta_hf_client_process_unknown(tBTA_HF_CLIENT_CB* client_cb, char* buffer) { char* start = strstr(buffer, "\r\n"); if (start == NULL) { return NULL; } start += sizeof("\r\n") - 1; char* end = strstr(start, "\r\n"); if (end == NULL) { return NULL; } int evt_size = end - start + 1; char tmp_buf[BTA_HF_CLIENT_UNKOWN_EVENT_LEN]; if (evt_size < BTA_HF_CLIENT_UNKOWN_EVENT_LEN) { strlcpy(tmp_buf, start, evt_size); bta_hf_client_unknown_response(client_cb, tmp_buf); AT_CHECK_RN(end); } else { APPL_TRACE_ERROR("%s: exceed event buffer size. (%d, %d)", __func__, evt_size, BTA_HF_CLIENT_UNKOWN_EVENT_LEN); } APPL_TRACE_DEBUG("%s: %s", __func__, buffer); return end; } /****************************************************************************** /****************************************************************************** * SUPPORTED EVENT MESSAGES * SUPPORTED EVENT MESSAGES ******************************************************************************/ ******************************************************************************/ Loading @@ -1461,7 +1501,7 @@ static const tBTA_HF_CLIENT_PARSER_CALLBACK bta_hf_client_parser_cb[] = { bta_hf_client_parse_cnum, bta_hf_client_parse_btrh, bta_hf_client_parse_cnum, bta_hf_client_parse_btrh, bta_hf_client_parse_busy, bta_hf_client_parse_delayed, bta_hf_client_parse_busy, bta_hf_client_parse_delayed, bta_hf_client_parse_no_carrier, bta_hf_client_parse_no_answer, bta_hf_client_parse_no_carrier, bta_hf_client_parse_no_answer, bta_hf_client_parse_blacklisted, bta_hf_client_skip_unknown}; bta_hf_client_parse_blacklisted, bta_hf_client_process_unknown}; /* calculate supported event list length */ /* calculate supported event list length */ static const uint16_t bta_hf_client_parser_cb_count = static const uint16_t bta_hf_client_parser_cb_count = Loading Loading @@ -1996,6 +2036,25 @@ void bta_hf_client_send_at_bia(tBTA_HF_CLIENT_CB* client_cb) { bta_hf_client_send_at(client_cb, BTA_HF_CLIENT_AT_BIA, buf, at_len); bta_hf_client_send_at(client_cb, BTA_HF_CLIENT_AT_BIA, buf, at_len); } } void bta_hf_client_send_at_vendor_specific_cmd(tBTA_HF_CLIENT_CB* client_cb, const char* str) { char buf[BTA_HF_CLIENT_AT_MAX_LEN]; APPL_TRACE_DEBUG("%s", __func__); int at_len = snprintf(buf, sizeof(buf), "AT%s", str); if (at_len < 1) { APPL_TRACE_ERROR("%s: AT command Framing error", __func__); return; } buf[at_len - 1] = '\r'; bta_hf_client_send_at(client_cb, BTA_HF_CLIENT_AT_VENDOR_SPECIFIC, buf, at_len); } void bta_hf_client_at_init(tBTA_HF_CLIENT_CB* client_cb) { void bta_hf_client_at_init(tBTA_HF_CLIENT_CB* client_cb) { alarm_free(client_cb->at_cb.resp_timer); alarm_free(client_cb->at_cb.resp_timer); alarm_free(client_cb->at_cb.hold_timer); alarm_free(client_cb->at_cb.hold_timer); Loading Loading @@ -2087,6 +2146,9 @@ void bta_hf_client_send_at_cmd(tBTA_HF_CLIENT_DATA* p_data) { case BTA_HF_CLIENT_AT_CMD_NREC: case BTA_HF_CLIENT_AT_CMD_NREC: bta_hf_client_send_at_nrec(client_cb); bta_hf_client_send_at_nrec(client_cb); break; break; case BTA_HF_CLIENT_AT_CMD_VENDOR_SPECIFIC_CMD: bta_hf_client_send_at_vendor_specific_cmd(client_cb, p_val->str); break; default: default: APPL_TRACE_ERROR("Default case"); APPL_TRACE_ERROR("Default case"); snprintf(buf, BTA_HF_CLIENT_AT_MAX_LEN, snprintf(buf, BTA_HF_CLIENT_AT_MAX_LEN, Loading system/bta/hf_client/bta_hf_client_int.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -97,6 +97,7 @@ enum { BTA_HF_CLIENT_AT_CNUM, BTA_HF_CLIENT_AT_CNUM, BTA_HF_CLIENT_AT_NREC, BTA_HF_CLIENT_AT_NREC, BTA_HF_CLIENT_AT_BINP, BTA_HF_CLIENT_AT_BINP, BTA_HF_CLIENT_AT_VENDOR_SPECIFIC, }; }; /***************************************************************************** /***************************************************************************** Loading system/bta/include/bta_hf_client_api.h +12 −0 Original line number Original line Diff line number Diff line Loading @@ -119,6 +119,9 @@ typedef uint8_t tBTA_HF_CLIENT_AT_RESULT_TYPE; */ */ #define BTA_HF_CLIENT_BINP_EVT 20 /* binp number event */ #define BTA_HF_CLIENT_BINP_EVT 20 /* binp number event */ #define BTA_HF_CLIENT_RING_INDICATION 21 /* HF Client ring indication */ #define BTA_HF_CLIENT_RING_INDICATION 21 /* HF Client ring indication */ #define BTA_HF_CLIENT_UNKNOWN_EVT 22 /* Unknown or vendor specific Event */ #define BTA_HF_CLIENT_DISABLE_EVT 30 /* HF Client disabled */ #define BTA_HF_CLIENT_DISABLE_EVT 30 /* HF Client disabled */ typedef uint8_t tBTA_HF_CLIENT_EVT; typedef uint8_t tBTA_HF_CLIENT_EVT; Loading Loading @@ -159,6 +162,7 @@ typedef uint8_t tBTA_HF_CLIENT_IND_TYPE; #define BTA_HF_CLIENT_AT_CMD_BINP 13 #define BTA_HF_CLIENT_AT_CMD_BINP 13 #define BTA_HF_CLIENT_AT_CMD_BLDN 14 #define BTA_HF_CLIENT_AT_CMD_BLDN 14 #define BTA_HF_CLIENT_AT_CMD_NREC 15 #define BTA_HF_CLIENT_AT_CMD_NREC 15 #define BTA_HF_CLIENT_AT_CMD_VENDOR_SPECIFIC_CMD 16 typedef uint8_t tBTA_HF_CLIENT_AT_CMD_TYPE; typedef uint8_t tBTA_HF_CLIENT_AT_CMD_TYPE; Loading Loading @@ -234,6 +238,13 @@ typedef struct { uint16_t value; uint16_t value; } tBTA_HF_CLIENT_VAL; } tBTA_HF_CLIENT_VAL; /* data associated with BTA_HF_CLIENT_UNKNOWN_EVT event */ #define BTA_HF_CLIENT_UNKOWN_EVENT_LEN 32 typedef struct { RawAddress bd_addr; char event_string[BTA_HF_CLIENT_UNKOWN_EVENT_LEN + 1]; } tBTA_HF_CLIENT_UNKNOWN; /* union of data associated with AG callback */ /* union of data associated with AG callback */ typedef union { typedef union { // Common BD ADDR field for all tyepdefs // Common BD ADDR field for all tyepdefs Loading @@ -248,6 +259,7 @@ typedef union { tBTA_HF_CLIENT_AT_RESULT result; tBTA_HF_CLIENT_AT_RESULT result; tBTA_HF_CLIENT_CLCC clcc; tBTA_HF_CLIENT_CLCC clcc; tBTA_HF_CLIENT_CNUM cnum; tBTA_HF_CLIENT_CNUM cnum; tBTA_HF_CLIENT_UNKNOWN unknown; } tBTA_HF_CLIENT; } tBTA_HF_CLIENT; typedef uint32_t tBTA_HF_CLIENT_FEAT; typedef uint32_t tBTA_HF_CLIENT_FEAT; Loading system/btif/src/btif_hf_client.cc +4 −0 Original line number Original line Diff line number Diff line Loading @@ -999,6 +999,10 @@ static void btif_hf_client_upstreams_evt(uint16_t event, char* p_param) { case BTA_HF_CLIENT_RING_INDICATION: case BTA_HF_CLIENT_RING_INDICATION: HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb, &cb->peer_bda); HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb, &cb->peer_bda); break; break; case BTA_HF_CLIENT_UNKNOWN_EVT: HAL_CBACK(bt_hf_client_callbacks, unknown_event_cb, &cb->peer_bda, p_data->unknown.event_string); break; default: default: BTIF_TRACE_WARNING("%s: Unhandled event: %d", __func__, event); BTIF_TRACE_WARNING("%s: Unhandled event: %d", __func__, event); break; break; Loading Loading
system/binder/android/bluetooth/IBluetoothHeadsetClient.aidl +1 −0 Original line number Original line Diff line number Diff line Loading @@ -59,6 +59,7 @@ interface IBluetoothHeadsetClient { boolean disconnectAudio(in BluetoothDevice device); boolean disconnectAudio(in BluetoothDevice device); void setAudioRouteAllowed(in BluetoothDevice device, boolean allowed); void setAudioRouteAllowed(in BluetoothDevice device, boolean allowed); boolean getAudioRouteAllowed(in BluetoothDevice device); boolean getAudioRouteAllowed(in BluetoothDevice device); boolean sendVendorAtCommand(in BluetoothDevice device, int vendorId, String atCommand); Bundle getCurrentAgFeatures(in BluetoothDevice device); Bundle getCurrentAgFeatures(in BluetoothDevice device); } }
system/bta/hf_client/bta_hf_client_at.cc +66 −4 Original line number Original line Diff line number Diff line Loading @@ -724,9 +724,7 @@ void bta_hf_client_clcc(tBTA_HF_CLIENT_CB* client_cb, uint32_t idx, ******************************************************************************/ ******************************************************************************/ void bta_hf_client_cnum(tBTA_HF_CLIENT_CB* client_cb, char* number, void bta_hf_client_cnum(tBTA_HF_CLIENT_CB* client_cb, char* number, uint16_t service) { uint16_t service) { tBTA_HF_CLIENT evt; tBTA_HF_CLIENT evt = {}; memset(&evt, 0, sizeof(evt)); evt.cnum.service = service; evt.cnum.service = service; strlcpy(evt.cnum.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1); strlcpy(evt.cnum.number, number, BTA_HF_CLIENT_NUMBER_LEN + 1); Loading @@ -736,6 +734,18 @@ void bta_hf_client_cnum(tBTA_HF_CLIENT_CB* client_cb, char* number, bta_hf_client_app_callback(BTA_HF_CLIENT_CNUM_EVT, &evt); bta_hf_client_app_callback(BTA_HF_CLIENT_CNUM_EVT, &evt); } } void bta_hf_client_unknown_response(tBTA_HF_CLIENT_CB* client_cb, const char* evt_buffer) { tBTA_HF_CLIENT evt = {}; strlcpy(evt.unknown.event_string, evt_buffer, BTA_HF_CLIENT_UNKOWN_EVENT_LEN + 1); evt.unknown.event_string[BTA_HF_CLIENT_UNKOWN_EVENT_LEN] = '\0'; evt.unknown.bd_addr = client_cb->peer_addr; bta_hf_client_app_callback(BTA_HF_CLIENT_UNKNOWN_EVT, &evt); } /******************************************************************************* /******************************************************************************* * * * Function bta_hf_client_binp * Function bta_hf_client_binp Loading Loading @@ -1436,6 +1446,36 @@ static char* bta_hf_client_skip_unknown(tBTA_HF_CLIENT_CB* client_cb, return buffer; return buffer; } } static char* bta_hf_client_process_unknown(tBTA_HF_CLIENT_CB* client_cb, char* buffer) { char* start = strstr(buffer, "\r\n"); if (start == NULL) { return NULL; } start += sizeof("\r\n") - 1; char* end = strstr(start, "\r\n"); if (end == NULL) { return NULL; } int evt_size = end - start + 1; char tmp_buf[BTA_HF_CLIENT_UNKOWN_EVENT_LEN]; if (evt_size < BTA_HF_CLIENT_UNKOWN_EVENT_LEN) { strlcpy(tmp_buf, start, evt_size); bta_hf_client_unknown_response(client_cb, tmp_buf); AT_CHECK_RN(end); } else { APPL_TRACE_ERROR("%s: exceed event buffer size. (%d, %d)", __func__, evt_size, BTA_HF_CLIENT_UNKOWN_EVENT_LEN); } APPL_TRACE_DEBUG("%s: %s", __func__, buffer); return end; } /****************************************************************************** /****************************************************************************** * SUPPORTED EVENT MESSAGES * SUPPORTED EVENT MESSAGES ******************************************************************************/ ******************************************************************************/ Loading @@ -1461,7 +1501,7 @@ static const tBTA_HF_CLIENT_PARSER_CALLBACK bta_hf_client_parser_cb[] = { bta_hf_client_parse_cnum, bta_hf_client_parse_btrh, bta_hf_client_parse_cnum, bta_hf_client_parse_btrh, bta_hf_client_parse_busy, bta_hf_client_parse_delayed, bta_hf_client_parse_busy, bta_hf_client_parse_delayed, bta_hf_client_parse_no_carrier, bta_hf_client_parse_no_answer, bta_hf_client_parse_no_carrier, bta_hf_client_parse_no_answer, bta_hf_client_parse_blacklisted, bta_hf_client_skip_unknown}; bta_hf_client_parse_blacklisted, bta_hf_client_process_unknown}; /* calculate supported event list length */ /* calculate supported event list length */ static const uint16_t bta_hf_client_parser_cb_count = static const uint16_t bta_hf_client_parser_cb_count = Loading Loading @@ -1996,6 +2036,25 @@ void bta_hf_client_send_at_bia(tBTA_HF_CLIENT_CB* client_cb) { bta_hf_client_send_at(client_cb, BTA_HF_CLIENT_AT_BIA, buf, at_len); bta_hf_client_send_at(client_cb, BTA_HF_CLIENT_AT_BIA, buf, at_len); } } void bta_hf_client_send_at_vendor_specific_cmd(tBTA_HF_CLIENT_CB* client_cb, const char* str) { char buf[BTA_HF_CLIENT_AT_MAX_LEN]; APPL_TRACE_DEBUG("%s", __func__); int at_len = snprintf(buf, sizeof(buf), "AT%s", str); if (at_len < 1) { APPL_TRACE_ERROR("%s: AT command Framing error", __func__); return; } buf[at_len - 1] = '\r'; bta_hf_client_send_at(client_cb, BTA_HF_CLIENT_AT_VENDOR_SPECIFIC, buf, at_len); } void bta_hf_client_at_init(tBTA_HF_CLIENT_CB* client_cb) { void bta_hf_client_at_init(tBTA_HF_CLIENT_CB* client_cb) { alarm_free(client_cb->at_cb.resp_timer); alarm_free(client_cb->at_cb.resp_timer); alarm_free(client_cb->at_cb.hold_timer); alarm_free(client_cb->at_cb.hold_timer); Loading Loading @@ -2087,6 +2146,9 @@ void bta_hf_client_send_at_cmd(tBTA_HF_CLIENT_DATA* p_data) { case BTA_HF_CLIENT_AT_CMD_NREC: case BTA_HF_CLIENT_AT_CMD_NREC: bta_hf_client_send_at_nrec(client_cb); bta_hf_client_send_at_nrec(client_cb); break; break; case BTA_HF_CLIENT_AT_CMD_VENDOR_SPECIFIC_CMD: bta_hf_client_send_at_vendor_specific_cmd(client_cb, p_val->str); break; default: default: APPL_TRACE_ERROR("Default case"); APPL_TRACE_ERROR("Default case"); snprintf(buf, BTA_HF_CLIENT_AT_MAX_LEN, snprintf(buf, BTA_HF_CLIENT_AT_MAX_LEN, Loading
system/bta/hf_client/bta_hf_client_int.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -97,6 +97,7 @@ enum { BTA_HF_CLIENT_AT_CNUM, BTA_HF_CLIENT_AT_CNUM, BTA_HF_CLIENT_AT_NREC, BTA_HF_CLIENT_AT_NREC, BTA_HF_CLIENT_AT_BINP, BTA_HF_CLIENT_AT_BINP, BTA_HF_CLIENT_AT_VENDOR_SPECIFIC, }; }; /***************************************************************************** /***************************************************************************** Loading
system/bta/include/bta_hf_client_api.h +12 −0 Original line number Original line Diff line number Diff line Loading @@ -119,6 +119,9 @@ typedef uint8_t tBTA_HF_CLIENT_AT_RESULT_TYPE; */ */ #define BTA_HF_CLIENT_BINP_EVT 20 /* binp number event */ #define BTA_HF_CLIENT_BINP_EVT 20 /* binp number event */ #define BTA_HF_CLIENT_RING_INDICATION 21 /* HF Client ring indication */ #define BTA_HF_CLIENT_RING_INDICATION 21 /* HF Client ring indication */ #define BTA_HF_CLIENT_UNKNOWN_EVT 22 /* Unknown or vendor specific Event */ #define BTA_HF_CLIENT_DISABLE_EVT 30 /* HF Client disabled */ #define BTA_HF_CLIENT_DISABLE_EVT 30 /* HF Client disabled */ typedef uint8_t tBTA_HF_CLIENT_EVT; typedef uint8_t tBTA_HF_CLIENT_EVT; Loading Loading @@ -159,6 +162,7 @@ typedef uint8_t tBTA_HF_CLIENT_IND_TYPE; #define BTA_HF_CLIENT_AT_CMD_BINP 13 #define BTA_HF_CLIENT_AT_CMD_BINP 13 #define BTA_HF_CLIENT_AT_CMD_BLDN 14 #define BTA_HF_CLIENT_AT_CMD_BLDN 14 #define BTA_HF_CLIENT_AT_CMD_NREC 15 #define BTA_HF_CLIENT_AT_CMD_NREC 15 #define BTA_HF_CLIENT_AT_CMD_VENDOR_SPECIFIC_CMD 16 typedef uint8_t tBTA_HF_CLIENT_AT_CMD_TYPE; typedef uint8_t tBTA_HF_CLIENT_AT_CMD_TYPE; Loading Loading @@ -234,6 +238,13 @@ typedef struct { uint16_t value; uint16_t value; } tBTA_HF_CLIENT_VAL; } tBTA_HF_CLIENT_VAL; /* data associated with BTA_HF_CLIENT_UNKNOWN_EVT event */ #define BTA_HF_CLIENT_UNKOWN_EVENT_LEN 32 typedef struct { RawAddress bd_addr; char event_string[BTA_HF_CLIENT_UNKOWN_EVENT_LEN + 1]; } tBTA_HF_CLIENT_UNKNOWN; /* union of data associated with AG callback */ /* union of data associated with AG callback */ typedef union { typedef union { // Common BD ADDR field for all tyepdefs // Common BD ADDR field for all tyepdefs Loading @@ -248,6 +259,7 @@ typedef union { tBTA_HF_CLIENT_AT_RESULT result; tBTA_HF_CLIENT_AT_RESULT result; tBTA_HF_CLIENT_CLCC clcc; tBTA_HF_CLIENT_CLCC clcc; tBTA_HF_CLIENT_CNUM cnum; tBTA_HF_CLIENT_CNUM cnum; tBTA_HF_CLIENT_UNKNOWN unknown; } tBTA_HF_CLIENT; } tBTA_HF_CLIENT; typedef uint32_t tBTA_HF_CLIENT_FEAT; typedef uint32_t tBTA_HF_CLIENT_FEAT; Loading
system/btif/src/btif_hf_client.cc +4 −0 Original line number Original line Diff line number Diff line Loading @@ -999,6 +999,10 @@ static void btif_hf_client_upstreams_evt(uint16_t event, char* p_param) { case BTA_HF_CLIENT_RING_INDICATION: case BTA_HF_CLIENT_RING_INDICATION: HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb, &cb->peer_bda); HAL_CBACK(bt_hf_client_callbacks, ring_indication_cb, &cb->peer_bda); break; break; case BTA_HF_CLIENT_UNKNOWN_EVT: HAL_CBACK(bt_hf_client_callbacks, unknown_event_cb, &cb->peer_bda, p_data->unknown.event_string); break; default: default: BTIF_TRACE_WARNING("%s: Unhandled event: %d", __func__, event); BTIF_TRACE_WARNING("%s: Unhandled event: %d", __func__, event); break; break; Loading