Merge "Bluetooth: advertising improvements" am: 82c9ba9c55
am: e3b71cd572
Change-Id: I54df9c355ac951d40b2d8e865d5f36f8875ce71f
This commit is contained in:
@@ -580,10 +580,6 @@ public final class BluetoothAdapter {
|
|||||||
*/
|
*/
|
||||||
public BluetoothLeAdvertiser getBluetoothLeAdvertiser() {
|
public BluetoothLeAdvertiser getBluetoothLeAdvertiser() {
|
||||||
if (!getLeAccess()) return null;
|
if (!getLeAccess()) return null;
|
||||||
if (!isMultipleAdvertisementSupported() && !isPeripheralModeSupported()) {
|
|
||||||
Log.e(TAG, "Bluetooth LE advertising not supported");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
synchronized(mLock) {
|
synchronized(mLock) {
|
||||||
if (sBluetoothLeAdvertiser == null) {
|
if (sBluetoothLeAdvertiser == null) {
|
||||||
sBluetoothLeAdvertiser = new BluetoothLeAdvertiser(mManagerService);
|
sBluetoothLeAdvertiser = new BluetoothLeAdvertiser(mManagerService);
|
||||||
@@ -1332,24 +1328,6 @@ public final class BluetoothAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether peripheral mode is supported.
|
|
||||||
*
|
|
||||||
* @hide
|
|
||||||
*/
|
|
||||||
public boolean isPeripheralModeSupported() {
|
|
||||||
if (getState() != STATE_ON) return false;
|
|
||||||
try {
|
|
||||||
mServiceLock.readLock().lock();
|
|
||||||
if (mService != null) return mService.isPeripheralModeSupported();
|
|
||||||
} catch (RemoteException e) {
|
|
||||||
Log.e(TAG, "failed to get peripheral mode capability: ", e);
|
|
||||||
} finally {
|
|
||||||
mServiceLock.readLock().unlock();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if offloaded filters are supported
|
* Return true if offloaded filters are supported
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -100,7 +100,6 @@ interface IBluetooth
|
|||||||
boolean factoryReset();
|
boolean factoryReset();
|
||||||
|
|
||||||
boolean isMultiAdvertisementSupported();
|
boolean isMultiAdvertisementSupported();
|
||||||
boolean isPeripheralModeSupported();
|
|
||||||
boolean isOffloadedFilteringSupported();
|
boolean isOffloadedFilteringSupported();
|
||||||
boolean isOffloadedScanBatchingSupported();
|
boolean isOffloadedScanBatchingSupported();
|
||||||
boolean isActivityAndEnergyReportingSupported();
|
boolean isActivityAndEnergyReportingSupported();
|
||||||
|
|||||||
@@ -111,12 +111,6 @@ public final class BluetoothLeAdvertiser {
|
|||||||
if (callback == null) {
|
if (callback == null) {
|
||||||
throw new IllegalArgumentException("callback cannot be null");
|
throw new IllegalArgumentException("callback cannot be null");
|
||||||
}
|
}
|
||||||
if (!mBluetoothAdapter.isMultipleAdvertisementSupported() &&
|
|
||||||
!mBluetoothAdapter.isPeripheralModeSupported()) {
|
|
||||||
postStartFailure(callback,
|
|
||||||
AdvertiseCallback.ADVERTISE_FAILED_FEATURE_UNSUPPORTED);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
boolean isConnectable = settings.isConnectable();
|
boolean isConnectable = settings.isConnectable();
|
||||||
if (totalBytes(advertiseData, isConnectable) > MAX_ADVERTISING_DATA_BYTES ||
|
if (totalBytes(advertiseData, isConnectable) > MAX_ADVERTISING_DATA_BYTES ||
|
||||||
totalBytes(scanResponse, false) > MAX_ADVERTISING_DATA_BYTES) {
|
totalBytes(scanResponse, false) > MAX_ADVERTISING_DATA_BYTES) {
|
||||||
@@ -236,9 +230,9 @@ public final class BluetoothLeAdvertiser {
|
|||||||
private final AdvertiseSettings mSettings;
|
private final AdvertiseSettings mSettings;
|
||||||
private final IBluetoothGatt mBluetoothGatt;
|
private final IBluetoothGatt mBluetoothGatt;
|
||||||
|
|
||||||
// mAdvertiserId 0: not registered
|
// mAdvertiserId -1: not registered
|
||||||
// -1: advertise stopped or registration timeout
|
// -2: advertise stopped or registration timeout
|
||||||
// >0: registered and advertising started
|
// >=0: registered and advertising started
|
||||||
private int mAdvertiserId;
|
private int mAdvertiserId;
|
||||||
private boolean mIsAdvertising = false;
|
private boolean mIsAdvertising = false;
|
||||||
|
|
||||||
@@ -251,12 +245,12 @@ public final class BluetoothLeAdvertiser {
|
|||||||
mScanResponse = scanResponse;
|
mScanResponse = scanResponse;
|
||||||
mSettings = settings;
|
mSettings = settings;
|
||||||
mBluetoothGatt = bluetoothGatt;
|
mBluetoothGatt = bluetoothGatt;
|
||||||
mAdvertiserId = 0;
|
mAdvertiserId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startRegisteration() {
|
public void startRegisteration() {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (mAdvertiserId == -1) return;
|
if (mAdvertiserId == -2) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mBluetoothGatt.registerAdvertiser(this);
|
mBluetoothGatt.registerAdvertiser(this);
|
||||||
@@ -264,13 +258,13 @@ public final class BluetoothLeAdvertiser {
|
|||||||
} catch (InterruptedException | RemoteException e) {
|
} catch (InterruptedException | RemoteException e) {
|
||||||
Log.e(TAG, "Failed to start registeration", e);
|
Log.e(TAG, "Failed to start registeration", e);
|
||||||
}
|
}
|
||||||
if (mAdvertiserId > 0 && mIsAdvertising) {
|
if (mAdvertiserId >= 0 && mIsAdvertising) {
|
||||||
mLeAdvertisers.put(mAdvertiseCallback, this);
|
mLeAdvertisers.put(mAdvertiseCallback, this);
|
||||||
} else if (mAdvertiserId <= 0) {
|
} else if (mAdvertiserId < 0) {
|
||||||
|
|
||||||
// Registration timeout, reset mClientIf to -1 so no subsequent operations can
|
// Registration timeout, reset mClientIf to -1 so no subsequent operations can
|
||||||
// proceed.
|
// proceed.
|
||||||
if (mAdvertiserId == 0) mAdvertiserId = -1;
|
if (mAdvertiserId == 0) mAdvertiserId = -2;
|
||||||
// Post internal error if registration failed.
|
// Post internal error if registration failed.
|
||||||
postStartFailure(mAdvertiseCallback,
|
postStartFailure(mAdvertiseCallback,
|
||||||
AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR);
|
AdvertiseCallback.ADVERTISE_FAILED_INTERNAL_ERROR);
|
||||||
@@ -278,7 +272,7 @@ public final class BluetoothLeAdvertiser {
|
|||||||
// Unregister application if it's already registered but advertise failed.
|
// Unregister application if it's already registered but advertise failed.
|
||||||
try {
|
try {
|
||||||
mBluetoothGatt.unregisterAdvertiser(mAdvertiserId);
|
mBluetoothGatt.unregisterAdvertiser(mAdvertiserId);
|
||||||
mAdvertiserId = -1;
|
mAdvertiserId = -2;
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
Log.e(TAG, "remote exception when unregistering", e);
|
Log.e(TAG, "remote exception when unregistering", e);
|
||||||
}
|
}
|
||||||
@@ -312,7 +306,7 @@ public final class BluetoothLeAdvertiser {
|
|||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
if (status == BluetoothGatt.GATT_SUCCESS) {
|
if (status == BluetoothGatt.GATT_SUCCESS) {
|
||||||
try {
|
try {
|
||||||
if (mAdvertiserId == -1) {
|
if (mAdvertiserId == -2) {
|
||||||
// Registration succeeds after timeout, unregister advertiser.
|
// Registration succeeds after timeout, unregister advertiser.
|
||||||
mBluetoothGatt.unregisterAdvertiser(advertiserId);
|
mBluetoothGatt.unregisterAdvertiser(advertiserId);
|
||||||
} else {
|
} else {
|
||||||
@@ -326,7 +320,7 @@ public final class BluetoothLeAdvertiser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Registration failed.
|
// Registration failed.
|
||||||
mAdvertiserId = -1;
|
mAdvertiserId = -2;
|
||||||
notifyAll();
|
notifyAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -348,7 +342,7 @@ public final class BluetoothLeAdvertiser {
|
|||||||
// unregister advertiser for stop.
|
// unregister advertiser for stop.
|
||||||
try {
|
try {
|
||||||
mBluetoothGatt.unregisterAdvertiser(mAdvertiserId);
|
mBluetoothGatt.unregisterAdvertiser(mAdvertiserId);
|
||||||
mAdvertiserId = -1;
|
mAdvertiserId = -2;
|
||||||
mIsAdvertising = false;
|
mIsAdvertising = false;
|
||||||
mLeAdvertisers.remove(mAdvertiseCallback);
|
mLeAdvertisers.remove(mAdvertiseCallback);
|
||||||
} catch (RemoteException e) {
|
} catch (RemoteException e) {
|
||||||
|
|||||||
Reference in New Issue
Block a user