diff options
| author | 2017-04-01 15:28:29 +0000 | |
|---|---|---|
| committer | 2017-04-01 15:28:34 +0000 | |
| commit | 187e0108ff92ca9263887a8b7f0d44131bf0b7be (patch) | |
| tree | 1a4bbb5a8ea0d780c593ee4a1f82750907ee0759 | |
| parent | 28119285e83277a2f383528c89512f49d5f4de0e (diff) | |
| parent | 260846b31b26e74fbcbc61ec052aaa8f3407e517 (diff) | |
Merge changes from topic 'bt5-cherry-pickery-1' into oc-dev
* changes:
Bluetooth 5 advertising duration refactoring (4/4)
Bluetooth LE Advertising minor improvements
Fix advertise data size estimation
Hide periodic scanning
Bluetooth API spelling fixes ("wether" -> "whether")
| -rw-r--r-- | api/current.txt | 37 | ||||
| -rw-r--r-- | api/system-current.txt | 37 | ||||
| -rw-r--r-- | api/test-current.txt | 37 | ||||
| -rw-r--r-- | core/java/android/bluetooth/BluetoothAdapter.java | 1 | ||||
| -rw-r--r-- | core/java/android/bluetooth/BluetoothGatt.java | 2 | ||||
| -rw-r--r-- | core/java/android/bluetooth/BluetoothGattServer.java | 2 | ||||
| -rw-r--r-- | core/java/android/bluetooth/IBluetoothGatt.aidl | 5 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/AdvertisingSet.java | 49 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/AdvertisingSetParameters.java | 45 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/BluetoothLeAdvertiser.java | 235 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/PeriodicAdvertisingCallback.java | 1 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/PeriodicAdvertisingManager.java | 1 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java | 2 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/PeriodicAdvertisingReport.java | 1 |
14 files changed, 274 insertions, 181 deletions
diff --git a/api/current.txt b/api/current.txt index 5074ab299323..392b60dc9c80 100644 --- a/api/current.txt +++ b/api/current.txt @@ -7148,7 +7148,6 @@ package android.bluetooth { method public static synchronized android.bluetooth.BluetoothAdapter getDefaultAdapter(); method public int getLeMaximumAdvertisingDataLength(); method public java.lang.String getName(); - method public android.bluetooth.le.PeriodicAdvertisingManager getPeriodicAdvertisingManager(); method public int getProfileConnectionState(int); method public boolean getProfileProxy(android.content.Context, android.bluetooth.BluetoothProfile.ServiceListener, int); method public android.bluetooth.BluetoothDevice getRemoteDevice(java.lang.String); @@ -7948,7 +7947,7 @@ package android.bluetooth.le { } public final class AdvertisingSet { - method public void enableAdvertising(boolean, int); + method public void enableAdvertising(boolean, int, int); method public void setAdvertisingData(android.bluetooth.le.AdvertiseData); method public void setAdvertisingParameters(android.bluetooth.le.AdvertisingSetParameters); method public void setPeriodicAdvertisingData(android.bluetooth.le.AdvertiseData); @@ -8024,8 +8023,8 @@ package android.bluetooth.le { method public void startAdvertising(android.bluetooth.le.AdvertiseSettings, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseCallback); method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertisingSetCallback); method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); - method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, android.bluetooth.le.AdvertisingSetCallback); - method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); + method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, int, android.bluetooth.le.AdvertisingSetCallback); + method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, int, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); method public void stopAdvertising(android.bluetooth.le.AdvertiseCallback); method public void stopAdvertisingSet(android.bluetooth.le.AdvertisingSetCallback); } @@ -8037,21 +8036,6 @@ package android.bluetooth.le { method public void stopScan(android.bluetooth.le.ScanCallback); } - public abstract class PeriodicAdvertisingCallback { - ctor public PeriodicAdvertisingCallback(); - method public void onPeriodicAdvertisingReport(android.bluetooth.le.PeriodicAdvertisingReport); - method public void onSyncEstablished(int, android.bluetooth.BluetoothDevice, int, int, int, int); - method public void onSyncLost(int); - field public static final int SYNC_NO_RESOURCES = 2; // 0x2 - field public static final int SYNC_NO_RESPONSE = 1; // 0x1 - } - - public final class PeriodicAdvertisingManager { - method public void registerSync(android.bluetooth.le.ScanResult, int, int, android.bluetooth.le.PeriodicAdvertisingCallback); - method public void registerSync(android.bluetooth.le.ScanResult, int, int, android.bluetooth.le.PeriodicAdvertisingCallback, android.os.Handler); - method public void unregisterSync(android.bluetooth.le.PeriodicAdvertisingCallback); - } - public final class PeriodicAdvertisingParameters implements android.os.Parcelable { method public int describeContents(); method public boolean getEnable(); @@ -8069,21 +8053,6 @@ package android.bluetooth.le { method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setInterval(int); } - public final class PeriodicAdvertisingReport implements android.os.Parcelable { - ctor public PeriodicAdvertisingReport(int, int, int, int, android.bluetooth.le.ScanRecord); - method public int describeContents(); - method public android.bluetooth.le.ScanRecord getData(); - method public int getDataStatus(); - method public int getRssi(); - method public int getSyncHandle(); - method public long getTimestampNanos(); - method public int getTxPower(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.bluetooth.le.PeriodicAdvertisingReport> CREATOR; - field public static final int DATA_COMPLETE = 0; // 0x0 - field public static final int DATA_INCOMPLETE_TRUNCATED = 2; // 0x2 - } - public abstract class ScanCallback { ctor public ScanCallback(); method public void onBatchScanResults(java.util.List<android.bluetooth.le.ScanResult>); diff --git a/api/system-current.txt b/api/system-current.txt index 9120e55fe35a..ac1597f0162a 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7608,7 +7608,6 @@ package android.bluetooth { method public static synchronized android.bluetooth.BluetoothAdapter getDefaultAdapter(); method public int getLeMaximumAdvertisingDataLength(); method public java.lang.String getName(); - method public android.bluetooth.le.PeriodicAdvertisingManager getPeriodicAdvertisingManager(); method public int getProfileConnectionState(int); method public boolean getProfileProxy(android.content.Context, android.bluetooth.BluetoothProfile.ServiceListener, int); method public android.bluetooth.BluetoothDevice getRemoteDevice(java.lang.String); @@ -8414,7 +8413,7 @@ package android.bluetooth.le { } public final class AdvertisingSet { - method public void enableAdvertising(boolean, int); + method public void enableAdvertising(boolean, int, int); method public void setAdvertisingData(android.bluetooth.le.AdvertiseData); method public void setAdvertisingParameters(android.bluetooth.le.AdvertisingSetParameters); method public void setPeriodicAdvertisingData(android.bluetooth.le.AdvertiseData); @@ -8490,8 +8489,8 @@ package android.bluetooth.le { method public void startAdvertising(android.bluetooth.le.AdvertiseSettings, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseCallback); method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertisingSetCallback); method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); - method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, android.bluetooth.le.AdvertisingSetCallback); - method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); + method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, int, android.bluetooth.le.AdvertisingSetCallback); + method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, int, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); method public void stopAdvertising(android.bluetooth.le.AdvertiseCallback); method public void stopAdvertisingSet(android.bluetooth.le.AdvertisingSetCallback); } @@ -8506,21 +8505,6 @@ package android.bluetooth.le { method public void stopScan(android.bluetooth.le.ScanCallback); } - public abstract class PeriodicAdvertisingCallback { - ctor public PeriodicAdvertisingCallback(); - method public void onPeriodicAdvertisingReport(android.bluetooth.le.PeriodicAdvertisingReport); - method public void onSyncEstablished(int, android.bluetooth.BluetoothDevice, int, int, int, int); - method public void onSyncLost(int); - field public static final int SYNC_NO_RESOURCES = 2; // 0x2 - field public static final int SYNC_NO_RESPONSE = 1; // 0x1 - } - - public final class PeriodicAdvertisingManager { - method public void registerSync(android.bluetooth.le.ScanResult, int, int, android.bluetooth.le.PeriodicAdvertisingCallback); - method public void registerSync(android.bluetooth.le.ScanResult, int, int, android.bluetooth.le.PeriodicAdvertisingCallback, android.os.Handler); - method public void unregisterSync(android.bluetooth.le.PeriodicAdvertisingCallback); - } - public final class PeriodicAdvertisingParameters implements android.os.Parcelable { method public int describeContents(); method public boolean getEnable(); @@ -8538,21 +8522,6 @@ package android.bluetooth.le { method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setInterval(int); } - public final class PeriodicAdvertisingReport implements android.os.Parcelable { - ctor public PeriodicAdvertisingReport(int, int, int, int, android.bluetooth.le.ScanRecord); - method public int describeContents(); - method public android.bluetooth.le.ScanRecord getData(); - method public int getDataStatus(); - method public int getRssi(); - method public int getSyncHandle(); - method public long getTimestampNanos(); - method public int getTxPower(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.bluetooth.le.PeriodicAdvertisingReport> CREATOR; - field public static final int DATA_COMPLETE = 0; // 0x0 - field public static final int DATA_INCOMPLETE_TRUNCATED = 2; // 0x2 - } - public final class ResultStorageDescriptor implements android.os.Parcelable { ctor public ResultStorageDescriptor(int, int, int); method public int describeContents(); diff --git a/api/test-current.txt b/api/test-current.txt index 06a1221027d0..fc3c9e74e440 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -7178,7 +7178,6 @@ package android.bluetooth { method public static synchronized android.bluetooth.BluetoothAdapter getDefaultAdapter(); method public int getLeMaximumAdvertisingDataLength(); method public java.lang.String getName(); - method public android.bluetooth.le.PeriodicAdvertisingManager getPeriodicAdvertisingManager(); method public int getProfileConnectionState(int); method public boolean getProfileProxy(android.content.Context, android.bluetooth.BluetoothProfile.ServiceListener, int); method public android.bluetooth.BluetoothDevice getRemoteDevice(java.lang.String); @@ -7978,7 +7977,7 @@ package android.bluetooth.le { } public final class AdvertisingSet { - method public void enableAdvertising(boolean, int); + method public void enableAdvertising(boolean, int, int); method public void setAdvertisingData(android.bluetooth.le.AdvertiseData); method public void setAdvertisingParameters(android.bluetooth.le.AdvertisingSetParameters); method public void setPeriodicAdvertisingData(android.bluetooth.le.AdvertiseData); @@ -8054,8 +8053,8 @@ package android.bluetooth.le { method public void startAdvertising(android.bluetooth.le.AdvertiseSettings, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseCallback); method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertisingSetCallback); method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); - method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, android.bluetooth.le.AdvertisingSetCallback); - method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); + method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, int, android.bluetooth.le.AdvertisingSetCallback); + method public void startAdvertisingSet(android.bluetooth.le.AdvertisingSetParameters, android.bluetooth.le.AdvertiseData, android.bluetooth.le.AdvertiseData, android.bluetooth.le.PeriodicAdvertisingParameters, android.bluetooth.le.AdvertiseData, int, int, android.bluetooth.le.AdvertisingSetCallback, android.os.Handler); method public void stopAdvertising(android.bluetooth.le.AdvertiseCallback); method public void stopAdvertisingSet(android.bluetooth.le.AdvertisingSetCallback); } @@ -8067,21 +8066,6 @@ package android.bluetooth.le { method public void stopScan(android.bluetooth.le.ScanCallback); } - public abstract class PeriodicAdvertisingCallback { - ctor public PeriodicAdvertisingCallback(); - method public void onPeriodicAdvertisingReport(android.bluetooth.le.PeriodicAdvertisingReport); - method public void onSyncEstablished(int, android.bluetooth.BluetoothDevice, int, int, int, int); - method public void onSyncLost(int); - field public static final int SYNC_NO_RESOURCES = 2; // 0x2 - field public static final int SYNC_NO_RESPONSE = 1; // 0x1 - } - - public final class PeriodicAdvertisingManager { - method public void registerSync(android.bluetooth.le.ScanResult, int, int, android.bluetooth.le.PeriodicAdvertisingCallback); - method public void registerSync(android.bluetooth.le.ScanResult, int, int, android.bluetooth.le.PeriodicAdvertisingCallback, android.os.Handler); - method public void unregisterSync(android.bluetooth.le.PeriodicAdvertisingCallback); - } - public final class PeriodicAdvertisingParameters implements android.os.Parcelable { method public int describeContents(); method public boolean getEnable(); @@ -8099,21 +8083,6 @@ package android.bluetooth.le { method public android.bluetooth.le.PeriodicAdvertisingParameters.Builder setInterval(int); } - public final class PeriodicAdvertisingReport implements android.os.Parcelable { - ctor public PeriodicAdvertisingReport(int, int, int, int, android.bluetooth.le.ScanRecord); - method public int describeContents(); - method public android.bluetooth.le.ScanRecord getData(); - method public int getDataStatus(); - method public int getRssi(); - method public int getSyncHandle(); - method public long getTimestampNanos(); - method public int getTxPower(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.bluetooth.le.PeriodicAdvertisingReport> CREATOR; - field public static final int DATA_COMPLETE = 0; // 0x0 - field public static final int DATA_INCOMPLETE_TRUNCATED = 2; // 0x2 - } - public abstract class ScanCallback { ctor public ScanCallback(); method public void onBatchScanResults(java.util.List<android.bluetooth.le.ScanResult>); diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java index 4e1e42da4fe7..845a47d99842 100644 --- a/core/java/android/bluetooth/BluetoothAdapter.java +++ b/core/java/android/bluetooth/BluetoothAdapter.java @@ -638,6 +638,7 @@ public final class BluetoothAdapter { * <p> * Use {@link #isLePeriodicAdvertisingSupported()} to check whether LE Periodic Advertising is * supported on this device before calling this method. + * @hide */ public PeriodicAdvertisingManager getPeriodicAdvertisingManager() { if (!getLeAccess()) diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java index aa61ce282c02..5d1e8ec58ceb 100644 --- a/core/java/android/bluetooth/BluetoothGatt.java +++ b/core/java/android/bluetooth/BluetoothGatt.java @@ -778,7 +778,7 @@ public final class BluetoothGatt implements BluetoothProfile { /** * Set the preferred connection PHY for this app. Please note that this is just a - * recommendation, wether the PHY change will happen depends on other applications peferences, + * recommendation, whether the PHY change will happen depends on other applications peferences, * local and remote controller capabilities. Controller can override these settings. * <p> * {@link BluetoothGattCallback#onPhyUpdate} will be triggered as a result of this call, even diff --git a/core/java/android/bluetooth/BluetoothGattServer.java b/core/java/android/bluetooth/BluetoothGattServer.java index b35a59335939..2df2ed8ff86f 100644 --- a/core/java/android/bluetooth/BluetoothGattServer.java +++ b/core/java/android/bluetooth/BluetoothGattServer.java @@ -550,7 +550,7 @@ public final class BluetoothGattServer implements BluetoothProfile { /** * Set the preferred connection PHY for this app. Please note that this is just a - * recommendation, wether the PHY change will happen depends on other applications peferences, + * recommendation, whether the PHY change will happen depends on other applications peferences, * local and remote controller capabilities. Controller can override these settings. * <p> * {@link BluetoothGattServerCallback#onPhyUpdate} will be triggered as a result of this call, even diff --git a/core/java/android/bluetooth/IBluetoothGatt.aidl b/core/java/android/bluetooth/IBluetoothGatt.aidl index 0825ee88a456..334e88b69fde 100644 --- a/core/java/android/bluetooth/IBluetoothGatt.aidl +++ b/core/java/android/bluetooth/IBluetoothGatt.aidl @@ -52,10 +52,11 @@ interface IBluetoothGatt { void startAdvertisingSet(in AdvertisingSetParameters parameters, in AdvertiseData advertiseData, in AdvertiseData scanResponse, in PeriodicAdvertisingParameters periodicParameters, - in AdvertiseData periodicData, in int timeout, in IAdvertisingSetCallback callback); + in AdvertiseData periodicData, in int duration, in int maxExtAdvEvents, + in IAdvertisingSetCallback callback); void stopAdvertisingSet(in IAdvertisingSetCallback callback); - void enableAdvertisingSet(in int advertiserId, in boolean enable, in int timeout); + void enableAdvertisingSet(in int advertiserId, in boolean enable, in int duration, in int maxExtAdvEvents); void setAdvertisingData(in int advertiserId, in AdvertiseData data); void setScanResponseData(in int advertiserId, in AdvertiseData data); void setAdvertisingParameters(in int advertiserId, in AdvertisingSetParameters parameters); diff --git a/core/java/android/bluetooth/le/AdvertisingSet.java b/core/java/android/bluetooth/le/AdvertisingSet.java index 7355b0d4c763..51571b2746a4 100644 --- a/core/java/android/bluetooth/le/AdvertisingSet.java +++ b/core/java/android/bluetooth/le/AdvertisingSet.java @@ -16,6 +16,7 @@ package android.bluetooth.le; +import android.bluetooth.BluetoothAdapter; import android.bluetooth.IBluetoothGatt; import android.bluetooth.IBluetoothManager; import android.bluetooth.le.IAdvertisingSetCallback; @@ -57,15 +58,23 @@ public final class AdvertisingSet { /** * Enables Advertising. This method returns immediately, the operation status is - * delivered - * through {@code callback.onAdvertisingEnabled()}. + * delivered through {@code callback.onAdvertisingEnabled()}. * <p> * Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} * + * @param enable whether the advertising should be enabled (true), or disabled (false) + * @param duration advertising duration, in 10ms unit. Valid range is from 1 (10ms) to + * 65535 (655,350 ms) + * @param maxExtendedAdvertisingEvents maximum number of extended advertising events the + * controller shall attempt to send prior to terminating the extended + * advertising, even if the duration has not expired. Valid range is + * from 1 to 255. */ - public void enableAdvertising(boolean enable, int timeout) { + public void enableAdvertising(boolean enable, int duration, + int maxExtendedAdvertisingEvents) { try { - gatt.enableAdvertisingSet(this.advertiserId, enable, timeout); + gatt.enableAdvertisingSet(this.advertiserId, enable, duration, + maxExtendedAdvertisingEvents); } catch (RemoteException e) { Log.e(TAG, "remote exception - ", e); } @@ -77,10 +86,16 @@ public final class AdvertisingSet { * delivered through {@code callback.onAdvertisingDataSet()}. * <p> * Advertising data must be empty if non-legacy scannable advertising is used. + * + * @param advertiseData Advertisement data to be broadcasted. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. If the + * advertisement is connectable, three bytes will be added for flags. If the + * update takes place when the advertising set is enabled, the data can be + * maximum 251 bytes long. */ - public void setAdvertisingData(AdvertiseData data) { + public void setAdvertisingData(AdvertiseData advertiseData) { try { - gatt.setAdvertisingData(this.advertiserId, data); + gatt.setAdvertisingData(this.advertiserId, advertiseData); } catch (RemoteException e) { Log.e(TAG, "remote exception - ", e); } @@ -90,10 +105,15 @@ public final class AdvertisingSet { * Set/update scan response data. Make sure that data doesn't exceed the size limit for * specified AdvertisingSetParameters. This method returns immediately, the operation status * is delivered through {@code callback.onScanResponseDataSet()}. + * + * @param scanResponse Scan response associated with the advertisement data. Size must not + * exceed {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. If the + * update takes place when the advertising set is enabled, the data can be + * maximum 251 bytes long. */ - public void setScanResponseData(AdvertiseData data) { + public void setScanResponseData(AdvertiseData scanResponse) { try { - gatt.setScanResponseData(this.advertiserId, data); + gatt.setScanResponseData(this.advertiserId, scanResponse); } catch (RemoteException e) { Log.e(TAG, "remote exception - ", e); } @@ -103,6 +123,8 @@ public final class AdvertisingSet { * Update advertising parameters associated with this AdvertisingSet. Must be called when * advertising is not active. This method returns immediately, the operation status is delivered * through {@code callback.onAdvertisingParametersUpdated}. + * + * @param parameters advertising set parameters. */ public void setAdvertisingParameters(AdvertisingSetParameters parameters) { try { @@ -130,10 +152,15 @@ public final class AdvertisingSet { * or after advertising was started with periodic advertising data set. This method returns * immediately, the operation status is delivered through * {@code callback.onPeriodicAdvertisingDataSet()}. + * + * @param periodicData Periodic advertising data. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. If the + * update takes place when the periodic advertising is enabled for this set, + * the data can be maximum 251 bytes long. */ - public void setPeriodicAdvertisingData(AdvertiseData data) { + public void setPeriodicAdvertisingData(AdvertiseData periodicData) { try { - gatt.setPeriodicAdvertisingData(this.advertiserId, data); + gatt.setPeriodicAdvertisingData(this.advertiserId, periodicData); } catch (RemoteException e) { Log.e(TAG, "remote exception - ", e); } @@ -142,6 +169,8 @@ public final class AdvertisingSet { /** * Used to enable/disable periodic advertising. This method returns immediately, the operation * status is delivered through {@code callback.onPeriodicAdvertisingEnable()}. + * + * @param enable whether the periodic advertising should be enabled (true), or disabled (false). */ public void setPeriodicAdvertisingEnable(boolean enable) { try { diff --git a/core/java/android/bluetooth/le/AdvertisingSetParameters.java b/core/java/android/bluetooth/le/AdvertisingSetParameters.java index fe1f425c4fc1..f5c1f08562f6 100644 --- a/core/java/android/bluetooth/le/AdvertisingSetParameters.java +++ b/core/java/android/bluetooth/le/AdvertisingSetParameters.java @@ -16,6 +16,7 @@ package android.bluetooth.le; +import android.bluetooth.BluetoothAdapter; import android.os.Parcel; import android.os.Parcelable; @@ -279,7 +280,7 @@ public final class AdvertisingSetParameters implements Parcelable { * When set to true, advertising set will advertise 4.x Spec compliant * advertisements. * - * @param isLegacy wether legacy advertising mode should be used. + * @param isLegacy whether legacy advertising mode should be used. */ public Builder setLegacyMode(boolean isLegacy) { this.isLegacy = isLegacy; @@ -287,12 +288,12 @@ public final class AdvertisingSetParameters implements Parcelable { } /** - * Set wether advertiser address should be ommited from all packets. If this + * Set whether advertiser address should be ommited from all packets. If this * mode is used, periodic advertising can't be enabled for this set. * * This is used only if legacy mode is not used. * - * @param isAnonymous wether anonymous advertising should be used. + * @param isAnonymous whether anonymous advertising should be used. */ public Builder setAnonymous(boolean isAnonymous) { this.isAnonymous = isAnonymous; @@ -300,12 +301,12 @@ public final class AdvertisingSetParameters implements Parcelable { } /** - * Set wether TX power should be included in the extended header. + * Set whether TX power should be included in the extended header. * * This is used only if legacy mode is not used. * - * @param includeTxPower wether TX power should be included in extended - * header + * @param includeTxPower whether TX power should be included in extended + * header */ public Builder setIncludeTxPower(boolean includeTxPower) { this.includeTxPower = includeTxPower; @@ -317,6 +318,8 @@ public final class AdvertisingSetParameters implements Parcelable { * * This is used only if legacy mode is not used. * + * Use {@link BluetoothAdapter#isLeCodedPhySupported} to determine if LE Coded PHY is + * supported on this device. * @param primaryPhy Primary advertising physical channel, can only be * {@link AdvertisingSetParameters#PHY_LE_1M} or * {@link AdvertisingSetParameters#PHY_LE_CODED}. @@ -335,6 +338,10 @@ public final class AdvertisingSetParameters implements Parcelable { * * This is used only if legacy mode is not used. * + * Use {@link BluetoothAdapter#isLeCodedPhySupported} and + * {@link BluetoothAdapter#isLe2MPhySupported} to determine if LE Coded PHY or 2M PHY is + * supported on this device. + * * @param secondaryPhy Secondary advertising physical channel, can only be * one of {@link AdvertisingSetParameters#PHY_LE_1M}, * {@link AdvertisingSetParameters#PHY_LE_2M} or @@ -393,6 +400,32 @@ public final class AdvertisingSetParameters implements Parcelable { * Build the {@link AdvertisingSetParameters} object. */ public AdvertisingSetParameters build() { + if (isLegacy) { + if (isAnonymous) { + throw new IllegalArgumentException("Legacy advertising can't be anonymous"); + } + + if (connectable == true && scannable == false) { + throw new IllegalArgumentException( + "Legacy advertisement can't be connectable and non-scannable"); + } + + if (includeTxPower) { + throw new IllegalArgumentException( + "Legacy advertising can't include TX power level in header"); + } + } else { + if (connectable && scannable) { + throw new IllegalArgumentException( + "Advertising can't be both connectable and scannable"); + } + + if (isAnonymous && connectable) { + throw new IllegalArgumentException( + "Advertising can't be both connectable and anonymous"); + } + } + return new AdvertisingSetParameters(connectable, scannable, isLegacy, isAnonymous, includeTxPower, primaryPhy, secondaryPhy, interval, txPowerLevel); diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java index 242ee77ce0e9..a9deb752e081 100644 --- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java +++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java @@ -50,13 +50,13 @@ public final class BluetoothLeAdvertiser { private static final String TAG = "BluetoothLeAdvertiser"; - private static final int MAX_ADVERTISING_DATA_BYTES = 31; + private static final int MAX_ADVERTISING_DATA_BYTES = 1650; + private static final int MAX_LEGACY_ADVERTISING_DATA_BYTES = 31; // Each fields need one byte for field length and another byte for field type. private static final int OVERHEAD_BYTES_PER_FIELD = 2; // Flags field will be set by system. private static final int FLAGS_FIELD_BYTES = 3; private static final int MANUFACTURER_SPECIFIC_DATA_LENGTH = 2; - private static final int SERVICE_DATA_UUID_LENGTH = 2; private final IBluetoothManager mBluetoothManager; private final Handler mHandler; @@ -117,8 +117,8 @@ public final class BluetoothLeAdvertiser { throw new IllegalArgumentException("callback cannot be null"); } boolean isConnectable = settings.isConnectable(); - if (totalBytes(advertiseData, isConnectable) > MAX_ADVERTISING_DATA_BYTES || - totalBytes(scanResponse, false) > MAX_ADVERTISING_DATA_BYTES) { + if (totalBytes(advertiseData, isConnectable) > MAX_LEGACY_ADVERTISING_DATA_BYTES || + totalBytes(scanResponse, false) > MAX_LEGACY_ADVERTISING_DATA_BYTES) { postStartFailure(callback, AdvertiseCallback.ADVERTISE_FAILED_DATA_TOO_LARGE); return; } @@ -149,10 +149,16 @@ public final class BluetoothLeAdvertiser { parameters.setTxPowerLevel(1); } + int duration = 0; + int timeoutMillis = settings.getTimeout(); + if (timeoutMillis > 0) { + duration = (timeoutMillis < 10) ? 1 : timeoutMillis/10; + } + AdvertisingSetCallback wrapped = wrapOldCallback(callback, settings); mLegacyAdvertisers.put(callback, wrapped); startAdvertisingSet(parameters.build(), advertiseData, scanResponse, null, null, - settings.getTimeout(), wrapped); + duration, 0, wrapped); } } @@ -206,90 +212,202 @@ public final class BluetoothLeAdvertiser { } /** - * Creates a new advertising set. If operation succeed, device will start advertising. This - * method returns immediately, the operation status is delivered through - * {@code callback.onAdvertisingSetStarted()}. - * <p> - * @param parameters advertising set parameters. - * @param advertiseData Advertisement data to be broadcasted. - * @param scanResponse Scan response associated with the advertisement data. - * @param periodicData Periodic advertising data. - * @param callback Callback for advertising set. - */ + * Creates a new advertising set. If operation succeed, device will start advertising. This + * method returns immediately, the operation status is delivered through + * {@code callback.onAdvertisingSetStarted()}. + * <p> + * @param parameters advertising set parameters. + * @param advertiseData Advertisement data to be broadcasted. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. If the + * advertisement is connectable, three bytes will be added for flags. + * @param scanResponse Scan response associated with the advertisement data. Size must not + * exceed {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. + * @param periodicParameters periodic advertisng parameters. If null, periodic advertising will + * not be started. + * @param periodicData Periodic advertising data. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. + * @param callback Callback for advertising set. + * @throws IllegalArgumentException when any of the data parameter exceed the maximum allowable + * size, or unsupported advertising PHY is selected, or when attempt to use + * Periodic Advertising feature is made when it's not supported by the + * controller. + */ public void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData, AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters, AdvertiseData periodicData, AdvertisingSetCallback callback) { startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters, - periodicData, 0, callback, new Handler(Looper.getMainLooper())); + periodicData, 0, 0, callback, new Handler(Looper.getMainLooper())); } /** - * Creates a new advertising set. If operation succeed, device will start advertising. This - * method returns immediately, the operation status is delivered through - * {@code callback.onAdvertisingSetStarted()}. - * <p> - * @param parameters advertising set parameters. - * @param advertiseData Advertisement data to be broadcasted. - * @param scanResponse Scan response associated with the advertisement data. - * @param periodicData Periodic advertising data. - * @param callback Callback for advertising set. - * @param handler thread upon which the callbacks will be invoked. - */ + * Creates a new advertising set. If operation succeed, device will start advertising. This + * method returns immediately, the operation status is delivered through + * {@code callback.onAdvertisingSetStarted()}. + * <p> + * @param parameters advertising set parameters. + * @param advertiseData Advertisement data to be broadcasted. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. If the + * advertisement is connectable, three bytes will be added for flags. + * @param scanResponse Scan response associated with the advertisement data. Size must not + * exceed {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. + * @param periodicParameters periodic advertisng parameters. If null, periodic advertising will + * not be started. + * @param periodicData Periodic advertising data. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. + * @param callback Callback for advertising set. + * @param handler thread upon which the callbacks will be invoked. + * @throws IllegalArgumentException when any of the data parameter exceed the maximum allowable + * size, or unsupported advertising PHY is selected, or when attempt to use + * Periodic Advertising feature is made when it's not supported by the + * controller. + */ public void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData, AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters, AdvertiseData periodicData, AdvertisingSetCallback callback, Handler handler) { startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters, - periodicData, 0, callback, handler); + periodicData, 0, 0, callback, handler); } /** - * Creates a new advertising set. If operation succeed, device will start advertising. This - * method returns immediately, the operation status is delivered through - * {@code callback.onAdvertisingSetStarted()}. - * <p> - * @param parameters advertising set parameters. - * @param advertiseData Advertisement data to be broadcasted. - * @param scanResponse Scan response associated with the advertisement data. - * @param periodicData Periodic advertising data. - * @param timeoutMillis Advertising time limit. May not exceed 180000 - * @param callback Callback for advertising set. - */ + * Creates a new advertising set. If operation succeed, device will start advertising. This + * method returns immediately, the operation status is delivered through + * {@code callback.onAdvertisingSetStarted()}. + * <p> + * @param parameters advertising set parameters. + * @param advertiseData Advertisement data to be broadcasted. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. If the + * advertisement is connectable, three bytes will be added for flags. + * @param scanResponse Scan response associated with the advertisement data. Size must not + * exceed {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. + * @param periodicParameters periodic advertisng parameters. If null, periodic advertising will + * not be started. + * @param periodicData Periodic advertising data. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. + * @param duration advertising duration, in 10ms unit. Valid range is from 1 (10ms) to + * 65535 (655,350 ms). 0 means advertising should continue until stopped. + * @param maxExtendedAdvertisingEvents maximum number of extended advertising events the + * controller shall attempt to send prior to terminating the extended + * advertising, even if the duration has not expired. Valid range is + * from 1 to 255. 0 means no maximum. + * @param callback Callback for advertising set. + * @throws IllegalArgumentException when any of the data parameter exceed the maximum allowable + * size, or unsupported advertising PHY is selected, or when attempt to use + * Periodic Advertising feature is made when it's not supported by the + * controller. + */ public void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData, AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters, - AdvertiseData periodicData, int timeoutMillis, + AdvertiseData periodicData, int duration, + int maxExtendedAdvertisingEvents, AdvertisingSetCallback callback) { startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters, - periodicData, timeoutMillis, callback, new Handler(Looper.getMainLooper())); + periodicData, duration, maxExtendedAdvertisingEvents, callback, + new Handler(Looper.getMainLooper())); } /** - * Creates a new advertising set. If operation succeed, device will start advertising. This - * method returns immediately, the operation status is delivered through - * {@code callback.onAdvertisingSetStarted()}. - * <p> - * @param parameters advertising set parameters. - * @param advertiseData Advertisement data to be broadcasted. - * @param scanResponse Scan response associated with the advertisement data. - * @param periodicData Periodic advertising data. - * @param timeoutMillis Advertising time limit. May not exceed 180000 - * @param callback Callback for advertising set. - * @param handler thread upon which the callbacks will be invoked. - */ + * Creates a new advertising set. If operation succeed, device will start advertising. This + * method returns immediately, the operation status is delivered through + * {@code callback.onAdvertisingSetStarted()}. + * <p> + * @param parameters Advertising set parameters. + * @param advertiseData Advertisement data to be broadcasted. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength}. If the + * advertisement is connectable, three bytes will be added for flags. + * @param scanResponse Scan response associated with the advertisement data. Size must not + * exceed {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength} + * @param periodicParameters Periodic advertisng parameters. If null, periodic advertising will + * not be started. + * @param periodicData Periodic advertising data. Size must not exceed + * {@link BluetoothAdapter#getLeMaximumAdvertisingDataLength} + * @param duration advertising duration, in 10ms unit. Valid range is from 1 (10ms) to + * 65535 (655,350 ms). 0 means advertising should continue until stopped. + * @param maxExtendedAdvertisingEvents maximum number of extended advertising events the + * controller shall attempt to send prior to terminating the extended + * advertising, even if the duration has not expired. Valid range is + * from 1 to 255. 0 means no maximum. + * @param callback Callback for advertising set. + * @param handler Thread upon which the callbacks will be invoked. + * @throws IllegalArgumentException When any of the data parameter exceed the maximum allowable + * size, or unsupported advertising PHY is selected, or when attempt to use + * Periodic Advertising feature is made when it's not supported by the + * controller, or when maxExtendedAdvertisingEvents is used on a controller + * that doesn't support the LE Extended Advertising + */ public void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData, AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters, - AdvertiseData periodicData, int timeoutMillis, - AdvertisingSetCallback callback, Handler handler) { + AdvertiseData periodicData, int duration, + int maxExtendedAdvertisingEvents, AdvertisingSetCallback callback, + Handler handler) { BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter); - if (callback == null) { throw new IllegalArgumentException("callback cannot be null"); } + boolean isConnectable = parameters.isConnectable(); + if (parameters.isLegacy()) { + if (totalBytes(advertiseData, isConnectable) > MAX_LEGACY_ADVERTISING_DATA_BYTES) { + throw new IllegalArgumentException("Legacy advertising data too big"); + } + + if (totalBytes(scanResponse, false) > MAX_LEGACY_ADVERTISING_DATA_BYTES) { + throw new IllegalArgumentException("Legacy scan response data too big"); + } + } else { + boolean supportCodedPhy = mBluetoothAdapter.isLeCodedPhySupported(); + boolean support2MPhy = mBluetoothAdapter.isLe2MPhySupported(); + int pphy = parameters.getPrimaryPhy(); + int sphy = parameters.getSecondaryPhy(); + if (pphy == AdvertisingSetParameters.PHY_LE_CODED && !supportCodedPhy) { + throw new IllegalArgumentException("Unsupported primary PHY selected"); + } + + if ((sphy == AdvertisingSetParameters.PHY_LE_CODED && !supportCodedPhy) + || (sphy == AdvertisingSetParameters.PHY_LE_2M && !support2MPhy)) { + throw new IllegalArgumentException("Unsupported secondary PHY selected"); + } + + int maxData = mBluetoothAdapter.getLeMaximumAdvertisingDataLength(); + if (totalBytes(advertiseData, isConnectable) > maxData) { + throw new IllegalArgumentException("Advertising data too big"); + } + + if (totalBytes(scanResponse, false) > maxData) { + throw new IllegalArgumentException("Scan response data too big"); + } + + if (totalBytes(periodicData, false) > maxData) { + throw new IllegalArgumentException("Periodic advertising data too big"); + } + + boolean supportPeriodic = mBluetoothAdapter.isLePeriodicAdvertisingSupported(); + if (periodicParameters != null && periodicParameters.getEnable() && !supportPeriodic) { + throw new IllegalArgumentException( + "Controller does not support LE Periodic Advertising"); + } + } + + if (maxExtendedAdvertisingEvents < 0 || maxExtendedAdvertisingEvents > 255) { + throw new IllegalArgumentException( + "maxExtendedAdvertisingEvents out of range: " + maxExtendedAdvertisingEvents); + } + + if (maxExtendedAdvertisingEvents != 0 && + !mBluetoothAdapter.isLePeriodicAdvertisingSupported()) { + throw new IllegalArgumentException( + "Can't use maxExtendedAdvertisingEvents with controller that don't support " + + "LE Extended Advertising"); + } + + if (duration < 0 || duration > 65535) { + throw new IllegalArgumentException("duration out of range: " + duration); + } + IBluetoothGatt gatt; try { gatt = mBluetoothManager.getBluetoothGatt(); @@ -306,7 +424,7 @@ public final class BluetoothLeAdvertiser { try { gatt.startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters, - periodicData, timeoutMillis, wrapped); + periodicData, duration, maxExtendedAdvertisingEvents, wrapped); } catch (RemoteException e) { Log.e(TAG, "Failed to start advertising set - ", e); throw new IllegalStateException("Failed to start advertising set"); @@ -383,7 +501,8 @@ public final class BluetoothLeAdvertiser { } } for (ParcelUuid uuid : data.getServiceData().keySet()) { - size += OVERHEAD_BYTES_PER_FIELD + SERVICE_DATA_UUID_LENGTH + int uuidLen = BluetoothUuid.uuidToBytes(uuid).length; + size += OVERHEAD_BYTES_PER_FIELD + uuidLen + byteLength(data.getServiceData().get(uuid)); } for (int i = 0; i < data.getManufacturerSpecificData().size(); ++i) { diff --git a/core/java/android/bluetooth/le/PeriodicAdvertisingCallback.java b/core/java/android/bluetooth/le/PeriodicAdvertisingCallback.java index 6616231bcdf8..364b575b4d8d 100644 --- a/core/java/android/bluetooth/le/PeriodicAdvertisingCallback.java +++ b/core/java/android/bluetooth/le/PeriodicAdvertisingCallback.java @@ -23,6 +23,7 @@ import android.bluetooth.BluetoothDevice; * advertising operation status. * * @see PeriodicAdvertisingManager#createSync + * @hide */ public abstract class PeriodicAdvertisingCallback { diff --git a/core/java/android/bluetooth/le/PeriodicAdvertisingManager.java b/core/java/android/bluetooth/le/PeriodicAdvertisingManager.java index 12c8a8c8ffd4..d9c2d8819a33 100644 --- a/core/java/android/bluetooth/le/PeriodicAdvertisingManager.java +++ b/core/java/android/bluetooth/le/PeriodicAdvertisingManager.java @@ -37,6 +37,7 @@ import java.util.Map; * <p> * <b>Note:</b> Most of the methods here require * {@link android.Manifest.permission#BLUETOOTH_ADMIN} permission. + * @hide */ public final class PeriodicAdvertisingManager { diff --git a/core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java b/core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java index ebc92bd0bcf8..149540ce0dab 100644 --- a/core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java +++ b/core/java/android/bluetooth/le/PeriodicAdvertisingParameters.java @@ -93,7 +93,7 @@ public final class PeriodicAdvertisingParameters implements Parcelable { private int interval = INTERVAL_MAX; /** - * Set wether the Periodic Advertising should be enabled for this set. + * Set whether the Periodic Advertising should be enabled for this set. */ public Builder setEnable(boolean enable) { this.enable = enable; diff --git a/core/java/android/bluetooth/le/PeriodicAdvertisingReport.java b/core/java/android/bluetooth/le/PeriodicAdvertisingReport.java index 3ff4ca580069..51b93cbd64dc 100644 --- a/core/java/android/bluetooth/le/PeriodicAdvertisingReport.java +++ b/core/java/android/bluetooth/le/PeriodicAdvertisingReport.java @@ -24,6 +24,7 @@ import java.util.Objects; /** * PeriodicAdvertisingReport for Bluetooth LE synchronized advertising. + * @hide */ public final class PeriodicAdvertisingReport implements Parcelable { |