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: