1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.bluetooth;
18import android.os.ParcelUuid;
19import android.os.RemoteException;
20import android.util.Log;
21
22import java.util.Collections;
23import java.util.List;
24
25
26/**
27 * This class provides the public APIs to set advertising and scan response data when BLE device
28 * operates in peripheral mode. <br>
29 * The exact format is defined in Bluetooth 4.0 specification, Volume 3, Part C, Section 11
30 * @hide
31 */
32public final class BluetoothAdvScanData {
33
34  /**
35   * Available data types of {@link BluetoothAdvScanData}.
36   */
37  public static final int AD = 0;  // Advertising Data
38  public static final int SCAN_RESPONSE = 1;  // Scan Response
39  public static final int EIR = 2;  // Extended Inquiry Response
40
41  private static final String TAG = "BluetoothAdvScanData";
42
43  /**
44   * Data type of BluetoothAdvScanData.
45   */
46  private final int mDataType;
47  /**
48   * Bluetooth Gatt Service.
49   */
50  private IBluetoothGatt mBluetoothGatt;
51
52  /**
53   * @param mBluetoothGatt
54   * @param dataType
55   */
56  public BluetoothAdvScanData(IBluetoothGatt mBluetoothGatt, int dataType) {
57    this.mBluetoothGatt = mBluetoothGatt;
58    this.mDataType = dataType;
59  }
60
61  /**
62   * @return advertising data type.
63   */
64  public int getDataType() {
65    return mDataType;
66  }
67
68  /**
69   * Set manufactureCode and manufactureData.
70   * Returns true if manufacturer data is set, false if there is no enough room to set
71   * manufacturer data or the data is already set.
72   * @param manufacturerCode - unique identifier for the manufacturer
73   * @param manufacturerData - data associated with the specific manufacturer.
74   */
75  public boolean setManufacturerData(int manufacturerCode, byte[] manufacturerData) {
76    if (mDataType != AD) return false;
77    try {
78      return mBluetoothGatt.setAdvManufacturerCodeAndData(manufacturerCode, manufacturerData);
79    } catch (RemoteException e) {
80      Log.e(TAG, "Unable to set manufacturer id and data.", e);
81      return false;
82    }
83  }
84
85  /**
86   * Set service data.  Note the service data can only be set when the data type is {@code AD};
87   * @param serviceData
88   */
89  public boolean setServiceData(byte[] serviceData) {
90
91    if (mDataType != AD) return false;
92    if (serviceData == null) return false;
93    try {
94      return mBluetoothGatt.setAdvServiceData(serviceData);
95    } catch (RemoteException e) {
96      Log.e(TAG, "Unable to set service data.", e);
97      return false;
98    }
99  }
100
101  /**
102   * Returns an immutable list of service uuids that will be advertised.
103   */
104  public List<ParcelUuid> getServiceUuids() {
105    try {
106      return Collections.unmodifiableList(mBluetoothGatt.getAdvServiceUuids());
107    } catch (RemoteException e) {
108      Log.e(TAG, "Unable to get service uuids.", e);
109      return null;
110    }
111  }
112
113  /**
114   * Returns manufacturer data.
115   */
116  public byte[] getManufacturerData() {
117    if (mBluetoothGatt == null) return null;
118    try {
119      return mBluetoothGatt.getAdvManufacturerData();
120    } catch (RemoteException e) {
121      Log.e(TAG, "Unable to get manufacturer data.", e);
122      return null;
123    }
124  }
125
126  /**
127   * Returns service data.
128   */
129  public byte[] getServiceData() {
130    if (mBluetoothGatt == null) return null;
131    try {
132      return mBluetoothGatt.getAdvServiceData();
133    } catch (RemoteException e) {
134      Log.e(TAG, "Unable to get service data.", e);
135      return null;
136    }
137  }
138
139  /**
140   * Remove manufacturer data based on given manufacturer code.
141   * @param manufacturerCode
142   */
143  public void removeManufacturerCodeAndData(int manufacturerCode) {
144    if (mBluetoothGatt != null) {
145      try {
146        mBluetoothGatt.removeAdvManufacturerCodeAndData(manufacturerCode);
147      } catch (RemoteException e) {
148        Log.e(TAG, "Unable to remove manufacturer : " + manufacturerCode, e);
149      }
150    }
151  }
152}
153