16d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang/* 26d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * Copyright (C) 2014 The Android Open Source Project 36d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * 46d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * Licensed under the Apache License, Version 2.0 (the "License"); 56d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * you may not use this file except in compliance with the License. 66d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * You may obtain a copy of the License at 76d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * 86d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * http://www.apache.org/licenses/LICENSE-2.0 96d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * 106d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * Unless required by applicable law or agreed to in writing, software 116d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * distributed under the License is distributed on an "AS IS" BASIS, 126d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * See the License for the specific language governing permissions and 146d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * limitations under the License. 156d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 166d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 176d81118032b92caa0f5cfebe11af02a98f819d5eWei Wangpackage android.bluetooth.le; 186d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 196d81118032b92caa0f5cfebe11af02a98f819d5eWei Wangimport android.annotation.Nullable; 206d81118032b92caa0f5cfebe11af02a98f819d5eWei Wangimport android.os.Parcel; 216d81118032b92caa0f5cfebe11af02a98f819d5eWei Wangimport android.os.ParcelUuid; 226d81118032b92caa0f5cfebe11af02a98f819d5eWei Wangimport android.os.Parcelable; 236bf513d32db7fbc157681bd642e12a201cf20a89Wei Wangimport android.util.ArrayMap; 246bf513d32db7fbc157681bd642e12a201cf20a89Wei Wangimport android.util.SparseArray; 256d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 266d81118032b92caa0f5cfebe11af02a98f819d5eWei Wangimport java.util.ArrayList; 276d81118032b92caa0f5cfebe11af02a98f819d5eWei Wangimport java.util.List; 286bf513d32db7fbc157681bd642e12a201cf20a89Wei Wangimport java.util.Map; 2903259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wangimport java.util.Objects; 306d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 316d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang/** 32685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * Advertise data packet container for Bluetooth LE advertising. This represents the data to be 33af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * advertised as well as the scan response data for active scans. 34685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * <p> 35685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * Use {@link AdvertiseData.Builder} to create an instance of {@link AdvertiseData} to be 366d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * advertised. 376d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * 386d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * @see BluetoothLeAdvertiser 396d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * @see ScanRecord 406d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 41af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wangpublic final class AdvertiseData implements Parcelable { 426d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 436d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang @Nullable 446d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang private final List<ParcelUuid> mServiceUuids; 456d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 466bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang private final SparseArray<byte[]> mManufacturerSpecificData; 476bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang private final Map<ParcelUuid, byte[]> mServiceData; 48685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang private final boolean mIncludeTxPowerLevel; 49685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang private final boolean mIncludeDeviceName; 506d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 51af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang private AdvertiseData(List<ParcelUuid> serviceUuids, 526bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang SparseArray<byte[]> manufacturerData, 536bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang Map<ParcelUuid, byte[]> serviceData, 546bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang boolean includeTxPowerLevel, 55685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang boolean includeDeviceName) { 566d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang mServiceUuids = serviceUuids; 576bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang mManufacturerSpecificData = manufacturerData; 586d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang mServiceData = serviceData; 596d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang mIncludeTxPowerLevel = includeTxPowerLevel; 60685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang mIncludeDeviceName = includeDeviceName; 616d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 626d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 636d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 64af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * Returns a list of service UUIDs within the advertisement that are used to identify the 65af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * Bluetooth GATT services. 666d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 676d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang public List<ParcelUuid> getServiceUuids() { 686d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return mServiceUuids; 696d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 706d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 716d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 726bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang * Returns an array of manufacturer Id and the corresponding manufacturer specific data. The 736bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang * manufacturer id is a non-negative number assigned by Bluetooth SIG. 746d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 756bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang public SparseArray<byte[]> getManufacturerSpecificData() { 766d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return mManufacturerSpecificData; 776d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 786d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 796d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 806bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang * Returns a map of 16-bit UUID and its corresponding service data. 816d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 826bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang public Map<ParcelUuid, byte[]> getServiceData() { 836d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return mServiceData; 846d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 856d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 866d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 876d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * Whether the transmission power level will be included in the advertisement packet. 886d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 896d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang public boolean getIncludeTxPowerLevel() { 906d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return mIncludeTxPowerLevel; 916d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 926d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 93685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang /** 94685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * Whether the device name will be included in the advertisement packet. 95685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang */ 96685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang public boolean getIncludeDeviceName() { 97685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang return mIncludeDeviceName; 98685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang } 99685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang 10003259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang /** 10103259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang * @hide 10203259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang */ 10303259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang @Override 10403259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang public int hashCode() { 1056bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang return Objects.hash(mServiceUuids, mManufacturerSpecificData, mServiceData, 1066bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang mIncludeDeviceName, mIncludeTxPowerLevel); 10703259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang } 10803259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang 10903259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang /** 11003259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang * @hide 11103259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang */ 11203259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang @Override 11303259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang public boolean equals(Object obj) { 11403259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang if (this == obj) { 11503259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang return true; 11603259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang } 11703259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang if (obj == null || getClass() != obj.getClass()) { 11803259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang return false; 11903259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang } 12003259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang AdvertiseData other = (AdvertiseData) obj; 12103259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang return Objects.equals(mServiceUuids, other.mServiceUuids) && 122833559d9f3f0bd6ddb1cf9c1571975751830e045Wei Wang BluetoothLeUtils.equals(mManufacturerSpecificData, other.mManufacturerSpecificData) && 123833559d9f3f0bd6ddb1cf9c1571975751830e045Wei Wang BluetoothLeUtils.equals(mServiceData, other.mServiceData) && 12403259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang mIncludeDeviceName == other.mIncludeDeviceName && 12503259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang mIncludeTxPowerLevel == other.mIncludeTxPowerLevel; 12603259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang } 12703259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang 1286d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang @Override 1296d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang public String toString() { 1306bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mManufacturerSpecificData=" 131833559d9f3f0bd6ddb1cf9c1571975751830e045Wei Wang + BluetoothLeUtils.toString(mManufacturerSpecificData) + ", mServiceData=" 132833559d9f3f0bd6ddb1cf9c1571975751830e045Wei Wang + BluetoothLeUtils.toString(mServiceData) 13303259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang + ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName=" 13403259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang + mIncludeDeviceName + "]"; 1356d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 1366d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 1376d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang @Override 1386d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang public int describeContents() { 1396d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return 0; 1406d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 1416d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 1426d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang @Override 1436d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang public void writeToParcel(Parcel dest, int flags) { 14403259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang dest.writeList(mServiceUuids); 1456d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 1466bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang // mManufacturerSpecificData could not be null. 1476bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(mManufacturerSpecificData.size()); 1486bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang for (int i = 0; i < mManufacturerSpecificData.size(); ++i) { 1496bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(mManufacturerSpecificData.keyAt(i)); 1506bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang byte[] data = mManufacturerSpecificData.valueAt(i); 1516bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang if (data == null) { 1526bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(0); 1536bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang } else { 1546bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(1); 1556bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(data.length); 1566bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeByteArray(data); 1576bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang } 1586d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 1596bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(mServiceData.size()); 1606bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang for (ParcelUuid uuid : mServiceData.keySet()) { 1616bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeParcelable(uuid, flags); 1626bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang byte[] data = mServiceData.get(uuid); 1636bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang if (data == null) { 1646bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(0); 1656bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang } else { 1666bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(1); 1676bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeInt(data.length); 1686bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang dest.writeByteArray(data); 1696bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang } 1706d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 1716d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang dest.writeByte((byte) (getIncludeTxPowerLevel() ? 1 : 0)); 172685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang dest.writeByte((byte) (getIncludeDeviceName() ? 1 : 0)); 1736d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 1746d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 175af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang public static final Parcelable.Creator<AdvertiseData> CREATOR = 176af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang new Creator<AdvertiseData>() { 1776d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang @Override 178af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang public AdvertiseData[] newArray(int size) { 179af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang return new AdvertiseData[size]; 1806d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 1816d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 1826d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang @Override 183af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang public AdvertiseData createFromParcel(Parcel in) { 1846d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang Builder builder = new Builder(); 1850e81ca25432b3606eba841206b7a4a6ed74bd54bWei Wang @SuppressWarnings("unchecked") 18603259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang List<ParcelUuid> uuids = in.readArrayList(ParcelUuid.class.getClassLoader()); 18703259472b19fef586f5eec5d4e7d61c34a6cd298Wei Wang if (uuids != null) { 188685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang for (ParcelUuid uuid : uuids) { 189685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang builder.addServiceUuid(uuid); 190685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang } 1916d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 1926bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang int manufacturerSize = in.readInt(); 1936bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang for (int i = 0; i < manufacturerSize; ++i) { 1946bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang int manufacturerId = in.readInt(); 1956bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang if (in.readInt() == 1) { 1966bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang int manufacturerDataLength = in.readInt(); 1976bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang byte[] manufacturerData = new byte[manufacturerDataLength]; 1986bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang in.readByteArray(manufacturerData); 1996bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang builder.addManufacturerData(manufacturerId, manufacturerData); 2006bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang } 2016d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2026bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang int serviceDataSize = in.readInt(); 2036bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang for (int i = 0; i < serviceDataSize; ++i) { 2046bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang ParcelUuid serviceDataUuid = in.readParcelable( 2056bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang ParcelUuid.class.getClassLoader()); 2066bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang if (in.readInt() == 1) { 2076bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang int serviceDataLength = in.readInt(); 2086bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang byte[] serviceData = new byte[serviceDataLength]; 2096bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang in.readByteArray(serviceData); 2106bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang builder.addServiceData(serviceDataUuid, serviceData); 2116bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang } 2126d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2136d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang builder.setIncludeTxPowerLevel(in.readByte() == 1); 214685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang builder.setIncludeDeviceName(in.readByte() == 1); 2156d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return builder.build(); 2166d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2176d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang }; 2186d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 2196d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 220af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * Builder for {@link AdvertiseData}. 2216d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 2226d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang public static final class Builder { 2236d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang @Nullable 224685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang private List<ParcelUuid> mServiceUuids = new ArrayList<ParcelUuid>(); 2256bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang private SparseArray<byte[]> mManufacturerSpecificData = new SparseArray<byte[]>(); 2266bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang private Map<ParcelUuid, byte[]> mServiceData = new ArrayMap<ParcelUuid, byte[]>(); 227685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang private boolean mIncludeTxPowerLevel; 228685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang private boolean mIncludeDeviceName; 2296d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 2306d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 231685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * Add a service UUID to advertise data. 232af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * 233685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * @param serviceUuid A service UUID to be advertised. 2346d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * @throws IllegalArgumentException If the {@code serviceUuids} are null. 2356d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 236685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang public Builder addServiceUuid(ParcelUuid serviceUuid) { 237685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang if (serviceUuid == null) { 2386d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang throw new IllegalArgumentException("serivceUuids are null"); 2396d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 240685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang mServiceUuids.add(serviceUuid); 2416d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return this; 2426d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2436d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 2446d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 245685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * Add service data to advertise data. 2466d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * 247af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * @param serviceDataUuid 16-bit UUID of the service the data is associated with 248af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * @param serviceData Service data 2496d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * @throws IllegalArgumentException If the {@code serviceDataUuid} or {@code serviceData} is 2506d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * empty. 2516d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 2526bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang public Builder addServiceData(ParcelUuid serviceDataUuid, byte[] serviceData) { 2536d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang if (serviceDataUuid == null || serviceData == null) { 2546d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang throw new IllegalArgumentException( 2556d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang "serviceDataUuid or serviceDataUuid is null"); 2566d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2576bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang mServiceData.put(serviceDataUuid, serviceData); 2586d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return this; 2596d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2606d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 2616d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 2626bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang * Add manufacturer specific data. 263685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * <p> 264685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * Please refer to the Bluetooth Assigned Numbers document provided by the <a 265685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * href="https://www.bluetooth.org">Bluetooth SIG</a> for a list of existing company 266685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * identifiers. 2676d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * 268af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * @param manufacturerId Manufacturer ID assigned by Bluetooth SIG. 269af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * @param manufacturerSpecificData Manufacturer specific data 2706d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * @throws IllegalArgumentException If the {@code manufacturerId} is negative or 2716d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang * {@code manufacturerSpecificData} is null. 2726d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 2736bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang public Builder addManufacturerData(int manufacturerId, byte[] manufacturerSpecificData) { 2746d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang if (manufacturerId < 0) { 2756d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang throw new IllegalArgumentException( 2766d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang "invalid manufacturerId - " + manufacturerId); 2776d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2786d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang if (manufacturerSpecificData == null) { 2796d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang throw new IllegalArgumentException("manufacturerSpecificData is null"); 2806d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2816bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang mManufacturerSpecificData.put(manufacturerId, manufacturerSpecificData); 2826d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return this; 2836d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2846d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 2856d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 286685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * Whether the transmission power level should be included in the advertise packet. Tx power 287685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * level field takes 3 bytes in advertise packet. 2886d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 2896d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang public Builder setIncludeTxPowerLevel(boolean includeTxPowerLevel) { 2906d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang mIncludeTxPowerLevel = includeTxPowerLevel; 2916d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang return this; 2926d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 2936d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang 2946d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang /** 295685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang * Set whether the device name should be included in advertise packet. 296685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang */ 297685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang public Builder setIncludeDeviceName(boolean includeDeviceName) { 298685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang mIncludeDeviceName = includeDeviceName; 299685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang return this; 300685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang } 301685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang 302685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang /** 303af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang * Build the {@link AdvertiseData}. 3046d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang */ 305af74e66e29a518157cb78fcef4b4fc532b7f60b0Wei Wang public AdvertiseData build() { 3066bf513d32db7fbc157681bd642e12a201cf20a89Wei Wang return new AdvertiseData(mServiceUuids, mManufacturerSpecificData, mServiceData, 307685c1758902a42a7beb030d8bbaed3f7ce6f6135Wei Wang mIncludeTxPowerLevel, mIncludeDeviceName); 3086d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 3096d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang } 3106d81118032b92caa0f5cfebe11af02a98f819d5eWei Wang} 311