/*
 * 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 interacting with Bluetooth Low-Energy features.
 */
interface IBluetoothLowEnergy {
  /**
   * Registers a client application that can manage its own Low Energy
   * instance. A special client interface ID will be returned in a callback to
   * the application that can be used to perform Low Energy operations. Returns
   * false in case of an error.
   */
  boolean registerClient(in IBluetoothLowEnergyCallback callback);

  /**
   * Unregisters a previously registered client with "client interface ID"
   * |client_if|.
   */
  void unregisterClient(in int client_if);

  /**
   * Unregisters all previously registered clients.
   */
  void unregisterAll();

  /* Initiates a BLE connection do device with address |address|. If
   * |is_direct| is set, use direct connect procedure. Return true on success,
   * false otherwise.
   */
  boolean Connect(in int client_id, in const char* address,
                  in boolean is_direct);

  /* Disconnect from previously connected BLE device with address |address|.
   * Returns true on success, false otherwise.
   */
  boolean Disconnect(in int client_id, in const char* address);

  /**
   * Sends request to set MTU to |mtu| for the device with address |address|.
   * OnMtuChanged callback will be triggered as a result of this call. Returns
   * true when the command was sent, false otherwise.
   */
   boolean setMtu(in int client_id, in char* address, int mtu);

  /**
   * Initiates a BLE device scan for the scan client with ID |client_id|, using
   * the parameters defined in |settings|. Scan results that are reported to the
   * application with the associated IBluetoothLowEnergyCallback event will be
   * filtered using a combination of hardware and software filtering based on
   * |filters|. Return true on success, false otherwise.
   */
  boolean startScan(in int client_id, in ScanSettings settings,
                    in ScanFilter[] filters);

  /**
   * Stops a previously initiated scan session for the client with ID
   * |client_id|. Return true on success, false otherwise.
   */
  boolean stopScan(in int client_id);

  /**
   * Starts a multi-advertising instance using |advertising_data| and
   * |scan_response_data|, both of which can be empty. Each of these parameters
   * must contain the raw advertising packet. Returns false if there were any
   * synchronous failures, e.g. if the advertising or scan response data are
   * incorrectly formatted. Otherwise, the result of the operation will be
   * asynchronously reported in
   * IBluetoothLowEnergyCallback.onMultiAdvertiseCallback. See the headers in
   * common/bluetooth/binder for documentation on the AdvertiseData and
   * AdvertiseSettings data types.
   */
  boolean startMultiAdvertising(in int client_if,
                                in AdvertiseData advertise_data,
                                in AdvertiseData scan_response_data,
                                in AdvertiseSettings settings);

  /**
   * Stops the previously started multi-advertising instance for the given
   * client. Returns false in case of an error, e.g. this client has not started
   * an instance.
   */
  boolean stopMultiAdvertising(in int client_if);
}
