1//
2//  Copyright (C) 2015 Google, Inc.
3//
4//  Licensed under the Apache License, Version 2.0 (the "License");
5//  you may not use this file except in compliance with the License.
6//  You may obtain a copy of the License at:
7//
8//  http://www.apache.org/licenses/LICENSE-2.0
9//
10//  Unless required by applicable law or agreed to in writing, software
11//  distributed under the License is distributed on an "AS IS" BASIS,
12//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13//  See the License for the specific language governing permissions and
14//  limitations under the License.
15//
16
17#include "service/ipc/binder/bluetooth_binder_server.h"
18
19#include <base/logging.h>
20
21#include "service/ipc/binder/bluetooth_gatt_client_binder_server.h"
22#include "service/ipc/binder/bluetooth_gatt_server_binder_server.h"
23#include "service/ipc/binder/bluetooth_low_energy_binder_server.h"
24
25#include "service/hal/bluetooth_interface.h"
26
27using android::sp;
28
29namespace ipc {
30namespace binder {
31
32BluetoothBinderServer::BluetoothBinderServer(bluetooth::Adapter* adapter)
33    : adapter_(adapter) {
34  CHECK(adapter_);
35  adapter_->AddObserver(this);
36}
37
38BluetoothBinderServer::~BluetoothBinderServer() {
39  adapter_->RemoveObserver(this);
40}
41
42// binder::BnBluetooth overrides:
43bool BluetoothBinderServer::IsEnabled() {
44  VLOG(2) << __func__;
45  return adapter_->IsEnabled();
46}
47
48int BluetoothBinderServer::GetState() {
49  VLOG(2) << __func__;
50  return adapter_->GetState();
51}
52
53bool BluetoothBinderServer::Enable(bool start_restricted) {
54  VLOG(2) << __func__;
55  return adapter_->Enable(start_restricted);
56}
57
58bool BluetoothBinderServer::EnableNoAutoConnect() {
59  VLOG(2) << __func__;
60  // TODO(armansito): Implement.
61  return false;
62}
63
64bool BluetoothBinderServer::Disable() {
65  VLOG(2) << __func__;
66  return adapter_->Disable();
67}
68
69std::string BluetoothBinderServer::GetAddress() {
70  VLOG(2) << __func__;
71  return adapter_->GetAddress();
72}
73
74std::vector<bluetooth::UUID> BluetoothBinderServer::GetUUIDs() {
75  VLOG(2) << __func__;
76  // TODO(armansito): Implement.
77  return std::vector<bluetooth::UUID>();
78}
79
80bool BluetoothBinderServer::SetName(const std::string& name) {
81  VLOG(2) << __func__;
82  return adapter_->SetName(name);
83}
84
85std::string BluetoothBinderServer::GetName() {
86  VLOG(2) << __func__;
87  return adapter_->GetName();
88}
89
90void BluetoothBinderServer::RegisterCallback(
91    const sp<IBluetoothCallback>& callback) {
92  VLOG(2) << __func__;
93  if (!callback.get() ) {
94    LOG(ERROR) << "RegisterCallback called with NULL binder. Ignoring.";
95    return;
96  }
97  callbacks_.Register(callback);
98}
99
100void BluetoothBinderServer::UnregisterCallback(
101    const sp<IBluetoothCallback>& callback) {
102  VLOG(2) << __func__;
103  if (!callback.get() ) {
104    LOG(ERROR) << "UnregisterCallback called with NULL binder. Ignoring.";
105    return;
106  }
107  callbacks_.Unregister(callback);
108}
109
110bool BluetoothBinderServer::IsMultiAdvertisementSupported() {
111  VLOG(2) << __func__;
112  return adapter_->IsMultiAdvertisementSupported();
113}
114
115sp<IBluetoothLowEnergy>
116BluetoothBinderServer::GetLowEnergyInterface() {
117  VLOG(2) << __func__;
118
119  if (!adapter_->IsEnabled()) {
120    LOG(ERROR) << "Cannot obtain IBluetoothLowEnergy interface while disabled";
121    return nullptr;
122  }
123
124  if (!low_energy_interface_.get())
125    low_energy_interface_ = new BluetoothLowEnergyBinderServer(adapter_);
126
127  return low_energy_interface_;
128}
129
130sp<IBluetoothGattClient>
131BluetoothBinderServer::GetGattClientInterface() {
132  VLOG(2) << __func__;
133
134  if (!adapter_->IsEnabled()) {
135    LOG(ERROR) << "Cannot obtain IBluetoothGattClient interface while disabled";
136    return nullptr;
137  }
138
139  if (!gatt_client_interface_.get())
140    gatt_client_interface_ = new BluetoothGattClientBinderServer(adapter_);
141
142  return gatt_client_interface_;
143}
144
145sp<IBluetoothGattServer>
146BluetoothBinderServer::GetGattServerInterface() {
147  VLOG(2) << __func__;
148
149  if (!adapter_->IsEnabled()) {
150    LOG(ERROR) << "Cannot obtain IBluetoothGattServer interface while disabled";
151    return nullptr;
152  }
153
154  if (!gatt_server_interface_.get())
155    gatt_server_interface_ = new BluetoothGattServerBinderServer(adapter_);
156
157  return gatt_server_interface_;
158}
159
160android::status_t BluetoothBinderServer::dump(int fd, const android::Vector<android::String16>& args) {
161  VLOG(2) << __func__ << " called with fd " << fd;
162  if  (args.size() > 0) {
163    // TODO (jamuraa): Parse arguments and switch on --proto, --proto_text
164    for (auto x : args) {
165      VLOG(2) << __func__ << "argument: " << x.string();
166    }
167  }
168  // TODO (jamuraa): enumerate profiles and dump profile information
169  const bt_interface_t *iface = bluetooth::hal::BluetoothInterface::Get()->GetHALInterface();
170  iface->dump(fd, NULL);
171  return android::NO_ERROR;
172}
173
174void BluetoothBinderServer::OnAdapterStateChanged(
175    bluetooth::Adapter* adapter,
176    bluetooth::AdapterState prev_state,
177    bluetooth::AdapterState new_state) {
178  CHECK_EQ(adapter, adapter_);
179  VLOG(2) << "Received adapter state update - prev: " << prev_state
180          << " new: " << new_state;
181  callbacks_.ForEach([prev_state, new_state](IBluetoothCallback* callback) {
182    callback->OnBluetoothStateChange(prev_state, new_state);
183  });
184}
185
186}  // namespace binder
187}  // namespace ipc
188