/*
 * Copyright 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();
}
