Unregister app when advertise failed after registration.
Also moved bluetooth state check to common utils class.
Bug:17364837
Change-Id: I25ff7afae723d47f701236d5a68eab8015de9bbb
diff --git a/core/java/android/bluetooth/le/AdvertiseData.java b/core/java/android/bluetooth/le/AdvertiseData.java
index c7bfae9..ff0db9a 100644
--- a/core/java/android/bluetooth/le/AdvertiseData.java
+++ b/core/java/android/bluetooth/le/AdvertiseData.java
@@ -119,8 +119,8 @@
}
AdvertiseData other = (AdvertiseData) obj;
return Objects.equals(mServiceUuids, other.mServiceUuids) &&
- Utils.equals(mManufacturerSpecificData, other.mManufacturerSpecificData) &&
- Utils.equals(mServiceData, other.mServiceData) &&
+ BluetoothLeUtils.equals(mManufacturerSpecificData, other.mManufacturerSpecificData) &&
+ BluetoothLeUtils.equals(mServiceData, other.mServiceData) &&
mIncludeDeviceName == other.mIncludeDeviceName &&
mIncludeTxPowerLevel == other.mIncludeTxPowerLevel;
}
@@ -128,8 +128,8 @@
@Override
public String toString() {
return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mManufacturerSpecificData="
- + Utils.toString(mManufacturerSpecificData) + ", mServiceData="
- + Utils.toString(mServiceData)
+ + BluetoothLeUtils.toString(mManufacturerSpecificData) + ", mServiceData="
+ + BluetoothLeUtils.toString(mServiceData)
+ ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName="
+ mIncludeDeviceName + "]";
}
diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
index 3568f26..d468508 100644
--- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
+++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
@@ -107,7 +107,7 @@
AdvertiseData advertiseData, AdvertiseData scanResponse,
final AdvertiseCallback callback) {
synchronized (mLeAdvertisers) {
- checkAdapterState();
+ BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter);
if (callback == null) {
throw new IllegalArgumentException("callback cannot be null");
}
@@ -150,7 +150,7 @@
*/
public void stopAdvertising(final AdvertiseCallback callback) {
synchronized (mLeAdvertisers) {
- checkAdapterState();
+ BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter);
if (callback == null) {
throw new IllegalArgumentException("callback cannot be null");
}
@@ -265,9 +265,18 @@
}
if (mClientIf > 0 && mIsAdvertising) {
mLeAdvertisers.put(mAdvertiseCallback, this);
- } else {
+ } else if (mClientIf <= 0) {
+ // Post internal error if registration failed.
postStartFailure(mAdvertiseCallback,
AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR);
+ } else {
+ // Unregister application if it's already registered but advertise failed.
+ try {
+ mBluetoothGatt.unregisterClient(mClientIf);
+ mClientIf = -1;
+ } catch (RemoteException e) {
+ Log.e(TAG, "remote exception when unregistering", e);
+ }
}
}
}
@@ -342,13 +351,6 @@
}
}
- // TODO: move this api to a common util class.
- private void checkAdapterState() {
- if (mBluetoothAdapter.getState() != mBluetoothAdapter.STATE_ON) {
- throw new IllegalStateException("BT Adapter is not turned ON");
- }
- }
-
private void postStartFailure(final AdvertiseCallback callback, final int error) {
mHandler.post(new Runnable() {
@Override
diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java
index e1d4bbd2..a57c3ca 100644
--- a/core/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -80,11 +80,10 @@
* @throws IllegalArgumentException If {@code callback} is null.
*/
public void startScan(final ScanCallback callback) {
- checkAdapterState();
if (callback == null) {
throw new IllegalArgumentException("callback is null");
}
- this.startScan(null, new ScanSettings.Builder().build(), callback);
+ startScan(null, new ScanSettings.Builder().build(), callback);
}
/**
@@ -104,7 +103,7 @@
private void startScan(List<ScanFilter> filters, ScanSettings settings,
final ScanCallback callback, List<List<ResultStorageDescriptor>> resultStorages) {
- checkAdapterState();
+ BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter);
if (settings == null || callback == null) {
throw new IllegalArgumentException("settings or callback is null");
}
@@ -142,7 +141,7 @@
* @param callback
*/
public void stopScan(ScanCallback callback) {
- checkAdapterState();
+ BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter);
synchronized (mLeScanClients) {
BleScanCallbackWrapper wrapper = mLeScanClients.remove(callback);
if (wrapper == null) {
@@ -162,7 +161,7 @@
* used to start scan.
*/
public void flushPendingScanResults(ScanCallback callback) {
- checkAdapterState();
+ BluetoothLeUtils.checkAdapterStateOn(mBluetoothAdapter);
if (callback == null) {
throw new IllegalArgumentException("callback cannot be null!");
}
@@ -373,13 +372,6 @@
}
}
- // TODO: move this api to a common util class.
- private void checkAdapterState() {
- if (mBluetoothAdapter.getState() != mBluetoothAdapter.STATE_ON) {
- throw new IllegalStateException("BT Adapter is not turned ON");
- }
- }
-
private void postCallbackError(final ScanCallback callback, final int errorCode) {
mHandler.post(new Runnable() {
@Override
diff --git a/core/java/android/bluetooth/le/Utils.java b/core/java/android/bluetooth/le/BluetoothLeUtils.java
similarity index 87%
rename from core/java/android/bluetooth/le/Utils.java
rename to core/java/android/bluetooth/le/BluetoothLeUtils.java
index ccdae69..4916bd9 100644
--- a/core/java/android/bluetooth/le/Utils.java
+++ b/core/java/android/bluetooth/le/BluetoothLeUtils.java
@@ -16,6 +16,7 @@
package android.bluetooth.le;
+import android.bluetooth.BluetoothAdapter;
import android.util.SparseArray;
import java.util.Arrays;
@@ -29,7 +30,7 @@
*
* @hide
*/
-public class Utils {
+public class BluetoothLeUtils {
/**
* Returns a string composed from a {@link SparseArray}.
@@ -123,4 +124,17 @@
}
return true;
}
+
+ /**
+ * Ensure Bluetooth is turned on.
+ *
+ * @throws IllegalStateException If {@code adapter} is null or Bluetooth state is not
+ * {@link BluetoothAdapter#STATE_ON}.
+ */
+ static void checkAdapterStateOn(BluetoothAdapter adapter) {
+ if (adapter == null || adapter.getState() != BluetoothAdapter.STATE_ON) {
+ throw new IllegalStateException("BT Adapter is not turned ON");
+ }
+ }
+
}
diff --git a/core/java/android/bluetooth/le/ScanRecord.java b/core/java/android/bluetooth/le/ScanRecord.java
index 2f3d06f..f802e8d 100644
--- a/core/java/android/bluetooth/le/ScanRecord.java
+++ b/core/java/android/bluetooth/le/ScanRecord.java
@@ -268,8 +268,8 @@
@Override
public String toString() {
return "ScanRecord [mAdvertiseFlags=" + mAdvertiseFlags + ", mServiceUuids=" + mServiceUuids
- + ", mManufacturerSpecificData=" + Utils.toString(mManufacturerSpecificData)
- + ", mServiceData=" + Utils.toString(mServiceData)
+ + ", mManufacturerSpecificData=" + BluetoothLeUtils.toString(mManufacturerSpecificData)
+ + ", mServiceData=" + BluetoothLeUtils.toString(mServiceData)
+ ", mTxPowerLevel=" + mTxPowerLevel + ", mDeviceName=" + mDeviceName + "]";
}