• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 //  Copyright 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_le_advertiser_binder_server.h"
24 #include "service/ipc/binder/bluetooth_le_scanner_binder_server.h"
25 #include "service/ipc/binder/bluetooth_low_energy_binder_server.h"
26 
27 #include "service/hal/bluetooth_interface.h"
28 
29 using android::sp;
30 using android::String8;
31 using android::String16;
32 
33 using android::bluetooth::IBluetoothCallback;
34 using android::bluetooth::IBluetoothGattClient;
35 using android::bluetooth::IBluetoothGattServer;
36 
37 namespace ipc {
38 namespace binder {
39 
BluetoothBinderServer(bluetooth::Adapter * adapter)40 BluetoothBinderServer::BluetoothBinderServer(bluetooth::Adapter* adapter)
41     : adapter_(adapter) {
42   CHECK(adapter_);
43   adapter_->AddObserver(this);
44 }
45 
~BluetoothBinderServer()46 BluetoothBinderServer::~BluetoothBinderServer() {
47   adapter_->RemoveObserver(this);
48 }
49 
50 // binder::BnBluetooth overrides:
IsEnabled(bool * _aidl_return)51 Status BluetoothBinderServer::IsEnabled(bool* _aidl_return) {
52   VLOG(2) << __func__;
53   *_aidl_return = adapter_->IsEnabled();
54   return Status::ok();
55 }
56 
GetState(int32_t * _aidl_return)57 Status BluetoothBinderServer::GetState(int32_t* _aidl_return) {
58   VLOG(2) << __func__;
59   *_aidl_return = adapter_->GetState();
60   return Status::ok();
61 }
62 
Enable(bool start_restricted,bool * _aidl_return)63 Status BluetoothBinderServer::Enable(bool start_restricted,
64                                      bool* _aidl_return) {
65   VLOG(2) << __func__;
66   *_aidl_return = adapter_->Enable(start_restricted);
67   return Status::ok();
68 }
69 
EnableNoAutoConnect(bool * _aidl_return)70 Status BluetoothBinderServer::EnableNoAutoConnect(bool* _aidl_return) {
71   VLOG(2) << __func__;
72   // TODO(armansito): Implement.
73   *_aidl_return = false;
74   return Status::ok();
75 }
76 
Disable(bool * _aidl_return)77 Status BluetoothBinderServer::Disable(bool* _aidl_return) {
78   VLOG(2) << __func__;
79   *_aidl_return = adapter_->Disable();
80   return Status::ok();
81 }
82 
GetAddress(::android::String16 * _aidl_return)83 Status BluetoothBinderServer::GetAddress(::android::String16* _aidl_return) {
84   VLOG(2) << __func__;
85   *_aidl_return = String16(String8(adapter_->GetAddress().c_str()));
86   return Status::ok();
87 }
88 
GetUUIDs(::std::vector<::android::bluetooth::UUID> * _aidl_return)89 Status BluetoothBinderServer::GetUUIDs(
90     ::std::vector<::android::bluetooth::UUID>* _aidl_return) {
91   VLOG(2) << __func__;
92   // TODO(armansito): Implement.
93   *_aidl_return = std::vector<android::bluetooth::UUID>();
94   return Status::ok();
95 }
96 
SetName(const::android::String16 & name,bool * _aidl_return)97 Status BluetoothBinderServer::SetName(const ::android::String16& name,
98                                       bool* _aidl_return) {
99   VLOG(2) << __func__;
100   *_aidl_return = adapter_->SetName(std::string(String8(name).string()));
101   return Status::ok();
102 }
103 
GetName(::android::String16 * _aidl_return)104 Status BluetoothBinderServer::GetName(::android::String16* _aidl_return) {
105   VLOG(2) << __func__;
106   *_aidl_return = String16(String8(adapter_->GetName().c_str()));
107   return Status::ok();
108 }
109 
RegisterCallback(const::android::sp<IBluetoothCallback> & callback)110 Status BluetoothBinderServer::RegisterCallback(
111     const ::android::sp<IBluetoothCallback>& callback) {
112   VLOG(2) << __func__;
113   if (!callback.get()) {
114     LOG(ERROR) << "RegisterCallback called with NULL binder. Ignoring.";
115     return Status::ok();
116   }
117   callbacks_.Register(callback);
118   return Status::ok();
119 }
120 
UnregisterCallback(const::android::sp<IBluetoothCallback> & callback)121 Status BluetoothBinderServer::UnregisterCallback(
122     const ::android::sp<IBluetoothCallback>& callback) {
123   VLOG(2) << __func__;
124   if (!callback.get()) {
125     LOG(ERROR) << "UnregisterCallback called with NULL binder. Ignoring.";
126     return Status::ok();
127   }
128   callbacks_.Unregister(callback);
129   return Status::ok();
130 }
131 
IsMultiAdvertisementSupported(bool * _aidl_return)132 Status BluetoothBinderServer::IsMultiAdvertisementSupported(
133     bool* _aidl_return) {
134   VLOG(2) << __func__;
135   *_aidl_return = adapter_->IsMultiAdvertisementSupported();
136   return Status::ok();
137 }
138 
GetLowEnergyInterface(::android::sp<IBluetoothLowEnergy> * _aidl_return)139 Status BluetoothBinderServer::GetLowEnergyInterface(
140     ::android::sp<IBluetoothLowEnergy>* _aidl_return) {
141   VLOG(2) << __func__;
142 
143   if (!adapter_->IsEnabled()) {
144     LOG(ERROR) << "Cannot obtain IBluetoothLowEnergy interface while disabled";
145     *_aidl_return = NULL;
146     return Status::ok();
147   }
148 
149   if (!low_energy_interface_.get())
150     low_energy_interface_ = new BluetoothLowEnergyBinderServer(adapter_);
151 
152   *_aidl_return = low_energy_interface_;
153   return Status::ok();
154 }
155 
GetLeAdvertiserInterface(::android::sp<IBluetoothLeAdvertiser> * _aidl_return)156 Status BluetoothBinderServer::GetLeAdvertiserInterface(
157     ::android::sp<IBluetoothLeAdvertiser>* _aidl_return) {
158   VLOG(2) << __func__;
159 
160   if (!adapter_->IsEnabled()) {
161     LOG(ERROR)
162         << "Cannot obtain IBluetoothLeAdvertiser interface while disabled";
163     *_aidl_return = NULL;
164     return Status::ok();
165   }
166 
167   if (!le_advertiser_interface_.get())
168     le_advertiser_interface_ = new BluetoothLeAdvertiserBinderServer(adapter_);
169 
170   *_aidl_return = le_advertiser_interface_;
171   return Status::ok();
172 }
173 
GetLeScannerInterface(::android::sp<IBluetoothLeScanner> * _aidl_return)174 Status BluetoothBinderServer::GetLeScannerInterface(
175     ::android::sp<IBluetoothLeScanner>* _aidl_return) {
176   VLOG(2) << __func__;
177 
178   if (!adapter_->IsEnabled()) {
179     LOG(ERROR) << "Cannot obtain IBluetoothLeScanner interface while disabled";
180     *_aidl_return = NULL;
181     return Status::ok();
182   }
183 
184   if (!le_scanner_interface_.get())
185     le_scanner_interface_ = new BluetoothLeScannerBinderServer(adapter_);
186 
187   *_aidl_return = le_scanner_interface_;
188   return Status::ok();
189 }
190 
GetGattClientInterface(::android::sp<IBluetoothGattClient> * _aidl_return)191 Status BluetoothBinderServer::GetGattClientInterface(
192     ::android::sp<IBluetoothGattClient>* _aidl_return) {
193   VLOG(2) << __func__;
194 
195   if (!adapter_->IsEnabled()) {
196     LOG(ERROR) << "Cannot obtain IBluetoothGattClient interface while disabled";
197     *_aidl_return = NULL;
198     return Status::ok();
199   }
200 
201   if (!gatt_client_interface_.get())
202     gatt_client_interface_ = new BluetoothGattClientBinderServer(adapter_);
203 
204   *_aidl_return = gatt_client_interface_;
205   return Status::ok();
206 }
207 
GetGattServerInterface(::android::sp<IBluetoothGattServer> * _aidl_return)208 Status BluetoothBinderServer::GetGattServerInterface(
209     ::android::sp<IBluetoothGattServer>* _aidl_return) {
210   VLOG(2) << __func__;
211 
212   if (!adapter_->IsEnabled()) {
213     LOG(ERROR) << "Cannot obtain IBluetoothGattServer interface while disabled";
214     *_aidl_return = NULL;
215     return Status::ok();
216   }
217 
218   if (!gatt_server_interface_.get())
219     gatt_server_interface_ = new BluetoothGattServerBinderServer(adapter_);
220 
221   *_aidl_return = gatt_server_interface_;
222   return Status::ok();
223 }
224 
dump(int fd,const android::Vector<android::String16> & args)225 android::status_t BluetoothBinderServer::dump(
226     int fd, const android::Vector<android::String16>& args) {
227   VLOG(2) << __func__ << " called with fd " << fd;
228   if (args.size() > 0) {
229     // TODO (jamuraa): Parse arguments and switch on --proto, --proto_text
230     for (const auto& x : args) {
231       VLOG(2) << __func__ << "argument: " << x.string();
232     }
233   }
234   // TODO (jamuraa): enumerate profiles and dump profile information
235   const bt_interface_t* iface =
236       bluetooth::hal::BluetoothInterface::Get()->GetHALInterface();
237   iface->dump(fd, NULL);
238   return android::NO_ERROR;
239 }
240 
OnAdapterStateChanged(bluetooth::Adapter * adapter,bluetooth::AdapterState prev_state,bluetooth::AdapterState new_state)241 void BluetoothBinderServer::OnAdapterStateChanged(
242     bluetooth::Adapter* adapter, bluetooth::AdapterState prev_state,
243     bluetooth::AdapterState new_state) {
244   CHECK_EQ(adapter, adapter_);
245   VLOG(2) << "Received adapter state update - prev: " << prev_state
246           << " new: " << new_state;
247   callbacks_.ForEach([prev_state, new_state](IBluetoothCallback* callback) {
248     callback->OnBluetoothStateChange(prev_state, new_state);
249   });
250 }
251 
252 }  // namespace binder
253 }  // namespace ipc
254