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