Merge "Discover primary service by UUID for PTS tests (3/4)"
diff --git a/jni/com_android_bluetooth_gatt.cpp b/jni/com_android_bluetooth_gatt.cpp
index 21a7c3c..6e3112a 100644
--- a/jni/com_android_bluetooth_gatt.cpp
+++ b/jni/com_android_bluetooth_gatt.cpp
@@ -1069,6 +1069,17 @@
   sGattIf->client->search_service(conn_id, search_all ? 0 : &uuid);
 }
 
+static void gattClientDiscoverServiceByUuidNative(JNIEnv* env, jobject object,
+                                                  jint conn_id,
+                                                  jlong service_uuid_lsb,
+                                                  jlong service_uuid_msb) {
+  if (!sGattIf) return;
+
+  bt_uuid_t uuid;
+  set_uuid(uuid.uu, service_uuid_msb, service_uuid_lsb);
+  sGattIf->client->btif_gattc_discover_service_by_uuid(conn_id, &uuid);
+}
+
 static void gattClientGetGattDbNative(JNIEnv* env, jobject object,
                                       jint conn_id) {
   if (!sGattIf) return;
@@ -2172,6 +2183,8 @@
      (void*)gattClientRefreshNative},
     {"gattClientSearchServiceNative", "(IZJJ)V",
      (void*)gattClientSearchServiceNative},
+    {"gattClientDiscoverServiceByUuidNative", "(IJJ)V",
+     (void*)gattClientDiscoverServiceByUuidNative},
     {"gattClientGetGattDbNative", "(I)V", (void*)gattClientGetGattDbNative},
     {"gattClientReadCharacteristicNative", "(III)V",
      (void*)gattClientReadCharacteristicNative},
diff --git a/src/com/android/bluetooth/gatt/GattService.java b/src/com/android/bluetooth/gatt/GattService.java
index a62f1bc..9f4ea68 100644
--- a/src/com/android/bluetooth/gatt/GattService.java
+++ b/src/com/android/bluetooth/gatt/GattService.java
@@ -425,6 +425,12 @@
             service.discoverServices(clientIf, address);
         }
 
+        public void discoverServiceByUuid(int clientIf, String address, ParcelUuid uuid) {
+            GattService service = getService();
+            if (service == null) return;
+            service.discoverServiceByUuid(clientIf, address, uuid.getUuid());
+        }
+
         public void readCharacteristic(int clientIf, String address, int handle, int authReq) {
             GattService service = getService();
             if (service == null) return;
@@ -1684,6 +1690,17 @@
             Log.e(TAG, "discoverServices() - No connection for " + address + "...");
     }
 
+    void discoverServiceByUuid(int clientIf, String address, UUID uuid) {
+        enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
+
+        Integer connId = mClientMap.connIdByAddress(clientIf, address);
+        if (connId != null)
+            gattClientDiscoverServiceByUuidNative(
+                    connId, uuid.getLeastSignificantBits(), uuid.getMostSignificantBits());
+        else
+            Log.e(TAG, "discoverServiceByUuid() - No connection for " + address + "...");
+    }
+
     void readCharacteristic(int clientIf, String address, int handle, int authReq) {
         enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
 
@@ -2495,6 +2512,9 @@
     private native void gattClientSearchServiceNative(int conn_id,
             boolean search_all, long service_uuid_lsb, long service_uuid_msb);
 
+    private native void gattClientDiscoverServiceByUuidNative(
+            int conn_id, long service_uuid_lsb, long service_uuid_msb);
+
     private native void gattClientGetGattDbNative(int conn_id);
 
     private native void gattClientReadCharacteristicNative(int conn_id, int handle, int authReq);