/*
 * Copyright (C) 2015, The Android Open Source Project
 *
 * 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.
 */

/**
 * Binder IPC API for talking with the Bluetooth service and perform high-level
 * operations on the adapter.
 */
interface IBluetooth {
  /**
   * Returns true if the Bluetooth adapter is powered and ready to use. This
   * is equivalent to "getState() == ADAPTER_STATE_ON".
   */
  boolean isEnabled();

  /**
   * Returns the current Bluetooth adapter state. The return value can be one of
   * the following:
   *
   *  - ADAPTER_STATE_OFF = 10
   *  - ADAPTER_STATE_TURNING_ON = 11
   *  - ADAPTER_STATE_ON = 12
   *  - ADAPTER_STATE_TURNING_OFF = 13
   */
  int getState();

  /**
   * Turns on the Bluetooth radio. This function initiates the procedure to
   * bring the adapter state from ADAPTER_STATE_OFF to ADAPTER_STATE_ON. Returns
   * false, if the state is not ADAPTER_STATE_OFF or if there is an error while
   * initiating the operation. On success, the adapter state will be
   * asynchronously updated to ADAPTER_STATE_TURNING_ON and eventually to
   * ADAPTER_STATE_ON. Callers can monitor the status of this call by observing
   * the IBluetoothCallback.onBluetoothStateChange callback.
   */
  boolean enable();

  /**
   * Turns off the Bluetooth radio. This function initiates the procedure to
   * bring the adapter state from ADAPTER_STATE_ON to ADAPTER_STATE_OFF. Returns
   * false, if the state is not ADAPTER_STATE_ON or if there is an error while
   * initiating the operation. On success, the adapter state will be
   * asynchronously updated to ADAPTER_STATE_TURNING_OFF and eventually to
   * ADAPTER_STATE_OFF. Callers can monitor the status of this call by observing
   * the IBluetoothCallback.onBluetoothStateChange callback.
   */
  boolean disable();

  /**
   * Returns the identity Bluetooth Device Address (BD_ADDR) assigned to the
   * underlying Bluetooth controller. Returns a string of the form
   * "XX:XX:XX:XX:XX:XX", where each "X" is a hexadecimal digit. Returns
   * "00:00:00:00:00:00" if the address is not known, which is usually the case
   * before the adapter is enabled for the first time.
   */
  String getAddress();

  /**
   * Sets the name assigned to the Bluetooth adapter. This is the name that will
   * be seen by remote devices during discovery. Returns false if the operation
   * fails.
   */
  boolean setName(in String name);

  /**
   * Returns the current name assigned to the Bluetooth adapter. This is the
   * name that is seen by remote devices during discovery. If the controller has
   * not been initialized yet (before the first time it gets enabled), this will
   * return "not-initialized".
   */
  String getName();

  /**
   * Registers a callback receiver which can be used to listen to state updates
   * from the adapter. The Bluetooth daemon will automatically register this if
   * the owning process dies.
   */
  void registerCallback(in IBluetoothCallback callback);

  /**
   * Unregisters a previously registered callback.
   */
  void unregisterCallback(in IBluetoothCallback callback);

  /**
   * Returns true, if the multi-advertisement feature is supported. Returns
   * false, if this device can only advertise a single instance.
   */
  boolean isMultiAdvertisementSupported();

  /**
   * Returns a binder that can be used to interact with Low-Energy features.
   */
  IBluetoothLowEnergy getLowEnergyInterface();

  /**
   * Returns a binder that can be used to interact with GATT client-role
   * features.
   */
  IBluetoothGattClient getGattClientInterface();

  /**
   * Returns a binder that can be used to interact with GATT server-role
   * features.
   */
  IBluetoothGattServer getGattServerInterface();
}
