Add device capability config for new BLE features(MA, scan filter).(2/3)
Fixes b/15387925.
Change-Id: I7cbcdd340fca7965f2be2c0d2a938e7646dc6849
diff --git a/android/app/src/com/android/bluetooth/gatt/GattService.java b/android/app/src/com/android/bluetooth/gatt/GattService.java
index 9bfd719..0eced21 100644
--- a/android/app/src/com/android/bluetooth/gatt/GattService.java
+++ b/android/app/src/com/android/bluetooth/gatt/GattService.java
@@ -25,11 +25,11 @@
import android.bluetooth.IBluetoothGattCallback;
import android.bluetooth.IBluetoothGattServerCallback;
import android.bluetooth.le.AdvertiseCallback;
-import android.bluetooth.le.AdvertisementData;
import android.bluetooth.le.AdvertiseSettings;
-import android.bluetooth.le.ScanSettings;
+import android.bluetooth.le.AdvertisementData;
import android.bluetooth.le.ScanFilter;
import android.bluetooth.le.ScanResult;
+import android.bluetooth.le.ScanSettings;
import android.content.Intent;
import android.os.IBinder;
import android.os.Message;
@@ -39,6 +39,7 @@
import android.util.Log;
import com.android.bluetooth.btservice.ProfileService;
+import com.android.internal.R;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@@ -88,9 +89,6 @@
static final int SCAN_FILTER_ENABLED = 1;
static final int SCAN_FILTER_MODIFIED = 2;
- // TODO: query the number from hardware instead of hard-coded here.
- private static final int MAX_FILTER_SIZE = 1;
-
/**
* Search queue to serialize remote onbject inspection.
*/
@@ -123,6 +121,7 @@
private Integer mAdvertisingState = BluetoothAdapter.STATE_ADVERTISE_STOPPED;
private final Object mLock = new Object();
private static int lastConfiguredDutyCycle = 0;
+ private int mMaxScanFilters;
/**
* Pending service declaration queue
@@ -205,6 +204,7 @@
if (DBG) Log.d(TAG, "start()");
initializeNative();
mStateMachine = GattServiceStateMachine.make(this);
+ mMaxScanFilters = getResources().getInteger(R.integer.config_bluetooth_max_scan_filters);
return true;
}
@@ -1254,12 +1254,17 @@
mScanQueue.add(new ScanClient(appIf, isServer, settings, filters));
}
Set<ScanFilter> newFilters = configureScanFiltersLocked();
- if (!Objects.deepEquals(newFilters, mScanFilters)) {
- mScanFilters = newFilters;
- // Restart scan using new filters.
- if (isScaning) {
+ if (isScaning) {
+ // Reset scan filters if BLE scan was started and scan filters changed.
+ if (!Objects.deepEquals(newFilters, mScanFilters)) {
+ mScanFilters = newFilters;
+ // Restart scan using new filters.
sendStopScanMessage();
+ sendStartScanMessage(mScanFilters);
}
+ } else {
+ // Always start scanning with new filters if scan not started yet.
+ mScanFilters = newFilters;
sendStartScanMessage(mScanFilters);
}
}
@@ -1322,13 +1327,20 @@
filters.addAll(client.filters);
}
// TODO: find a better way to handle too many filters.
- if (filters.size() > MAX_FILTER_SIZE) {
- if (DBG) Log.d(TAG, "filters size > " + MAX_FILTER_SIZE + ", clearing filters");
+ if (filters.size() > mMaxScanFilters) {
+ if (DBG) Log.d(TAG, "filters size > " + mMaxScanFilters + ", clearing filters");
filters = new HashSet<ScanFilter>();
}
return filters;
}
+ /**
+ * Returns whether scan filter is supported.
+ */
+ boolean isScanFilterSupported() {
+ return mMaxScanFilters > 0;
+ }
+
private void sendStartScanMessage(Set<ScanFilter> filters) {
Message message = mStateMachine.obtainMessage(GattServiceStateMachine.START_BLE_SCAN);
message.obj = filters;
diff --git a/android/app/src/com/android/bluetooth/gatt/GattServiceStateMachine.java b/android/app/src/com/android/bluetooth/gatt/GattServiceStateMachine.java
index c37d759..71d63c5 100644
--- a/android/app/src/com/android/bluetooth/gatt/GattServiceStateMachine.java
+++ b/android/app/src/com/android/bluetooth/gatt/GattServiceStateMachine.java
@@ -2,13 +2,14 @@
package com.android.bluetooth.gatt;
import android.bluetooth.le.AdvertiseCallback;
-import android.bluetooth.le.AdvertisementData;
import android.bluetooth.le.AdvertiseSettings;
+import android.bluetooth.le.AdvertisementData;
import android.bluetooth.le.ScanFilter;
import android.os.Message;
import android.os.ParcelUuid;
import android.os.RemoteException;
+import com.android.internal.R;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
@@ -54,9 +55,6 @@
static final int ADD_SCAN_FILTER = 16;
static final int ENABLE_SCAN_FILTER = 17;
- // TODO: This should be queried from hardware.
- private final int MAX_ADVERTISERS = 4;
-
// TODO: Remove this once stack callback is stable.
private static final int OPERATION_TIMEOUT = 101;
private static final int TIMEOUT_MILLIS = 3000;
@@ -100,6 +98,7 @@
private final Idle mIdle;
private final ScanStarting mScanStarting;
private final AdvertiseStarting mAdvertiseStarting;
+ private final int mMaxAdvertisers;
private GattServiceStateMachine(GattService context) {
super(TAG);
@@ -118,6 +117,8 @@
// Initial state is idle.
setInitialState(mIdle);
+ mMaxAdvertisers = mService.getResources().getInteger(
+ R.integer.config_bluetooth_max_advertisers);
}
/**
@@ -159,7 +160,12 @@
case START_BLE_SCAN:
// TODO: check whether scan is already started for the app.
// Send the enable scan message to starting state for processing.
- Message newMessage = obtainMessage(CLEAR_SCAN_FILTER);
+ Message newMessage;
+ if (mService.isScanFilterSupported()) {
+ newMessage = obtainMessage(CLEAR_SCAN_FILTER);
+ } else {
+ newMessage = obtainMessage(ENABLE_BLE_SCAN);
+ }
newMessage.obj = message.obj;
sendMessage(newMessage);
transitionTo(mScanStarting);
@@ -182,7 +188,7 @@
transitionTo(mIdle);
break;
}
- if (mAdvertiseClients.size() >= MAX_ADVERTISERS) {
+ if (mAdvertiseClients.size() >= mMaxAdvertisers) {
loge("too many advertisier, current size : " + mAdvertiseClients.size());
try {
mService.onMultipleAdvertiseCallback(client.clientIf,
@@ -279,7 +285,9 @@
break;
case ENABLE_BLE_SCAN:
gattClientScanNative(true);
- removeMessages(OPERATION_TIMEOUT);
+ if (mService.isScanFilterSupported()) {
+ removeMessages(OPERATION_TIMEOUT);
+ }
transitionTo(mIdle);
break;
case OPERATION_TIMEOUT: