Merge "LE low power scan feature"
diff --git a/jni/com_android_bluetooth_gatt.cpp b/jni/com_android_bluetooth_gatt.cpp
index 65e8a49..6cd9a85 100644
--- a/jni/com_android_bluetooth_gatt.cpp
+++ b/jni/com_android_bluetooth_gatt.cpp
@@ -174,7 +174,7 @@
 
 static jmethodID method_CreateonTrackAdvFoundLostObject;
 static jmethodID method_onTrackAdvFoundLost;
-
+static jmethodID method_onScanParamSetupCompleted;
 
 /**
  * Server callback methods
@@ -591,6 +591,13 @@
     checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
 }
 
+void btgattc_scan_parameter_setup_completed_cb(int client_if, btgattc_error_t status)
+{
+    CHECK_CALLBACK_ENV
+    sCallbackEnv->CallVoidMethod(mCallbacksObj, method_onScanParamSetupCompleted, status, client_if);
+    checkAndClearExceptionFromCallback(sCallbackEnv, __func__);
+}
+
 static const btgatt_client_callbacks_t sGattClientCallbacks = {
     btgattc_register_app_cb,
     btgattc_scan_result_cb,
@@ -623,7 +630,8 @@
     btgattc_batchscan_startstop_cb,
     btgattc_batchscan_reports_cb,
     btgattc_batchscan_threshold_cb,
-    btgattc_track_adv_event_cb
+    btgattc_track_adv_event_cb,
+    btgattc_scan_parameter_setup_completed_cb
 };
 
 
@@ -879,6 +887,7 @@
     method_CreateonTrackAdvFoundLostObject = env->GetMethodID(clazz, "CreateonTrackAdvFoundLostObject", "(II[BI[BIIILjava/lang/String;IIII)Lcom/android/bluetooth/gatt/AdvtFilterOnFoundOnLostInfo;");
     method_onTrackAdvFoundLost = env->GetMethodID(clazz, "onTrackAdvFoundLost",
                                                          "(Lcom/android/bluetooth/gatt/AdvtFilterOnFoundOnLostInfo;)V");
+    method_onScanParamSetupCompleted = env->GetMethodID(clazz, "onScanParamSetupCompleted", "(II)V");
 
     // Server callbacks
 
@@ -1313,10 +1322,11 @@
 }
 
 static void gattSetScanParametersNative(JNIEnv* env, jobject object,
-                                        jint scan_interval_unit, jint scan_window_unit)
+                                        jint client_if, jint scan_interval_unit,
+                                        jint scan_window_unit)
 {
     if (!sGattIf) return;
-    sGattIf->client->set_scan_parameters(scan_interval_unit, scan_window_unit);
+    sGattIf->client->set_scan_parameters(client_if, scan_interval_unit, scan_window_unit);
 }
 
 static void gattClientScanFilterParamAddNative(JNIEnv* env, jobject object, jobject params)
@@ -1823,7 +1833,7 @@
     {"gattClientScanFilterDeleteNative", "(IIIIIJJJJLjava/lang/String;Ljava/lang/String;B[B[B)V", (void *) gattClientScanFilterDeleteNative},
     {"gattClientScanFilterClearNative", "(II)V", (void *) gattClientScanFilterClearNative},
     {"gattClientScanFilterEnableNative", "(IZ)V", (void *) gattClientScanFilterEnableNative},
-    {"gattSetScanParametersNative", "(II)V", (void *) gattSetScanParametersNative},
+    {"gattSetScanParametersNative", "(III)V", (void *) gattSetScanParametersNative},
 };
 
 // JNI functions defined in GattService class.
diff --git a/src/com/android/bluetooth/btservice/AdapterProperties.java b/src/com/android/bluetooth/btservice/AdapterProperties.java
index 7e550a7..f16b3a9 100644
--- a/src/com/android/bluetooth/btservice/AdapterProperties.java
+++ b/src/com/android/bluetooth/btservice/AdapterProperties.java
@@ -66,6 +66,8 @@
     private int mOffloadedScanResultStorageBytes;
     private int mVersSupported;
     private int mTotNumOfTrackableAdv;
+    private boolean mIsExtendedScanSupported;
+    private boolean mIsDebugLogSupported;
     private boolean mIsActivityAndEnergyReporting;
 
     // Lock for all getters and setters.
@@ -564,6 +566,10 @@
         mTotNumOfTrackableAdv = ((0xFF & ((int)val[11])) << 8)
                             + (0xFF & ((int)val[10]));
 
+        // TBD - Logic to be modified by Google as needed here
+        mIsExtendedScanSupported = ((0xFF & ((int)val[12])) != 0);
+        mIsDebugLogSupported = ((0xFF & ((int)val[13])) != 0);
+
         Log.d(TAG, "BT_PROPERTY_LOCAL_LE_FEATURES: update from BT controller"
                 + " mNumOfAdvertisementInstancesSupported = "
                 + mNumOfAdvertisementInstancesSupported
@@ -579,7 +585,12 @@
                 +" mVersSupported = "
                 + mVersSupported
                 + " mTotNumOfTrackableAdv = "
-                + mTotNumOfTrackableAdv);
+                + mTotNumOfTrackableAdv
+                + " mIsExtendedScanSupported = "
+                + mIsExtendedScanSupported
+                + " mIsDebugLogSupported = "
+                + mIsDebugLogSupported
+                );
     }
 
     void onBluetoothReady() {
diff --git a/src/com/android/bluetooth/gatt/GattService.java b/src/com/android/bluetooth/gatt/GattService.java
index 71f1182..3437480 100644
--- a/src/com/android/bluetooth/gatt/GattService.java
+++ b/src/com/android/bluetooth/gatt/GattService.java
@@ -1179,6 +1179,16 @@
         }
     }
 
+    void onScanParamSetupCompleted(int status, int clientIf) throws RemoteException {
+        ClientMap.App app = mClientMap.getById(clientIf);
+        if (app == null || app.callback == null) {
+            Log.e(TAG, "Advertise app or callback is null");
+            return;
+        }
+        // TBD - Logic to be modified by Google as needed here
+        Log.d(TAG, "onScanParamSetupCompleted : " + status);
+    }
+
     // callback from AdvertiseManager for advertise status dispatch.
     void onMultipleAdvertiseCallback(int clientIf, int status, boolean isStart,
             AdvertiseSettings settings) throws RemoteException {
diff --git a/src/com/android/bluetooth/gatt/ScanManager.java b/src/com/android/bluetooth/gatt/ScanManager.java
index 239cce3..fc57421 100644
--- a/src/com/android/bluetooth/gatt/ScanManager.java
+++ b/src/com/android/bluetooth/gatt/ScanManager.java
@@ -416,7 +416,9 @@
                     scanWindow = Utils.millsToUnit(scanWindow);
                     scanInterval = Utils.millsToUnit(scanInterval);
                     gattClientScanNative(false);
-                    gattSetScanParametersNative(scanInterval, scanWindow);
+                    logd("configureRegularScanParams - scanInterval = " + scanInterval +
+                        "configureRegularScanParams - scanWindow = " + scanWindow);
+                    gattSetScanParametersNative(client.clientIf, scanInterval, scanWindow);
                     gattClientScanNative(true);
                     mLastConfiguredScanSetting = curScanSetting;
                 }
@@ -857,7 +859,7 @@
         /************************** Regular scan related native methods **************************/
         private native void gattClientScanNative(boolean start);
 
-        private native void gattSetScanParametersNative(int scan_interval,
+        private native void gattSetScanParametersNative(int client_if, int scan_interval,
                 int scan_window);
 
         /************************** Filter related native methods ********************************/