diff options
| -rw-r--r-- | api/current.txt | 6 | ||||
| -rw-r--r-- | api/system-current.txt | 6 | ||||
| -rw-r--r-- | api/test-current.txt | 6 | ||||
| -rw-r--r-- | core/java/android/bluetooth/IBluetoothGatt.aidl | 5 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/AdvertisingSet.java | 13 | ||||
| -rw-r--r-- | core/java/android/bluetooth/le/BluetoothLeAdvertiser.java | 82 |
6 files changed, 81 insertions, 37 deletions
diff --git a/api/current.txt b/api/current.txt index 5d078fc6d939..12355f182f0d 100644 --- a/api/current.txt +++ b/api/current.txt @@ -7495,7 +7495,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); @@ -7571,8 +7571,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); } diff --git a/api/system-current.txt b/api/system-current.txt index 2a888f8fe822..5a7856179211 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -7800,7 +7800,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); @@ -7876,8 +7876,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); } diff --git a/api/test-current.txt b/api/test-current.txt index d7c7ced90668..1cf6d78eaa4b 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -7504,7 +7504,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); @@ -7580,8 +7580,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); } 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 d6991bf8767d..51571b2746a4 100644 --- a/core/java/android/bluetooth/le/AdvertisingSet.java +++ b/core/java/android/bluetooth/le/AdvertisingSet.java @@ -63,11 +63,18 @@ public final class AdvertisingSet { * Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN} * * @param enable whether the advertising should be enabled (true), or disabled (false) - * @param timeoutMillis duration for which that advertising set is enabled. + * @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); } diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java index 2ccf08e89b82..a9deb752e081 100644 --- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java +++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java @@ -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); } } @@ -214,8 +220,8 @@ public final class BluetoothLeAdvertiser { * @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 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 @@ -231,7 +237,7 @@ public final class BluetoothLeAdvertiser { 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())); } /** @@ -243,8 +249,8 @@ public final class BluetoothLeAdvertiser { * @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 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 @@ -262,7 +268,7 @@ public final class BluetoothLeAdvertiser { AdvertiseData periodicData, AdvertisingSetCallback callback, Handler handler) { startAdvertisingSet(parameters, advertiseData, scanResponse, periodicParameters, - periodicData, 0, callback, handler); + periodicData, 0, 0, callback, handler); } /** @@ -274,13 +280,18 @@ public final class BluetoothLeAdvertiser { * @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 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 timeoutMillis Advertising time limit. May not exceed 180000 + * @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 @@ -290,10 +301,12 @@ public final class BluetoothLeAdvertiser { 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())); } /** @@ -301,29 +314,36 @@ public final class BluetoothLeAdvertiser { * method returns immediately, the operation status is delivered through * {@code callback.onAdvertisingSetStarted()}. * <p> - * @param parameters advertising set parameters. + * @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 + * @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 timeoutMillis Advertising time limit. May not exceed 180000 + * @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 + * @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. + * 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"); @@ -372,6 +392,22 @@ public final class BluetoothLeAdvertiser { } } + 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(); @@ -388,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"); |