text: //
  //  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.
  //
  
  #pragma once
  
  #include <string>
  #include <vector>
  
  #include <base/macros.h>
  #include <utils/String16.h>
  #include <utils/Vector.h>
  
  #include "service/adapter.h"
  #include "service/common/bluetooth/binder/IBluetooth.h"
  #include "service/common/bluetooth/binder/IBluetoothCallback.h"
  #include "service/common/bluetooth/binder/IBluetoothGattClient.h"
  #include "service/common/bluetooth/binder/IBluetoothGattServer.h"
  #include "service/common/bluetooth/binder/IBluetoothLowEnergy.h"
  #include "service/common/bluetooth/uuid.h"
  #include "service/ipc/binder/remote_callback_list.h"
  
  namespace ipc {
  namespace binder {
  
  // Implements the server side of the IBluetooth Binder interface.
  class BluetoothBinderServer : public BnBluetooth,
                                public bluetooth::Adapter::Observer {
   public:
    explicit BluetoothBinderServer(bluetooth::Adapter* adapter);
    ~BluetoothBinderServer() override;
  
    // IBluetooth overrides:
    bool IsEnabled() override;
    int GetState() override;
    bool Enable(bool start_restricted) override;
    bool EnableNoAutoConnect() override;
    bool Disable() override;
  
    std::string GetAddress() override;
    std::vector<bluetooth::UUID> GetUUIDs() override;
    bool SetName(const std::string& name) override;
    std::string GetName() override;
  
    void RegisterCallback(
        const android::sp<IBluetoothCallback>& callback) override;
    void UnregisterCallback(
        const android::sp<IBluetoothCallback>& callback) override;
  
    bool IsMultiAdvertisementSupported() override;
    android::sp<IBluetoothLowEnergy> GetLowEnergyInterface() override;
    android::sp<IBluetoothGattClient> GetGattClientInterface() override;
    android::sp<IBluetoothGattServer> GetGattServerInterface() override;
  
    android::status_t dump(int fd, const android::Vector<android::String16>& args) override;
    // bluetooth::Adapter::Observer overrides:
    void OnAdapterStateChanged(bluetooth::Adapter* adapter,
                               bluetooth::AdapterState prev_state,
                               bluetooth::AdapterState new_state) override;
  
   private:
    bluetooth::Adapter* adapter_;  // weak
    RemoteCallbackList<IBluetoothCallback> callbacks_;
  
    // The IBluetoothLowEnergy interface handle. This is lazily initialized on the
    // first call to GetLowEnergyInterface().
    android::sp<IBluetoothLowEnergy> low_energy_interface_;
  
    // The IBluetoothGattClient interface handle. This is lazily initialized on
    // the first call to GetGattClientInterface().
    android::sp<IBluetoothGattClient> gatt_client_interface_;
  
    // The IBluetoothGattServer interface handle. This is lazily initialized on
    // the first call to GetGattServerInterface().
    android::sp<IBluetoothGattServer> gatt_server_interface_;
  
    DISALLOW_COPY_AND_ASSIGN(BluetoothBinderServer);
  };
  
  }  // namespace binder
  }  // namespace ipc
  