//
// 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