[CONPRO-1483] Implementation of API for setting scanfilter UUIDs
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / bt_le_adapter / android / caleclient.c
index 83ed0ae..9bf9330 100644 (file)
@@ -30,6 +30,7 @@
 #include "caleinterface.h"
 #include "caadapterutils.h"
 
+#include "uarraylist.h"
 #include "logger.h"
 #include "oic_malloc.h"
 #include "oic_string.h"
@@ -121,6 +122,15 @@ static int32_t g_jniIntSdk = -1;
 static bool g_setHighQoS = true;
 static bool g_setFullScanFlag = false;
 jclass g_LEInterface = NULL;
+static int g_manufactureDataCount = 0;
+static int g_serviceUuidCount = 0;
+
+// List of Service UUIDs
+static u_arraylist_t* g_serviceUuidList = NULL;
+
+// List of Manufacture Data
+static u_arraylist_t* g_manufactureDataList = NULL;
+
 /**
  * check if retry logic for connection routine has to be stopped or not.
  * in case of error value including this method, connection routine has to be stopped.
@@ -421,11 +431,62 @@ error_exit:
     return CA_STATUS_FAILED;
 }
 
+void CALEClientAddUuid(char* uuid, int uuid_type)
+{
+    OIC_LOG(DEBUG, TAG, "CALEClientAddUuid");
+    VERIFY_NON_NULL_VOID(uuid, TAG, "uuid is null");
+
+    if (uuid_type == CA_LE_TYPE_CUSTOM_UUID)
+    {
+       if (g_manufactureDataCount == 0)
+       {
+           g_manufactureDataList = u_arraylist_create();
+          OIC_LOG(DEBUG, TAG, "List of manufacture data created");
+       }
+       for (int i = 0; i < g_manufactureDataCount; i++)
+       {
+            char *str = u_arraylist_get(g_manufactureDataList, i);
+            if (!strcmp(uuid, str))
+            {
+                OIC_LOG(DEBUG, TAG, "UUID already set before");
+                return;
+            }
+        }
+        g_manufactureDataCount++;
+        bool result = u_arraylist_add(g_manufactureDataList, uuid);
+        OIC_LOG_V(DEBUG, TAG, "Adding manufacture data: %s", u_arraylist_get(g_manufactureDataList, g_manufactureDataCount - 1));
+    }
+    else //uuid_type == CA_LE_TYPE_SERVICE_UUID
+    {
+        if (g_serviceUuidCount == 0)
+        {
+            g_serviceUuidList = u_arraylist_create();
+            OIC_LOG(DEBUG, TAG, "List of service uuid created");
+        }
+        for (int i = 0; i < g_serviceUuidCount; i++)
+        {
+            char *str = u_arraylist_get(g_serviceUuidList, i);
+            if (!strcmp(uuid, str))
+            {
+                OIC_LOG(DEBUG, TAG, "UUID already set before");
+                return;
+            }
+        }
+        g_serviceUuidCount++;
+        bool result = u_arraylist_add(g_serviceUuidList, uuid);
+        OIC_LOG_V(DEBUG, TAG, "Adding service UUID: %s", u_arraylist_get(g_serviceUuidList, g_serviceUuidCount - 1));
+    }
+}
+
 CAResult_t CALEClientInitialize()
 {
     OIC_LOG(DEBUG, TAG, "CALEClientInitialize");
 
     CALEClientJniInit();
+    CALEClientAddUuid(OIC_GATT_SERVICE_UUID, CA_LE_TYPE_SERVICE_UUID);
+    CALEClientAddUuid(OIC_GATT_CUSTOM_UUID, CA_LE_TYPE_CUSTOM_UUID);
+    CALEClientAddUuid(OIC_GATT_CUSTOM_UUID2, CA_LE_TYPE_CUSTOM_UUID);
+    CALEClientAddUuid(OIC_GATT_CUSTOM_UUID3, CA_LE_TYPE_CUSTOM_UUID);
 
     if (!g_jvm)
     {
@@ -570,6 +631,9 @@ void CALEClientTerminate()
         g_LEInterface = NULL;
     }
 
+    u_arraylist_free(&g_serviceUuidList);
+    u_arraylist_free(&g_manufactureDataList);
+
     CALEDeleteSendBuffer(env);
 
     if (g_uuidList)
@@ -1767,6 +1831,7 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     VERIFY_NON_NULL(uuids, TAG, "uuids is null");
     VERIFY_NON_NULL(env, TAG, "env is null");
 
+    int i, j;
     if (!CALEIsEnableBTAdapter(env))
     {
         OIC_LOG(INFO, TAG, "BT adapter is not enabled");
@@ -1821,53 +1886,35 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     }
 
     // call scanfilter.Builder()
-    jobject jni_obj_scanfilterBuilder = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
-                                                          jni_mid_scanfilterBuilderCtor);
-    if (!jni_obj_scanfilterBuilder)
+    jobject jni_obj_servicescanfilterBuilder[g_serviceUuidCount];
+    for (i = 0; i < g_serviceUuidCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        return CA_STATUS_FAILED;
-    }
-
-    // call scanfilter.Builder()
-    jobject jni_obj_scanfilterBuilder2 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
+        jni_obj_servicescanfilterBuilder[i] = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
                                                           jni_mid_scanfilterBuilderCtor);
-    if (!jni_obj_scanfilterBuilder2)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder2 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        return CA_STATUS_FAILED;
+        if (!jni_obj_servicescanfilterBuilder[i])
+        {
+            OIC_LOG_V(ERROR, TAG, "scanfilter: jni_obj_servicescanfilterBuilder[%d] is null", i);
+            (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
+            for (j = 0; j < i; j++)
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[j]);
+            return CA_STATUS_FAILED;
+        }
     }
 
     // call scanfilter.Builder()
-    jobject jni_obj_scanfilterBuilder3 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
-                                                          jni_mid_scanfilterBuilderCtor);
-    if (!jni_obj_scanfilterBuilder3)
+    jobject jni_obj_customscanfilterBuilder[g_manufactureDataCount];
+    for (i = 0; i < g_manufactureDataCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder3 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        return CA_STATUS_FAILED;
-    }
-
-    // call scanfilter.Builder()
-    jobject jni_obj_scanfilterBuilder4 = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
+        jni_obj_customscanfilterBuilder[i] = (*env)->NewObject(env, jni_cid_scanfilterBuilder,
                                                           jni_mid_scanfilterBuilderCtor);
-    if (!jni_obj_scanfilterBuilder4)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilterBuilder4 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        return CA_STATUS_FAILED;
+       if (!jni_obj_customscanfilterBuilder[i])
+        {
+            OIC_LOG_V(ERROR, TAG, "scanfilter: jni_obj_customscanfilterBuilder[%d] is null", i);
+           (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
+           for (j = 0; j < i; j++)
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+           return CA_STATUS_FAILED;
+        }
     }
 
     // get scanfilter.Builder.setServiceUuid method id
@@ -1880,10 +1927,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanfilter: jni_mid_setServiceUuid is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        for (i = 0; i < g_serviceUuidCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[i]);
+        }
+        for (i = 0; i < g_manufactureDataCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[i]);
+        }
         return CA_STATUS_FAILED;
     }
 
@@ -1897,10 +1948,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanfilter: jni_mid_setManufacturerData is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        for (i = 0; i < g_serviceUuidCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[i]);
+        }
+        for (i = 0; i < g_manufactureDataCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[i]);
+        }
         return CA_STATUS_FAILED;
     }
     // get scanfilter.Builder.build method id
@@ -1914,200 +1969,146 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
         OIC_LOG(ERROR, TAG, "scanfilter: jni_mid_build_scanfilterBuilder is null");
         CACheckJNIException(env);
         (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        for (i = 0; i < g_serviceUuidCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[i]);
+        }
+        for (i = 0; i < g_manufactureDataCount; i++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[i]);
+        }
         return CA_STATUS_FAILED;
     }
     (*env)->DeleteLocalRef(env, jni_cid_scanfilterBuilder);
 
-    // call ParcelUuid.fromSting(uuid)
-    jobject jni_obj_parcelUuid = CALEGetParcelUuidFromString(env, OIC_GATT_SERVICE_UUID);
-    if (!jni_obj_parcelUuid)
+    jobject jni_obj_parcelUuid, jni_obj_setServiceUuid;
+    jobject jni_obj_servicescanfilter[g_serviceUuidCount];
+
+    for (i = 0; i < g_serviceUuidCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "scanSettings: jni_obj_parcelUuid is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
+        // call ParcelUuid.fromSting(uuid)
+        jni_obj_parcelUuid = CALEGetParcelUuidFromString(env, u_arraylist_get(g_serviceUuidList, i));
+        if (!jni_obj_parcelUuid)
+        {
+            OIC_LOG(ERROR, TAG, "scanSettings: jni_obj_parcelUuid is null");
+            CACheckJNIException(env);
+            for (j = i; j < g_serviceUuidCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[j]);
+            }
+            for (j = 0; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+        }
 
-    // call setServiceUuid(uuid)
-    jobject jni_obj_setServiceUuid = (*env)->CallObjectMethod(env,
-                                                              jni_obj_scanfilterBuilder,
+        // call setServiceUuid(uuid)
+        jni_obj_setServiceUuid = (*env)->CallObjectMethod(env,
+                                                              jni_obj_servicescanfilterBuilder[i],
                                                               jni_mid_setServiceUuid,
                                                               jni_obj_parcelUuid);
-    if (!jni_obj_setServiceUuid)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setServiceUuid is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
+        if (!jni_obj_setServiceUuid)
+        {
+            OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setServiceUuid is null");
+            CACheckJNIException(env);
+            for (j = i; j < g_serviceUuidCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[j]);
+            }
+            for (j = 0; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+           (*env)->DeleteLocalRef(env, jni_obj_parcelUuid);
+            return CA_STATUS_FAILED;
+       }
         (*env)->DeleteLocalRef(env, jni_obj_parcelUuid);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_parcelUuid);
-    (*env)->DeleteLocalRef(env, jni_obj_setServiceUuid);
+        (*env)->DeleteLocalRef(env, jni_obj_setServiceUuid);
 
-    // call build()
-    jobject jni_obj_scanfilter = (*env)->CallObjectMethod(env,
-                                                          jni_obj_scanfilterBuilder,
+        // call build()
+        jni_obj_servicescanfilter[i] = (*env)->CallObjectMethod(env,
+                                                          jni_obj_servicescanfilterBuilder[i],
                                                           jni_mid_build_scanfilterBuilder);
-    if (!jni_obj_scanfilter)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder);
+        if (!jni_obj_servicescanfilter[i])
+        {
+            OIC_LOG_V(ERROR, TAG, "scanfilter: jni_obj_scanfilter[%d] is null", i);
+            CACheckJNIException(env);
+            for (j = i; j < g_serviceUuidCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[j]);
+            }
+            for (j = 0; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+        }
+        (*env)->DeleteLocalRef(env, jni_obj_servicescanfilterBuilder[i]);
 
-    OIC_LOG(DEBUG, TAG, "Service UUID scanfilter set");
+        OIC_LOG_V(DEBUG, TAG, "Total %d Service UUID based scanfilter(s) created by now", i + 1);
+    }
 
     jint jni_int_manId;
     jbyteArray jni_byte_manData;
+    jobject jni_obj_setManufacturerData;
+    jobject jni_obj_customscanfilter[g_manufactureDataCount];
     // set manufactererId
     jni_int_manId = MANUFACTURE_ID;
 
-    // call utility function to set manufacturerData
-    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID);
-    if(!jni_byte_manData)
-    {
-        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-
-    // call set(uuid)
-    jobject jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
-                                                              jni_obj_scanfilterBuilder2,
-                                                              jni_mid_setManufacturerData,
-                                                              jni_int_manId,
-                                                              jni_byte_manData);
-    if (!jni_obj_setManufacturerData)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_byte_manData);
-    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
-
-    // call build()
-    jobject jni_obj_scanfilter2 = (*env)->CallObjectMethod(env,
-                                                          jni_obj_scanfilterBuilder2,
-                                                          jni_mid_build_scanfilterBuilder);
-    if (!jni_obj_scanfilter2)
+    // set custom scanfilters
+    for (i = 0; i < g_manufactureDataCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter2 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder2);
-
-    OIC_LOG(DEBUG, TAG, "First custom UUID scanfilter set");
-
-    // call utility function to set manufacturerData
-    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID2);
-    if(!jni_byte_manData)
-    {
-        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
+        // call utility function to set manufacturerData
+        jni_byte_manData = CALEGetManufacturerData(env, u_arraylist_get(g_manufactureDataList, i));
+        if (!jni_byte_manData)
+        {
+            OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
+            CACheckJNIException(env);
+           for(j = i; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+        }
 
-    // call set(uuid)
-    jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
-                                                              jni_obj_scanfilterBuilder3,
+        // call set(uuid)
+        jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
+                                                              jni_obj_customscanfilterBuilder[i],
                                                               jni_mid_setManufacturerData,
                                                               jni_int_manId,
                                                               jni_byte_manData);
+       if (!jni_obj_setManufacturerData)
+       {
+            OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
+            CACheckJNIException(env);
+           for (j = i; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+        }
+        (*env)->DeleteLocalRef(env, jni_byte_manData);
+        (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
+
+        // call build()
+       jni_obj_customscanfilter[i] = (*env)->CallObjectMethod(env,
+                                                            jni_obj_customscanfilterBuilder[i],
+                                                            jni_mid_build_scanfilterBuilder);
+       if (!jni_obj_customscanfilter[i])
+        {
+            OIC_LOG_V(ERROR, TAG, "scanfilter: jni_obj_customscanfilter[%d] is null", i);
+            CACheckJNIException(env);
+            for (j = i; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[j]);
+            }
+            return CA_STATUS_FAILED;
+       }
+       (*env)->DeleteLocalRef(env, jni_obj_customscanfilterBuilder[i]);
 
-    if (!jni_obj_setManufacturerData)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_byte_manData);
-    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
-
-    // call build()
-    jobject jni_obj_scanfilter3 = (*env)->CallObjectMethod(env,
-                                                          jni_obj_scanfilterBuilder3,
-                                                          jni_mid_build_scanfilterBuilder);
-    if (!jni_obj_scanfilter3)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter3 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder3);
-    OIC_LOG(DEBUG, TAG, "Second custom UUID scanfilter set");
-
-    // call utility function to set manufacturerData
-    jni_byte_manData = CALEGetManufacturerData(env, OIC_GATT_CUSTOM_UUID3);
-    if(!jni_byte_manData)
-    {
-        OIC_LOG(ERROR, TAG, "scanSettings: jni_byte_manData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-
-    // call set(uuid)
-    jni_obj_setManufacturerData = (*env)->CallObjectMethod(env,
-                                                               jni_obj_scanfilterBuilder4,
-                                                               jni_mid_setManufacturerData,
-                                                               jni_int_manId,
-                                                               jni_byte_manData);
-
-    if (!jni_obj_setManufacturerData)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_setManufacturerData is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_byte_manData);
-    (*env)->DeleteLocalRef(env, jni_obj_setManufacturerData);
-
-    // call build()
-    jobject jni_obj_scanfilter4 = (*env)->CallObjectMethod(env,
-                                                           jni_obj_scanfilterBuilder4,
-                                                           jni_mid_build_scanfilterBuilder);
-    if (!jni_obj_scanfilter4)
-    {
-        OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanfilter4 is null");
-        CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-        return CA_STATUS_FAILED;
+       OIC_LOG_V(DEBUG, TAG, "Total %d manufacture data based scanfilter(s) created by now", i + 1);
     }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilterBuilder4);
-    OIC_LOG(DEBUG, TAG, "Third custom UUID scanfilter set");
 
     // get scanSettings.Builder class id
     jclass jni_cid_scanSettingsBuilder = (*env)->FindClass(env,
@@ -2117,7 +2118,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanSettings: jni_cid_scanSettingsBuilder is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         return CA_STATUS_FAILED;
     }
 
@@ -2128,7 +2136,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanSettings: jni_mid_scanSettingsBuilderCtor is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_scanSettingsBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2142,7 +2157,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanSettings: jni_mid_setScanMode is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_scanSettingsBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2157,7 +2179,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanSettings: jni_mid_build_scanSettings is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_scanSettingsBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2169,7 +2198,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "scanfilter: jni_obj_scanSettingBuilder is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_scanSettingsBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2180,7 +2216,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "ArrayList: jni_cid_arrayList is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
         return CA_STATUS_FAILED;
     }
@@ -2190,7 +2233,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "ArrayList: jni_mid_arrayListCtor is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_arrayList);
         (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
         return CA_STATUS_FAILED;
@@ -2202,7 +2252,14 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     {
         OIC_LOG(ERROR, TAG, "ArrayList: jni_mid_arrayListAdd is null");
         CACheckJNIException(env);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_arrayList);
         (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
         return CA_STATUS_FAILED;
@@ -2212,66 +2269,66 @@ CAResult_t CALEClientStartScanWithUUIDImplForV21(JNIEnv *env, jobjectArray uuids
     if (!jni_obj_filterList)
     {
         OIC_LOG(ERROR, TAG, "ArrayList: jni_obj_filterList is null");
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
+        for (j = 0; j< g_serviceUuidCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+        }
+        for (j = 0; j< g_manufactureDataCount; j++)
+        {
+            (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+        }
         (*env)->DeleteLocalRef(env, jni_cid_arrayList);
         (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
         return CA_STATUS_FAILED;
     }
     (*env)->DeleteLocalRef(env, jni_cid_arrayList);
 
-    jboolean jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
-                                                                   jni_mid_arrayListAdd,
-                                                                   jni_obj_scanfilter);
-    if (!jni_bool_arrayListIsAdded)
+    jboolean jni_bool_arrayListIsAdded;
+    for (i = 0; i < g_serviceUuidCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
-        (*env)->DeleteLocalRef(env, jni_obj_filterList);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
-        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilter);
-
-    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
+        jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
                                                                    jni_mid_arrayListAdd,
-                                                                   jni_obj_scanfilter2);
-    if (!jni_bool_arrayListIsAdded)
-    {
-        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
-        (*env)->DeleteLocalRef(env, jni_obj_filterList);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter2);
-        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
-        return CA_STATUS_FAILED;
+                                                                   jni_obj_servicescanfilter[i]);
+        if (!jni_bool_arrayListIsAdded)
+        {
+            OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
+            (*env)->DeleteLocalRef(env, jni_obj_filterList);
+            for(j = i; j < g_serviceUuidCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[j]);
+            }
+           for(j = 0; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+            }
+            (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
+            return CA_STATUS_FAILED;
+        }
+        (*env)->DeleteLocalRef(env, jni_obj_servicescanfilter[i]);
+       OIC_LOG_V(INFO, TAG, "%d st/nd/th service uuid based scanFilters Added", i + 1);
     }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilter2);
 
-    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
-                                                                   jni_mid_arrayListAdd,
-                                                                   jni_obj_scanfilter3);
-    if (!jni_bool_arrayListIsAdded)
+    for (i = 0; i < g_manufactureDataCount; i++)
     {
-        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
-        (*env)->DeleteLocalRef(env, jni_obj_filterList);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter3);
-        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
-        return CA_STATUS_FAILED;
-    }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilter3);
-
-    jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
+        jni_bool_arrayListIsAdded = (*env)->CallBooleanMethod(env, jni_obj_filterList,
                                                                    jni_mid_arrayListAdd,
-                                                                   jni_obj_scanfilter4);
-    if (!jni_bool_arrayListIsAdded)
-    {
-        OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
-        (*env)->DeleteLocalRef(env, jni_obj_filterList);
-        (*env)->DeleteLocalRef(env, jni_obj_scanfilter4);
-        (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
-        return CA_STATUS_FAILED;
+                                                                   jni_obj_customscanfilter[i]);
+        if (!jni_bool_arrayListIsAdded)
+        {
+            OIC_LOG(ERROR, TAG, "ArrayList: jni_bool_arrayListIsAdded is null");
+           (*env)->DeleteLocalRef(env, jni_obj_filterList);
+            for(j = i; j < g_manufactureDataCount; j++)
+            {
+                (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[j]);
+            }
+            (*env)->DeleteLocalRef(env, jni_obj_scanSettingBuilder);
+            return CA_STATUS_FAILED;
+        }
+        (*env)->DeleteLocalRef(env, jni_obj_customscanfilter[i]);
+       OIC_LOG_V(INFO, TAG, "%d st/nd/th manufacture data based scanFilters Added", i + 1);
     }
-    (*env)->DeleteLocalRef(env, jni_obj_scanfilter4);
 
-    OIC_LOG(INFO, TAG, "ScanFilters Added");
+    OIC_LOG(INFO, TAG, "All ScanFilters Added");
     // get ScanSettings.SCAN_MODE_BALANCED jint value
     jint jni_int_scanBalancedMode = CALEGetConstantsValue(env, CLASSPATH_LE_SCANSETTINGS,
                                                           "SCAN_MODE_BALANCED");