| // |
| // Copyright (C) 2015 Google, Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at: |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| |
| #include "service/ipc/binder/bluetooth_binder_server.h" |
| |
| #include <base/logging.h> |
| |
| #include "service/ipc/binder/bluetooth_gatt_client_binder_server.h" |
| #include "service/ipc/binder/bluetooth_gatt_server_binder_server.h" |
| #include "service/ipc/binder/bluetooth_low_energy_binder_server.h" |
| |
| #include "service/hal/bluetooth_interface.h" |
| |
| using android::sp; |
| |
| namespace ipc { |
| namespace binder { |
| |
| BluetoothBinderServer::BluetoothBinderServer(bluetooth::Adapter* adapter) |
| : adapter_(adapter) { |
| CHECK(adapter_); |
| adapter_->AddObserver(this); |
| } |
| |
| BluetoothBinderServer::~BluetoothBinderServer() { |
| adapter_->RemoveObserver(this); |
| } |
| |
| // binder::BnBluetooth overrides: |
| bool BluetoothBinderServer::IsEnabled() { |
| VLOG(2) << __func__; |
| return adapter_->IsEnabled(); |
| } |
| |
| int BluetoothBinderServer::GetState() { |
| VLOG(2) << __func__; |
| return adapter_->GetState(); |
| } |
| |
| bool BluetoothBinderServer::Enable(bool start_restricted) { |
| VLOG(2) << __func__; |
| return adapter_->Enable(start_restricted); |
| } |
| |
| bool BluetoothBinderServer::EnableNoAutoConnect() { |
| VLOG(2) << __func__; |
| // TODO(armansito): Implement. |
| return false; |
| } |
| |
| bool BluetoothBinderServer::Disable() { |
| VLOG(2) << __func__; |
| return adapter_->Disable(); |
| } |
| |
| std::string BluetoothBinderServer::GetAddress() { |
| VLOG(2) << __func__; |
| return adapter_->GetAddress(); |
| } |
| |
| std::vector<bluetooth::UUID> BluetoothBinderServer::GetUUIDs() { |
| VLOG(2) << __func__; |
| // TODO(armansito): Implement. |
| return std::vector<bluetooth::UUID>(); |
| } |
| |
| bool BluetoothBinderServer::SetName(const std::string& name) { |
| VLOG(2) << __func__; |
| return adapter_->SetName(name); |
| } |
| |
| std::string BluetoothBinderServer::GetName() { |
| VLOG(2) << __func__; |
| return adapter_->GetName(); |
| } |
| |
| void BluetoothBinderServer::RegisterCallback( |
| const sp<IBluetoothCallback>& callback) { |
| VLOG(2) << __func__; |
| if (!callback.get() ) { |
| LOG(ERROR) << "RegisterCallback called with NULL binder. Ignoring."; |
| return; |
| } |
| callbacks_.Register(callback); |
| } |
| |
| void BluetoothBinderServer::UnregisterCallback( |
| const sp<IBluetoothCallback>& callback) { |
| VLOG(2) << __func__; |
| if (!callback.get() ) { |
| LOG(ERROR) << "UnregisterCallback called with NULL binder. Ignoring."; |
| return; |
| } |
| callbacks_.Unregister(callback); |
| } |
| |
| bool BluetoothBinderServer::IsMultiAdvertisementSupported() { |
| VLOG(2) << __func__; |
| return adapter_->IsMultiAdvertisementSupported(); |
| } |
| |
| sp<IBluetoothLowEnergy> |
| BluetoothBinderServer::GetLowEnergyInterface() { |
| VLOG(2) << __func__; |
| |
| if (!adapter_->IsEnabled()) { |
| LOG(ERROR) << "Cannot obtain IBluetoothLowEnergy interface while disabled"; |
| return nullptr; |
| } |
| |
| if (!low_energy_interface_.get()) |
| low_energy_interface_ = new BluetoothLowEnergyBinderServer(adapter_); |
| |
| return low_energy_interface_; |
| } |
| |
| sp<IBluetoothGattClient> |
| BluetoothBinderServer::GetGattClientInterface() { |
| VLOG(2) << __func__; |
| |
| if (!adapter_->IsEnabled()) { |
| LOG(ERROR) << "Cannot obtain IBluetoothGattClient interface while disabled"; |
| return nullptr; |
| } |
| |
| if (!gatt_client_interface_.get()) |
| gatt_client_interface_ = new BluetoothGattClientBinderServer(adapter_); |
| |
| return gatt_client_interface_; |
| } |
| |
| sp<IBluetoothGattServer> |
| BluetoothBinderServer::GetGattServerInterface() { |
| VLOG(2) << __func__; |
| |
| if (!adapter_->IsEnabled()) { |
| LOG(ERROR) << "Cannot obtain IBluetoothGattServer interface while disabled"; |
| return nullptr; |
| } |
| |
| if (!gatt_server_interface_.get()) |
| gatt_server_interface_ = new BluetoothGattServerBinderServer(adapter_); |
| |
| return gatt_server_interface_; |
| } |
| |
| android::status_t BluetoothBinderServer::dump(int fd, const android::Vector<android::String16>& args) { |
| VLOG(2) << __func__ << " called with fd " << fd; |
| if (args.size() > 0) { |
| // TODO (jamuraa): Parse arguments and switch on --proto, --proto_text |
| for (auto x : args) { |
| VLOG(2) << __func__ << "argument: " << x.string(); |
| } |
| } |
| // TODO (jamuraa): enumerate profiles and dump profile information |
| const bt_interface_t *iface = bluetooth::hal::BluetoothInterface::Get()->GetHALInterface(); |
| iface->dump(fd, NULL); |
| return android::NO_ERROR; |
| } |
| |
| void BluetoothBinderServer::OnAdapterStateChanged( |
| bluetooth::Adapter* adapter, |
| bluetooth::AdapterState prev_state, |
| bluetooth::AdapterState new_state) { |
| CHECK_EQ(adapter, adapter_); |
| VLOG(2) << "Received adapter state update - prev: " << prev_state |
| << " new: " << new_state; |
| callbacks_.ForEach([prev_state, new_state](IBluetoothCallback* callback) { |
| callback->OnBluetoothStateChange(prev_state, new_state); |
| }); |
| } |
| |
| } // namespace binder |
| } // namespace ipc |