1c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski/****************************************************************************** 2c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * 3c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * Copyright (C) 2016 The Android Open Source Project 4c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * 5c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * Licensed under the Apache License, Version 2.0 (the "License"); 6c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * you may not use this file except in compliance with the License. 7c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * You may obtain a copy of the License at: 8c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * 9c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * http://www.apache.org/licenses/LICENSE-2.0 10c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * 11c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * Unless required by applicable law or agreed to in writing, software 12c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * distributed under the License is distributed on an "AS IS" BASIS, 13c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * See the License for the specific language governing permissions and 15c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * limitations under the License. 16c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski * 17c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ******************************************************************************/ 18c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 19c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#define LOG_TAG "bt_btif_scanner" 20c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 21c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <base/bind.h> 22c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <base/threading/thread.h> 23c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <errno.h> 24c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <hardware/bluetooth.h> 25c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <stdio.h> 26c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <stdlib.h> 27c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <string.h> 28c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <unordered_set> 29c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "device/include/controller.h" 30c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 31c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "btif_common.h" 32c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "btif_util.h" 33c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 34c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <hardware/bt_gatt.h> 35c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 36103b2c44d3db6172a2dc9319e215eeece504316eJakub Pawlowski#include "advertise_data_parser.h" 37c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "bta_api.h" 3883f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski#include "bta_closure_api.h" 39c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "bta_gatt_api.h" 40c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "btif_config.h" 41c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "btif_dm.h" 42c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "btif_gatt.h" 43c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "btif_gatt_util.h" 44c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "btif_storage.h" 45c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "osi/include/log.h" 46c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "vendor_api.h" 47c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 48c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing base::Bind; 49c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing base::Owned; 50c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing std::vector; 5183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowskiusing RegisterCallback = BleScannerInterface::RegisterCallback; 52c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 53c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiextern const btgatt_callbacks_t* bt_gatt_callbacks; 54c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 559008888d24407541aa383aa4bd363a40abbf954bMyles Watson#define SCAN_CBACK_IN_JNI(P_CBACK, ...) \ 569008888d24407541aa383aa4bd363a40abbf954bMyles Watson do { \ 579008888d24407541aa383aa4bd363a40abbf954bMyles Watson if (bt_gatt_callbacks && bt_gatt_callbacks->scanner->P_CBACK) { \ 589008888d24407541aa383aa4bd363a40abbf954bMyles Watson BTIF_TRACE_API("HAL bt_gatt_callbacks->client->%s", #P_CBACK); \ 599008888d24407541aa383aa4bd363a40abbf954bMyles Watson do_in_jni_thread( \ 609008888d24407541aa383aa4bd363a40abbf954bMyles Watson Bind(bt_gatt_callbacks->scanner->P_CBACK, __VA_ARGS__)); \ 619008888d24407541aa383aa4bd363a40abbf954bMyles Watson } else { \ 629008888d24407541aa383aa4bd363a40abbf954bMyles Watson ASSERTC(0, "Callback is NULL", 0); \ 639008888d24407541aa383aa4bd363a40abbf954bMyles Watson } \ 64c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } while (0) 65c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 66c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace { 67c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 68eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski// all access to this variable should be done on the jni thread 693c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavovstd::set<RawAddress> remote_bdaddr_cache; 703c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavovstd::queue<RawAddress> remote_bdaddr_cache_ordered; 713c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavovconst size_t remote_bdaddr_cache_max_size = 1024; 72c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 739e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid btif_gattc_add_remote_bdaddr(const RawAddress& p_bda, uint8_t addr_type) { 743c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov // Remove the oldest entries 753c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov while (remote_bdaddr_cache.size() >= remote_bdaddr_cache_max_size) { 763c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov const RawAddress& raw_address = remote_bdaddr_cache_ordered.front(); 773c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov remote_bdaddr_cache.erase(raw_address); 783c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov remote_bdaddr_cache_ordered.pop(); 793c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov } 803c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov remote_bdaddr_cache.insert(p_bda); 813c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov remote_bdaddr_cache_ordered.push(p_bda); 82c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 83c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 849e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskibool btif_gattc_find_bdaddr(const RawAddress& p_bda) { 853c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov return (remote_bdaddr_cache.find(p_bda) != remote_bdaddr_cache.end()); 86c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 87c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 883c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavovvoid btif_gattc_init_dev_cb(void) { 893c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov remote_bdaddr_cache.clear(); 903c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov remote_bdaddr_cache_ordered = {}; 913c6af043b9fd3339c306ff99d3004d553aa33adcPavlin Radoslavov} 92c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 93c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskivoid btif_gatts_upstreams_evt(uint16_t event, char* p_param) { 94c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski LOG_VERBOSE(LOG_TAG, "%s: Event %d", __func__, event); 95c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 96c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski tBTA_GATTC* p_data = (tBTA_GATTC*)p_param; 97c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski switch (event) { 98c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski case BTA_GATTC_DEREG_EVT: 99c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski break; 100c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 101c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski case BTA_GATTC_SEARCH_CMPL_EVT: { 102c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski HAL_CBACK(bt_gatt_callbacks, client->search_complete_cb, 103c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski p_data->search_cmpl.conn_id, p_data->search_cmpl.status); 104c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski break; 105c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 106c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 107c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski default: 108221e9bf6c9e9f974efd92ea4f054dbdba248d2dbJakub Pawlowski LOG_DEBUG(LOG_TAG, "%s: Unhandled event (%d)", __func__, event); 109c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski break; 110c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 111c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 112c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 113c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskivoid bta_gatts_cback(tBTA_GATTC_EVT event, tBTA_GATTC* p_data) { 114c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bt_status_t status = 115c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski btif_transfer_context(btif_gatts_upstreams_evt, (uint16_t)event, 116c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski (char*)p_data, sizeof(tBTA_GATTC), NULL); 117c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski ASSERTC(status == BT_STATUS_SUCCESS, "Context transfer failed!", status); 118c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 119c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 120e39606565035a103562d0485a90b18962592ae97Jakub Pawlowskivoid bta_batch_scan_threshold_cb(tBTM_BLE_REF_VALUE ref_value) { 121c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski SCAN_CBACK_IN_JNI(batchscan_threshold_cb, ref_value); 122c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 123c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 124eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowskivoid bta_batch_scan_reports_cb(int client_id, tBTA_STATUS status, 125c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski uint8_t report_format, uint8_t num_records, 126eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski std::vector<uint8_t> data) { 127eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski SCAN_CBACK_IN_JNI(batchscan_reports_cb, client_id, status, report_format, 128eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski num_records, std::move(data)); 129c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 130c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 1319e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskivoid bta_scan_results_cb_impl(RawAddress bd_addr, tBT_DEVICE_TYPE device_type, 132c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski int8_t rssi, uint8_t addr_type, 1337de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski uint16_t ble_evt_type, uint8_t ble_primary_phy, 1347de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski uint8_t ble_secondary_phy, 1357de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski uint8_t ble_advertising_sid, int8_t ble_tx_power, 1367de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski uint16_t ble_periodic_adv_int, 137c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski vector<uint8_t> value) { 138c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski uint8_t remote_name_len; 139c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bt_device_type_t dev_type; 140c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bt_property_t properties; 141c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 142103b2c44d3db6172a2dc9319e215eeece504316eJakub Pawlowski const uint8_t* p_eir_remote_name = AdvertiseDataParser::GetFieldByType( 1430595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski value, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &remote_name_len); 144c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 145c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if (p_eir_remote_name == NULL) { 146103b2c44d3db6172a2dc9319e215eeece504316eJakub Pawlowski p_eir_remote_name = AdvertiseDataParser::GetFieldByType( 1470595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski value, BT_EIR_SHORTENED_LOCAL_NAME_TYPE, &remote_name_len); 148c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 149c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 150c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if ((addr_type != BLE_ADDR_RANDOM) || (p_eir_remote_name)) { 151760f967f475046caef597a76fbe7e3cf4c511e25Jakub Pawlowski if (!btif_gattc_find_bdaddr(bd_addr)) { 152760f967f475046caef597a76fbe7e3cf4c511e25Jakub Pawlowski btif_gattc_add_remote_bdaddr(bd_addr, addr_type); 153c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 154c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if (p_eir_remote_name) { 1553a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski if (remote_name_len > BD_NAME_LEN + 1 || 1563a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski (remote_name_len == BD_NAME_LEN + 1 && 1573a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski p_eir_remote_name[BD_NAME_LEN] != '\0')) { 1583a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski LOG_INFO(LOG_TAG, 1593a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski "%s dropping invalid packet - device name too long: %d", 1603a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski __func__, remote_name_len); 1613a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski return; 1623a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski } 1633a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski 164c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski bt_bdname_t bdname; 165c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski memcpy(bdname.name, p_eir_remote_name, remote_name_len); 1663a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski if (remote_name_len < BD_NAME_LEN + 1) 1673a4e7622ff07772a512052c23cada59f5830941fJakub Pawlowski bdname.name[remote_name_len] = '\0'; 168c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 169c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski LOG_VERBOSE(LOG_TAG, "%s BLE device name=%s len=%d dev_type=%d", 170c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski __func__, bdname.name, remote_name_len, device_type); 171c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski btif_dm_update_ble_remote_properties(bd_addr, bdname.name, device_type); 172c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 173c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 174c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 175c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 176c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski dev_type = (bt_device_type_t)device_type; 177c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski BTIF_STORAGE_FILL_PROPERTY(&properties, BT_PROPERTY_TYPE_OF_DEVICE, 178c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski sizeof(dev_type), &dev_type); 179c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski btif_storage_set_remote_device_property(&(bd_addr), &properties); 180c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 181c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski btif_storage_set_remote_addr_type(&bd_addr, addr_type); 1827de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski HAL_CBACK(bt_gatt_callbacks, scanner->scan_result_cb, ble_evt_type, addr_type, 1837de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski &bd_addr, ble_primary_phy, ble_secondary_phy, ble_advertising_sid, 1847de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski ble_tx_power, rssi, ble_periodic_adv_int, std::move(value)); 185c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 186c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 187c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskivoid bta_scan_results_cb(tBTA_DM_SEARCH_EVT event, tBTA_DM_SEARCH* p_data) { 188c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski uint8_t len; 189c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 190c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if (event == BTA_DM_INQ_CMPL_EVT) { 191c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski BTIF_TRACE_DEBUG("%s BLE observe complete. Num Resp %d", __func__, 192c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski p_data->inq_cmpl.num_resps); 193c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return; 194c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 195c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 196c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if (event != BTA_DM_INQ_RES_EVT) { 197c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski BTIF_TRACE_WARNING("%s : Unknown event 0x%x", __func__, event); 198c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski return; 199c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 200c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 2010595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski vector<uint8_t> value; 202c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski if (p_data->inq_res.p_eir) { 203c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski value.insert(value.begin(), p_data->inq_res.p_eir, 2040595ca0018ac9980d1dd7e192301f8494a01f9cbJakub Pawlowski p_data->inq_res.p_eir + p_data->inq_res.eir_len); 205c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 206103b2c44d3db6172a2dc9319e215eeece504316eJakub Pawlowski if (AdvertiseDataParser::GetFieldByType( 207103b2c44d3db6172a2dc9319e215eeece504316eJakub Pawlowski value, BTM_EIR_COMPLETE_LOCAL_NAME_TYPE, &len)) { 208c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski p_data->inq_res.remt_name_not_required = true; 209c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 210c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 211c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 2127de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski tBTA_DM_INQ_RES* r = &p_data->inq_res; 213c2276b06572ab6fc1f900fbb1f41087e77d47e2aJakub Pawlowski do_in_jni_thread(Bind(bta_scan_results_cb_impl, r->bd_addr, r->device_type, 2147de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski r->rssi, r->ble_addr_type, r->ble_evt_type, 2157de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski r->ble_primary_phy, r->ble_secondary_phy, 2167de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski r->ble_advertising_sid, r->ble_tx_power, 2177de0f9b78fb38fcb02cbcd3c1c7c005947b9e291Jakub Pawlowski r->ble_periodic_adv_int, std::move(value))); 218c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 219c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 220eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowskivoid bta_track_adv_event_cb(tBTM_BLE_TRACK_ADV_DATA* p_track_adv_data) { 221c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski btgatt_track_adv_info_t* btif_scan_track_cb = new btgatt_track_adv_info_t; 222c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 223c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski BTIF_TRACE_DEBUG("%s", __func__); 224c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski btif_gatt_move_track_adv_data(btif_scan_track_cb, 225c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski (btgatt_track_adv_info_t*)p_track_adv_data); 226c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 227c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski SCAN_CBACK_IN_JNI(track_adv_event_cb, Owned(btif_scan_track_cb)); 228c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski} 229c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 23083f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowskiclass BleScannerInterfaceImpl : public BleScannerInterface { 23183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski ~BleScannerInterfaceImpl(){}; 23283f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 23383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski void RegisterScanner(RegisterCallback cb) override { 234119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski do_in_bta_thread(FROM_HERE, 235119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski Bind( 236119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski [](RegisterCallback cb) { 237119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski BTA_GATTC_AppRegister( 238119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski bta_gatts_cback, 239119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, std::move(cb))); 240119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski }, 241119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski std::move(cb))); 24283f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 24383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 24483f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski void Unregister(int scanner_id) override { 24583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski do_in_bta_thread(FROM_HERE, Bind(&BTA_GATTC_AppDeregister, scanner_id)); 24683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 24783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 24883f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski void Scan(bool start) override { 249eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski do_in_jni_thread(Bind( 250eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski [](bool start) { 251eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski if (!start) { 252eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski do_in_bta_thread(FROM_HERE, 253eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski Bind(&BTA_DmBleObserve, false, 0, nullptr)); 254eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski return; 255eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski } 256eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski 257eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski btif_gattc_init_dev_cb(); 258eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski do_in_bta_thread(FROM_HERE, 259eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski Bind(&BTA_DmBleObserve, true, 0, 260eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski (tBTA_DM_SEARCH_CBACK*)bta_scan_results_cb)); 261eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski }, 262eb43e9cf12139aeb227e26a8201a80974129c553Jakub Pawlowski start)); 26383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 26483f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 265709843216679a3c7852d7d254fde47a9d503abd8Jakub Pawlowski void ScanFilterParamSetup( 266709843216679a3c7852d7d254fde47a9d503abd8Jakub Pawlowski uint8_t client_if, uint8_t action, uint8_t filt_index, 267119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski std::unique_ptr<btgatt_filt_param_setup_t> filt_param, 268119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski FilterParamSetupCallback cb) override { 26983f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski BTIF_TRACE_DEBUG("%s", __func__); 2702c1522e2b84180b9857959ae297111ad7dd2be74Jakub Pawlowski 2712c1522e2b84180b9857959ae297111ad7dd2be74Jakub Pawlowski if (filt_param && filt_param->dely_mode == 1) { 272eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski do_in_bta_thread( 273eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski FROM_HERE, base::Bind(BTM_BleTrackAdvertiser, bta_track_adv_event_cb, 274eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski client_if)); 2752c1522e2b84180b9857959ae297111ad7dd2be74Jakub Pawlowski } 2762c1522e2b84180b9857959ae297111ad7dd2be74Jakub Pawlowski 277119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski do_in_bta_thread(FROM_HERE, 278119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski base::Bind(&BTM_BleAdvFilterParamSetup, action, filt_index, 279119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski base::Passed(&filt_param), 280119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, std::move(cb)))); 28183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 28283f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 283119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski void ScanFilterAddRemove(int action, int filt_type, int filt_index, 284119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski int company_id, int company_id_mask, 285808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski const bt_uuid_t* p_uuid, 286808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski const bt_uuid_t* p_uuid_mask, 2879e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski const RawAddress* bd_addr, char addr_type, 288119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski vector<uint8_t> data, vector<uint8_t> mask, 289119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski FilterConfigCallback cb) override { 29083f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski BTIF_TRACE_DEBUG("%s, %d, %d", __func__, action, filt_type); 29183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 29283f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski /* If data is passed, both mask and data have to be the same length */ 29383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski if (data.size() != mask.size() && data.size() != 0 && mask.size() != 0) 294808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski return; 29583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 29683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski switch (filt_type) { 297e39606565035a103562d0485a90b18962592ae97Jakub Pawlowski case BTM_BLE_PF_ADDR_FILTER: { 2982ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski tBLE_BD_ADDR target_addr; 29978b81c6db0aed32eb595ce4de7eb22fc24800058Jakub Pawlowski target_addr.bda = *bd_addr; 3002ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski target_addr.type = addr_type; 3012ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski 3022ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski do_in_bta_thread( 3032ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski FROM_HERE, 3042ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski base::Bind(&BTM_LE_PF_addr_filter, action, filt_index, 3052ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski std::move(target_addr), 306119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type)))); 3072ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski return; 30883f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 30983f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 310e39606565035a103562d0485a90b18962592ae97Jakub Pawlowski case BTM_BLE_PF_SRVC_DATA: 3112ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski do_in_bta_thread(FROM_HERE, 3122ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski base::Bind(&BTM_LE_PF_srvc_data, action, filt_index)); 3132ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski return; 314ae2aabef09fd47cce7aa2598ad27e168481f0760Jakub Pawlowski 3152ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski case BTM_BLE_PF_SRVC_UUID: 3162ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski case BTM_BLE_PF_SRVC_SOL_UUID: { 31783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski tBT_UUID bt_uuid; 31883f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski btif_to_bta_uuid(&bt_uuid, p_uuid); 319c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 3202ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski if (p_uuid_mask == NULL) { 3212ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski do_in_bta_thread( 3222ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski FROM_HERE, 3232ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski base::Bind(&BTM_LE_PF_uuid_filter, action, filt_index, filt_type, 3242ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski bt_uuid, BTM_BLE_PF_LOGIC_AND, nullptr, 325119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type)))); 3262ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski return; 32783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 328c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 3292ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski tBTM_BLE_PF_COND_MASK* mask = new tBTM_BLE_PF_COND_MASK; 3302ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski btif_to_bta_uuid_mask(mask, p_uuid_mask, p_uuid); 3312ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski do_in_bta_thread( 3322ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski FROM_HERE, 3332ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski base::Bind(&BTM_LE_PF_uuid_filter, action, filt_index, filt_type, 3342ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski bt_uuid, BTM_BLE_PF_LOGIC_AND, base::Owned(mask), 335119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type)))); 3362ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski return; 33783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 338c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 339e39606565035a103562d0485a90b18962592ae97Jakub Pawlowski case BTM_BLE_PF_LOCAL_NAME: { 3402ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski do_in_bta_thread( 341119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski FROM_HERE, 342119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski base::Bind(&BTM_LE_PF_local_name, action, filt_index, 343119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski std::move(data), 344119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type)))); 3452ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski return; 34683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 347c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 348e39606565035a103562d0485a90b18962592ae97Jakub Pawlowski case BTM_BLE_PF_MANU_DATA: { 3492ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski do_in_bta_thread( 3502ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski FROM_HERE, 3512ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski base::Bind(&BTM_LE_PF_manu_data, action, filt_index, company_id, 3522ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski company_id_mask, std::move(data), std::move(mask), 353119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type)))); 3542ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski return; 35583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 356c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 357e39606565035a103562d0485a90b18962592ae97Jakub Pawlowski case BTM_BLE_PF_SRVC_DATA_PATTERN: { 3582ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski do_in_bta_thread( 3592ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski FROM_HERE, 3602ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski base::Bind(&BTM_LE_PF_srvc_data_pattern, action, filt_index, 3612ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski std::move(data), std::move(mask), 362119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, Bind(cb, filt_type)))); 3632ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski return; 36483f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 365c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 36683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski default: 36783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski LOG_ERROR(LOG_TAG, "%s: Unknown filter type (%d)!", __func__, action); 368808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski return; 369c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 370c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski } 371c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 372119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski void ScanFilterClear(int filter_index, FilterConfigCallback cb) override { 37383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski BTIF_TRACE_DEBUG("%s: filter_index: %d", __func__, filter_index); 3742ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski do_in_bta_thread(FROM_HERE, 3752ffd8da9af4b6ccec249056b4f043d9bb222d4c8Jakub Pawlowski base::Bind(&BTM_LE_PF_clear, filter_index, 376119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper( 377119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski FROM_HERE, Bind(cb, BTM_BLE_PF_TYPE_ALL)))); 37883f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 379c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 380119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski void ScanFilterEnable(bool enable, EnableCallback cb) override { 38183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski BTIF_TRACE_DEBUG("%s: enable: %d", __func__, enable); 382c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 38383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski uint8_t action = enable ? 1 : 0; 384119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski do_in_bta_thread(FROM_HERE, 385119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski base::Bind(&BTM_BleEnableDisableFilterFeature, action, 386119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, std::move(cb)))); 38783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 388c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 389119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski void SetScanParameters(int scan_interval, int scan_window, 390119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski Callback cb) override { 391eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski do_in_bta_thread( 392119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski FROM_HERE, base::Bind(&BTM_BleSetScanParams, scan_interval, scan_window, 393119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski BTM_BLE_SCAN_MODE_ACTI, 394119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, std::move(cb)))); 39583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 396c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 397808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski void BatchscanConfigStorage(int client_if, int batch_scan_full_max, 398808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski int batch_scan_trunc_max, 399119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski int batch_scan_notify_threshold, 400119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski Callback cb) override { 401eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski do_in_bta_thread( 402eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski FROM_HERE, 403eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski base::Bind(&BTM_BleSetStorageConfig, (uint8_t)batch_scan_full_max, 404eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski (uint8_t)batch_scan_trunc_max, 405119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski (uint8_t)batch_scan_notify_threshold, 406119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, cb), 407eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski bta_batch_scan_threshold_cb, (tBTM_BLE_REF_VALUE)client_if)); 40883f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 409c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 410119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski void BatchscanEnable(int scan_mode, int scan_interval, int scan_window, 411119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski int addr_type, int discard_rule, Callback cb) override { 412eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski do_in_bta_thread( 413eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski FROM_HERE, base::Bind(&BTM_BleEnableBatchScan, scan_mode, scan_interval, 414119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski scan_window, discard_rule, addr_type, 415119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, cb))); 41683f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 417c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 418119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski void BatchscanDisable(Callback cb) override { 419119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski do_in_bta_thread(FROM_HERE, base::Bind(&BTM_BleDisableBatchScan, 420119f32a7e85801f15c30dd5e874dc4bff0311d54Jakub Pawlowski jni_thread_wrapper(FROM_HERE, cb))); 42183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 422c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 423808650d846bd302ca8636fb7464ff4aba940f1d5Jakub Pawlowski void BatchscanReadReports(int client_if, int scan_mode) override { 424eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski do_in_bta_thread(FROM_HERE, 425eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski base::Bind(&BTM_BleReadScanReports, (uint8_t)scan_mode, 426eab3651db4792695080d24b2a6e723a68cc62d22Jakub Pawlowski Bind(bta_batch_scan_reports_cb, client_if))); 42783f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski } 428f685bfb7b1f6da17165a33590b18f559476e670fJakub Pawlowski 4299e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski void StartSync(uint8_t sid, RawAddress address, uint16_t skip, 430f685bfb7b1f6da17165a33590b18f559476e670fJakub Pawlowski uint16_t timeout, StartSyncCb start_cb, SyncReportCb report_cb, 431f685bfb7b1f6da17165a33590b18f559476e670fJakub Pawlowski SyncLostCb lost_cb) override {} 432f685bfb7b1f6da17165a33590b18f559476e670fJakub Pawlowski 433f685bfb7b1f6da17165a33590b18f559476e670fJakub Pawlowski void StopSync(uint16_t handle) override {} 43483f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski}; 43583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 43683f1d967df168f862cf733cabbab76f7c52587f4Jakub PawlowskiBleScannerInterface* btLeScannerInstance = nullptr; 437c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 4389008888d24407541aa383aa4bd363a40abbf954bMyles Watson} // namespace 439c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski 44083f1d967df168f862cf733cabbab76f7c52587f4Jakub PawlowskiBleScannerInterface* get_ble_scanner_instance() { 44183f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski if (btLeScannerInstance == nullptr) 44283f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski btLeScannerInstance = new BleScannerInterfaceImpl(); 44383f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski 44483f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski return btLeScannerInstance; 44583f1d967df168f862cf733cabbab76f7c52587f4Jakub Pawlowski} 446