diff --git a/android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java b/android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java index 002fb4d..7bae1aa 100644 --- a/android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java +++ b/android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java @@ -354,17 +354,18 @@ public class RNInstabugReactnativeModule extends ReactContextBaseJavaModule { */ @ReactMethod public void getTags(Callback tagsCallback) { - private WritableArray tagsArray; + WritableArray tagsArray; try { ArrayList tags = mInstabug.getTags(); tagsArray = new WritableNativeArray(); for (int i = 0; i < tags.size(); i++) { tagsArray.pushString(tags.get(i)); } + tagsCallback.invoke(tagsArray); + } catch (Exception e) { e.printStackTrace(); } - tagsCallback.invoke(tagsArray); } /** @@ -652,10 +653,10 @@ public class RNInstabugReactnativeModule extends ReactContextBaseJavaModule { String userAttribute; try { userAttribute = mInstabug.getUserAttribute(key); + userAttributeCallback.invoke(userAttribute); } catch (Exception e) { e.printStackTrace(); } - userAttributeCallback.invoke(userAttribute); } /** @@ -848,21 +849,22 @@ public class RNInstabugReactnativeModule extends ReactContextBaseJavaModule { /** * Logs a user event that happens through the lifecycle of the application. - * Logged user events are going to be sent with each report, as well as at the end of a session. + * Logged user events are going to be sent with each report, as well as at the end of a + * session. * - * @param {string} name Event name. + * @param {string} name Event name. * @param {ReadableMap} params An optional ReadableMap to be associated with the event. */ @ReactMethod public void logUserEventWithNameAndParams(String name, ReadableMap params) { try { - Map paramsMap = toMap(params); + Map paramsMap = MapUtil.toMap(params); UserEventParam[] userEventParams = new UserEventParam[paramsMap.size()]; int index = 0; UserEventParam userEventParam; - for (Map.Entry entry : paramsMap.entrySet()) { + for (Map.Entry entry : paramsMap.entrySet()) { userEventParam = new UserEventParam().setKey(entry.getKey()) - .setValue(entry.getValue()); + .setValue((entry.getValue()).toString()); userEventParams[index] = userEventParam; index++; } @@ -873,38 +875,7 @@ public class RNInstabugReactnativeModule extends ReactContextBaseJavaModule { } } - private Map toMap(ReadableMap readableMap) { - Map map = new HashMap<>(); - ReadableMapKeySetIterator iterator = readableMap.keySetIterator(); - while (iterator.hasNextKey()) { - String key = iterator.nextKey(); - ReadableType type = readableMap.getType(key); - - switch (type) { - case Null: - map.put(key, null); - break; - case Boolean: - map.put(key, readableMap.getBoolean(key)); - break; - case Number: - map.put(key, readableMap.getDouble(key)); - break; - case String: - map.put(key, readableMap.getString(key)); - break; - case Map: - map.put(key, MapUtil.toMap(readableMap.getMap(key))); - break; - case cluster: - map.put(key, ArrayUtil.toArray(readableMap.getArray(key))); - break; - } - } - - return map; - } private InstabugCustomTextPlaceHolder.Key getStringToKeyConstant(String key) { String keyInLowerCase = key.toLowerCase(); diff --git a/android/src/main/java/com/instabug/reactlibrary/utils/ArrayUtil.java b/android/src/main/java/com/instabug/reactlibrary/utils/ArrayUtil.java new file mode 100644 index 0000000..b5f2c65 --- /dev/null +++ b/android/src/main/java/com/instabug/reactlibrary/utils/ArrayUtil.java @@ -0,0 +1,133 @@ +/* + ArrayUtil exposes a set of helper methods for working with + ReadableArray (by React Native), Object[], and JSONArray. + */ + +package com.instabug.reactlibrary.utils; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableType; +import com.facebook.react.bridge.WritableArray; + +import java.util.Map; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.json.JSONException; + +public class ArrayUtil { + + public static JSONArray toJSONArray(ReadableArray readableArray) throws JSONException { + JSONArray jsonArray = new JSONArray(); + + for (int i = 0; i < readableArray.size(); i++) { + ReadableType type = readableArray.getType(i); + + switch (type) { + case Null: + jsonArray.put(i, null); + break; + case Boolean: + jsonArray.put(i, readableArray.getBoolean(i)); + break; + case Number: + jsonArray.put(i, readableArray.getDouble(i)); + break; + case String: + jsonArray.put(i, readableArray.getString(i)); + break; + case Map: + jsonArray.put(i, MapUtil.toJSONObject(readableArray.getMap(i))); + break; + case Array: + jsonArray.put(i, ArrayUtil.toJSONArray(readableArray.getArray(i))); + break; + } + } + + return jsonArray; + } + + public static Object[] toArray(JSONArray jsonArray) throws JSONException { + Object[] array = new Object[jsonArray.length()]; + + for (int i = 0; i < jsonArray.length(); i++) { + Object value = jsonArray.get(i); + + if (value instanceof JSONObject) { + value = MapUtil.toMap((JSONObject) value); + } + if (value instanceof JSONArray) { + value = ArrayUtil.toArray((JSONArray) value); + } + + array[i] = value; + } + + return array; + } + + public static Object[] toArray(ReadableArray readableArray) { + Object[] array = new Object[readableArray.size()]; + + for (int i = 0; i < readableArray.size(); i++) { + ReadableType type = readableArray.getType(i); + + switch (type) { + case Null: + array[i] = null; + break; + case Boolean: + array[i] = readableArray.getBoolean(i); + break; + case Number: + array[i] = readableArray.getDouble(i); + break; + case String: + array[i] = readableArray.getString(i); + break; + case Map: + array[i] = MapUtil.toMap(readableArray.getMap(i)); + break; + case Array: + array[i] = ArrayUtil.toArray(readableArray.getArray(i)); + break; + } + } + + return array; + } + + public static WritableArray toWritableArray(Object[] array) { + WritableArray writableArray = Arguments.createArray(); + + for (int i = 0; i < array.length; i++) { + Object value = array[i]; + + if (value == null) { + writableArray.pushNull(); + } + if (value instanceof Boolean) { + writableArray.pushBoolean((Boolean) value); + } + if (value instanceof Double) { + writableArray.pushDouble((Double) value); + } + if (value instanceof Integer) { + writableArray.pushInt((Integer) value); + } + if (value instanceof String) { + writableArray.pushString((String) value); + } + if (value instanceof Map) { + writableArray.pushMap(MapUtil.toWritableMap((Map) value)); + } + if (value.getClass().isArray()) { + writableArray.pushArray(ArrayUtil.toWritableArray((Object[]) value)); + } + } + + return writableArray; + } +} \ No newline at end of file diff --git a/android/src/main/java/com/instabug/reactlibrary/utils/MapUtil.java b/android/src/main/java/com/instabug/reactlibrary/utils/MapUtil.java new file mode 100644 index 0000000..b6539fb --- /dev/null +++ b/android/src/main/java/com/instabug/reactlibrary/utils/MapUtil.java @@ -0,0 +1,143 @@ +/* + MapUtil exposes a set of helper methods for working with + ReadableMap (by React Native), Map, and JSONObject. + */ + +package com.instabug.reactlibrary.utils; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ReadableMapKeySetIterator; +import com.facebook.react.bridge.ReadableType; +import com.facebook.react.bridge.WritableMap; + +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.json.JSONException; + +public class MapUtil { + + public static JSONObject toJSONObject(ReadableMap readableMap) throws JSONException { + JSONObject jsonObject = new JSONObject(); + + ReadableMapKeySetIterator iterator = readableMap.keySetIterator(); + + while (iterator.hasNextKey()) { + String key = iterator.nextKey(); + ReadableType type = readableMap.getType(key); + + switch (type) { + case Null: + jsonObject.put(key, null); + break; + case Boolean: + jsonObject.put(key, readableMap.getBoolean(key)); + break; + case Number: + jsonObject.put(key, readableMap.getDouble(key)); + break; + case String: + jsonObject.put(key, readableMap.getString(key)); + break; + case Map: + jsonObject.put(key, MapUtil.toJSONObject(readableMap.getMap(key))); + break; + case Array: + jsonObject.put(key, ArrayUtil.toJSONArray(readableMap.getArray(key))); + break; + } + } + + return jsonObject; + } + + public static Map toMap(JSONObject jsonObject) throws JSONException { + Map map = new HashMap<>(); + Iterator iterator = jsonObject.keys(); + + while (iterator.hasNext()) { + String key = iterator.next(); + Object value = jsonObject.get(key); + + if (value instanceof JSONObject) { + value = MapUtil.toMap((JSONObject) value); + } + if (value instanceof JSONArray) { + value = ArrayUtil.toArray((JSONArray) value); + } + + map.put(key, value); + } + + return map; + } + + public static Map toMap(ReadableMap readableMap) { + Map map = new HashMap<>(); + ReadableMapKeySetIterator iterator = readableMap.keySetIterator(); + + while (iterator.hasNextKey()) { + String key = iterator.nextKey(); + ReadableType type = readableMap.getType(key); + + switch (type) { + case Null: + map.put(key, null); + break; + case Boolean: + map.put(key, readableMap.getBoolean(key)); + break; + case Number: + map.put(key, readableMap.getDouble(key)); + break; + case String: + map.put(key, readableMap.getString(key)); + break; + case Map: + map.put(key, MapUtil.toMap(readableMap.getMap(key))); + break; + case Array: + map.put(key, ArrayUtil.toArray(readableMap.getArray(key))); + break; + } + } + + return map; + } + + public static WritableMap toWritableMap(Map map) { + WritableMap writableMap = Arguments.createMap(); + Iterator iterator = map.entrySet().iterator(); + + while (iterator.hasNext()) { + Map.Entry pair = (Map.Entry) iterator.next(); + Object value = pair.getValue(); + + if (value == null) { + writableMap.putNull((String) pair.getKey()); + } else if (value instanceof Boolean) { + writableMap.putBoolean((String) pair.getKey(), (Boolean) value); + } else if (value instanceof Double) { + writableMap.putDouble((String) pair.getKey(), (Double) value); + } else if (value instanceof Integer) { + writableMap.putInt((String) pair.getKey(), (Integer) value); + } else if (value instanceof String) { + writableMap.putString((String) pair.getKey(), (String) value); + } else if (value instanceof Map) { + writableMap.putMap((String) pair.getKey(), MapUtil.toWritableMap((Map) value)); + } else if (value.getClass() != null && value.getClass().isArray()) { + writableMap.putArray((String) pair.getKey(), ArrayUtil.toWritableArray((Object[]) + value)); + } + + iterator.remove(); + } + + return writableMap; + } +} \ No newline at end of file