From b7655e96736e9ad0bf7eb50366b37d2bc5686623 Mon Sep 17 00:00:00 2001 From: Arif Burak Demiray Date: Wed, 6 Nov 2024 17:31:50 +0300 Subject: [PATCH] fix: move list and json array unsupported removals to ios way --- .../android/sdk/UtilsInternalLimitsTests.java | 8 +++- .../android/sdk/UtilsInternalLimits.java | 47 ++++++++++++------- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/sdk/src/androidTest/java/ly/count/android/sdk/UtilsInternalLimitsTests.java b/sdk/src/androidTest/java/ly/count/android/sdk/UtilsInternalLimitsTests.java index 084fa8f78..6d1376d20 100644 --- a/sdk/src/androidTest/java/ly/count/android/sdk/UtilsInternalLimitsTests.java +++ b/sdk/src/androidTest/java/ly/count/android/sdk/UtilsInternalLimitsTests.java @@ -352,13 +352,16 @@ public void removeUnsupportedDataTypes_lists() { Assert.assertTrue(UtilsInternalLimits.removeUnsupportedDataTypes(segmentation, Mockito.mock(ModuleLog.class))); - Assert.assertEquals(6, segmentation.size()); + Assert.assertEquals(9, segmentation.size()); Assert.assertEquals(aa1, segmentation.get("aa1")); Assert.assertEquals(aa2, segmentation.get("aa2")); Assert.assertEquals(aa3, segmentation.get("aa3")); Assert.assertEquals(aa4, segmentation.get("aa4")); Assert.assertEquals(aa5, segmentation.get("aa5")); Assert.assertEquals(aa6, segmentation.get("aa6")); + Assert.assertEquals(Arrays.asList(1, 2, "ABC", true, 3.3d, 4.4f, 5L), segmentation.get("aa7")); + Assert.assertEquals(new ArrayList<>(), segmentation.get("aa8")); + Assert.assertEquals(new ArrayList<>(), segmentation.get("aa9")); } @Test @@ -425,7 +428,7 @@ public void removeUnsupportedDataTypes_jsonArray() { Assert.assertEquals(9, segmentation.size()); Assert.assertTrue(UtilsInternalLimits.removeUnsupportedDataTypes(segmentation, Mockito.mock(ModuleLog.class))); - Assert.assertEquals(8, segmentation.size()); + Assert.assertEquals(9, segmentation.size()); Assert.assertEquals(empty, segmentation.get("empty")); Assert.assertEquals(arrInt, segmentation.get("arrInt")); Assert.assertEquals(arrStr, segmentation.get("arrStr")); @@ -434,6 +437,7 @@ public void removeUnsupportedDataTypes_jsonArray() { Assert.assertEquals(arrFloat, segmentation.get("arrFloat")); Assert.assertEquals(arrLong, segmentation.get("arrLong")); Assert.assertEquals(arrObj, segmentation.get("arrObj")); + Assert.assertEquals(new JSONArray(), segmentation.get("arrObjUltra")); } @Test diff --git a/sdk/src/main/java/ly/count/android/sdk/UtilsInternalLimits.java b/sdk/src/main/java/ly/count/android/sdk/UtilsInternalLimits.java index 4657b5a69..7a68be4ba 100644 --- a/sdk/src/main/java/ly/count/android/sdk/UtilsInternalLimits.java +++ b/sdk/src/main/java/ly/count/android/sdk/UtilsInternalLimits.java @@ -297,6 +297,7 @@ static boolean removeUnsupportedDataTypes(@NonNull Map data, @No assert data != null; StringBuilder removedKeys = new StringBuilder(); + Map gonnaReplace = new ConcurrentHashMap<>(); for (Iterator> it = data.entrySet().iterator(); it.hasNext(); ) { Map.Entry entry = it.next(); @@ -307,9 +308,37 @@ static boolean removeUnsupportedDataTypes(@NonNull Map data, @No //found unsupported data type or null key or value, removing it.remove(); removedKeys.append("key:[").append(key).append("] value:[").append(value).append("] type:[").append(value == null ? "null" : value.getClass().getSimpleName()).append("] ,"); + } else if (value instanceof List) { + List list = (List) value; + list = new ArrayList<>(list); + int a = list.size(); + for (int i = 0; i < a; i++) { + Object element = list.get(i); + if (!isSupportedDataTypeBasic(element)) { + removedKeys.append("from_list").append(list).append("index:[").append(i).append("] value:[").append(element).append("] type:[").append(element == null ? "null" : element.getClass().getSimpleName()).append("] ,"); + list.remove(i); + i--; + a--; + } + } + gonnaReplace.put(key, list); + } else if (value instanceof JSONArray) { + JSONArray jsonArray = (JSONArray) value; + int a = jsonArray.length(); + for (int i = 0; i < a; i++) { + Object element = jsonArray.opt(i); + if (!isSupportedDataTypeBasic(element)) { + removedKeys.append("from_list").append(jsonArray).append("index:[").append(i).append("] value:[").append(element).append("] type:[").append(element == null ? "null" : element.getClass().getSimpleName()).append("] ,"); + jsonArray.remove(i); + i--; + a--; + } + } + gonnaReplace.put(key, jsonArray); } } String removedKeysStr = removedKeys.toString(); + data.putAll(gonnaReplace); if (!removedKeysStr.isEmpty()) { L.w("[UtilsInternalLimits] removeUnsupportedDataTypes, removed " + removedKeysStr + " from the provided data map."); @@ -359,6 +388,7 @@ private static boolean isSupportedDataTypeBasic(@Nullable Object value) { * - User profile custom properties * - User profile custom properties modifiers * - Feedback widgets' results + * This function also removes unsupported data types inside the collections * * @param value to check * @return true if the value is a supported data type @@ -366,27 +396,12 @@ private static boolean isSupportedDataTypeBasic(@Nullable Object value) { static boolean isSupportedDataType(@Nullable Object value) { if (isSupportedDataTypeBasic(value)) { return true; - } else if (value instanceof List) { - List list = (List) value; - for (Object element : list) { - if (!isSupportedDataTypeBasic(element)) { - return false; - } - } + } else if (value instanceof List || value instanceof JSONArray) { return true; } else if (value != null && value.getClass().isArray()) { Class componentType = value.getClass().getComponentType(); return componentType == String.class || componentType == Integer.class || componentType == Double.class || componentType == Boolean.class || componentType == Float.class || componentType == Long.class || componentType == int.class || componentType == double.class || componentType == boolean.class || componentType == float.class || componentType == long.class; - } else if (value instanceof JSONArray) { - JSONArray jsonArray = (JSONArray) value; - for (int i = 0; i < jsonArray.length(); i++) { - Object element = jsonArray.opt(i); - if (!isSupportedDataTypeBasic(element)) { - return false; - } - } - return true; } return false; }