• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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