1c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//
2c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  Copyright (C) 2016 The Android Open Source Project
3c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//
4c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  Licensed under the Apache License, Version 2.0 (the "License");
5c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  you may not use this file except in compliance with the License.
6c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  You may obtain a copy of the License at:
7c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//
8c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  http://www.apache.org/licenses/LICENSE-2.0
9c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//
10c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  Unless required by applicable law or agreed to in writing, software
11c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  distributed under the License is distributed on an "AS IS" BASIS,
12c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  See the License for the specific language governing permissions and
14c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//  limitations under the License.
15c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski//
16c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
17c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "service/ipc/binder/bluetooth_le_scanner_binder_server.h"
18c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
19c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include <base/logging.h>
20c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
21c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski#include "service/adapter.h"
22c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
23c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing android::String8;
24c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing android::String16;
25c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiusing android::binder::Status;
26c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
27c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace ipc {
28c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace binder {
29c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
30c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskinamespace {
31c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiconst int kInvalidInstanceId = -1;
32c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}  // namespace
33c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
34c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiBluetoothLeScannerBinderServer::BluetoothLeScannerBinderServer(
35c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    bluetooth::Adapter* adapter)
36c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    : adapter_(adapter) {
37c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  CHECK(adapter_);
38c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
39c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
40c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiBluetoothLeScannerBinderServer::~BluetoothLeScannerBinderServer() {}
41c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
42c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::RegisterScanner(
43c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    const android::sp<IBluetoothLeScannerCallback>& callback,
44c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    bool* _aidl_return) {
45c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  VLOG(2) << __func__;
46c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  bluetooth::LowEnergyScannerFactory* ble_factory =
47c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski      adapter_->GetLeScannerFactory();
48c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
49c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  *_aidl_return = RegisterInstanceBase(callback, ble_factory);
50c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  return Status::ok();
51c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
52c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
53c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::UnregisterScanner(int scanner_id) {
54c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  VLOG(2) << __func__;
55c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  UnregisterInstanceBase(scanner_id);
56c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  return Status::ok();
57c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
58c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
59c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::UnregisterAll() {
60c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  VLOG(2) << __func__;
61c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  UnregisterAllBase();
62c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  return Status::ok();
63c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
64c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
65c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::StartScan(
66c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    int scanner_id, const android::bluetooth::ScanSettings& settings,
67c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    const std::vector<android::bluetooth::ScanFilter>& filters,
68c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    bool* _aidl_return) {
69c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  VLOG(2) << __func__ << " scanner_id: " << scanner_id;
70c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  std::lock_guard<std::mutex> lock(*maps_lock());
71c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
72c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  auto scanner = GetLEScanner(scanner_id);
73c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  if (!scanner) {
74c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    LOG(ERROR) << "Unknown scanner_id: " << scanner_id;
75c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    *_aidl_return = false;
76c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    return Status::ok();
77c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  }
78c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
79c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  std::vector<bluetooth::ScanFilter> flt;
80c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  for (const auto& filter : filters) {
81c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    flt.push_back(filter);
82c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  }
83c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
84c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  *_aidl_return = scanner->StartScan(settings, flt);
85c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  return Status::ok();
86c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
87c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
88c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiStatus BluetoothLeScannerBinderServer::StopScan(int scanner_id,
89c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski                                                bool* _aidl_return) {
90c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  VLOG(2) << __func__ << " scanner_id: " << scanner_id;
91c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  std::lock_guard<std::mutex> lock(*maps_lock());
92c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
93c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  auto scanner = GetLEScanner(scanner_id);
94c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  if (!scanner) {
95c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    LOG(ERROR) << "Unknown scanner_id: " << scanner_id;
96c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    *_aidl_return = false;
97c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    return Status::ok();
98c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  }
99c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
100c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  *_aidl_return = scanner->StopScan();
101c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  return Status::ok();
102c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
103c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
104c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskivoid BluetoothLeScannerBinderServer::OnScanResult(
105c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    bluetooth::LowEnergyScanner* scanner, const bluetooth::ScanResult& result) {
106c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  VLOG(2) << __func__;
107c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  std::lock_guard<std::mutex> lock(*maps_lock());
108c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
109c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  int scanner_id = scanner->GetInstanceId();
110c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  auto cb = GetLECallback(scanner->GetInstanceId());
111c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  if (!cb.get()) {
112c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    VLOG(2) << "Scanner was unregistered - scanner_id: " << scanner_id;
113c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    return;
114c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  }
115c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
116c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  cb->OnScanResult(result);
117c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
118c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
119c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskiandroid::sp<IBluetoothLeScannerCallback>
120c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiBluetoothLeScannerBinderServer::GetLECallback(int scanner_id) {
121c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  auto cb = GetCallback(scanner_id);
122c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  return android::sp<IBluetoothLeScannerCallback>(
123c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski      static_cast<IBluetoothLeScannerCallback*>(cb.get()));
124c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
125c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
126c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskistd::shared_ptr<bluetooth::LowEnergyScanner>
127c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub PawlowskiBluetoothLeScannerBinderServer::GetLEScanner(int scanner_id) {
128c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  return std::static_pointer_cast<bluetooth::LowEnergyScanner>(
129c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski      GetInstance(scanner_id));
130c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
131c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
132c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowskivoid BluetoothLeScannerBinderServer::OnRegisterInstanceImpl(
133c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    bluetooth::BLEStatus status, android::sp<IInterface> callback,
134c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski    bluetooth::BluetoothInstance* instance) {
135c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  VLOG(1) << __func__ << " status: " << status;
136c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  bluetooth::LowEnergyScanner* le_scanner =
137c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski      static_cast<bluetooth::LowEnergyScanner*>(instance);
138c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  le_scanner->SetDelegate(this);
139c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
140c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  android::sp<IBluetoothLeScannerCallback> cb(
141c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski      static_cast<IBluetoothLeScannerCallback*>(callback.get()));
142c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski  cb->OnScannerRegistered(status, (status == bluetooth::BLE_STATUS_SUCCESS)
143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                      ? instance->GetInstanceId()
144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson                                      : kInvalidInstanceId);
145c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}
146c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski
147c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}  // namespace binder
148c3f6a51615c4f26bce0b8b6e16757610dbd0b45bJakub Pawlowski}  // namespace ipc
149