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
27 using android::sp;
28
29 namespace ipc {
30 namespace binder {
31
BluetoothBinderServer(bluetooth::Adapter * adapter)32 BluetoothBinderServer::BluetoothBinderServer(bluetooth::Adapter* adapter)
33 : adapter_(adapter) {
34 CHECK(adapter_);
35 adapter_->AddObserver(this);
36 }
37
~BluetoothBinderServer()38 BluetoothBinderServer::~BluetoothBinderServer() {
39 adapter_->RemoveObserver(this);
40 }
41
42 // binder::BnBluetooth overrides:
IsEnabled()43 bool BluetoothBinderServer::IsEnabled() {
44 VLOG(2) << __func__;
45 return adapter_->IsEnabled();
46 }
47
GetState()48 int BluetoothBinderServer::GetState() {
49 VLOG(2) << __func__;
50 return adapter_->GetState();
51 }
52
Enable(bool start_restricted)53 bool BluetoothBinderServer::Enable(bool start_restricted) {
54 VLOG(2) << __func__;
55 return adapter_->Enable(start_restricted);
56 }
57
EnableNoAutoConnect()58 bool BluetoothBinderServer::EnableNoAutoConnect() {
59 VLOG(2) << __func__;
60 // TODO(armansito): Implement.
61 return false;
62 }
63
Disable()64 bool BluetoothBinderServer::Disable() {
65 VLOG(2) << __func__;
66 return adapter_->Disable();
67 }
68
GetAddress()69 std::string BluetoothBinderServer::GetAddress() {
70 VLOG(2) << __func__;
71 return adapter_->GetAddress();
72 }
73
GetUUIDs()74 std::vector<bluetooth::UUID> BluetoothBinderServer::GetUUIDs() {
75 VLOG(2) << __func__;
76 // TODO(armansito): Implement.
77 return std::vector<bluetooth::UUID>();
78 }
79
SetName(const std::string & name)80 bool BluetoothBinderServer::SetName(const std::string& name) {
81 VLOG(2) << __func__;
82 return adapter_->SetName(name);
83 }
84
GetName()85 std::string BluetoothBinderServer::GetName() {
86 VLOG(2) << __func__;
87 return adapter_->GetName();
88 }
89
RegisterCallback(const sp<IBluetoothCallback> & callback)90 void 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
UnregisterCallback(const sp<IBluetoothCallback> & callback)100 void 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
IsMultiAdvertisementSupported()110 bool BluetoothBinderServer::IsMultiAdvertisementSupported() {
111 VLOG(2) << __func__;
112 return adapter_->IsMultiAdvertisementSupported();
113 }
114
115 sp<IBluetoothLowEnergy>
GetLowEnergyInterface()116 BluetoothBinderServer::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
130 sp<IBluetoothGattClient>
GetGattClientInterface()131 BluetoothBinderServer::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
145 sp<IBluetoothGattServer>
GetGattServerInterface()146 BluetoothBinderServer::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
dump(int fd,const android::Vector<android::String16> & args)160 android::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
OnAdapterStateChanged(bluetooth::Adapter * adapter,bluetooth::AdapterState prev_state,bluetooth::AdapterState new_state)174 void 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