Skip to content

Commit 402eb20

Browse files
Add Arrayutil and MapUtil classes and fix some expected bugs
1 parent 1aee742 commit 402eb20

File tree

3 files changed

+286
-39
lines changed

3 files changed

+286
-39
lines changed

android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java

Lines changed: 10 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -354,17 +354,18 @@ public void IBGLog(String message) {
354354
*/
355355
@ReactMethod
356356
public void getTags(Callback tagsCallback) {
357-
private WritableArray tagsArray;
357+
WritableArray tagsArray;
358358
try {
359359
ArrayList<String> tags = mInstabug.getTags();
360360
tagsArray = new WritableNativeArray();
361361
for (int i = 0; i < tags.size(); i++) {
362362
tagsArray.pushString(tags.get(i));
363363
}
364+
tagsCallback.invoke(tagsArray);
365+
364366
} catch (Exception e) {
365367
e.printStackTrace();
366368
}
367-
tagsCallback.invoke(tagsArray);
368369
}
369370

370371
/**
@@ -652,10 +653,10 @@ public void getUserAttribute(String key, Callback userAttributeCallback) {
652653
String userAttribute;
653654
try {
654655
userAttribute = mInstabug.getUserAttribute(key);
656+
userAttributeCallback.invoke(userAttribute);
655657
} catch (Exception e) {
656658
e.printStackTrace();
657659
}
658-
userAttributeCallback.invoke(userAttribute);
659660
}
660661

661662
/**
@@ -848,21 +849,22 @@ public void logUserEventWithName(String name) {
848849

849850
/**
850851
* Logs a user event that happens through the lifecycle of the application.
851-
* Logged user events are going to be sent with each report, as well as at the end of a session.
852+
* Logged user events are going to be sent with each report, as well as at the end of a
853+
* session.
852854
*
853-
* @param {string} name Event name.
855+
* @param {string} name Event name.
854856
* @param {ReadableMap} params An optional ReadableMap to be associated with the event.
855857
*/
856858
@ReactMethod
857859
public void logUserEventWithNameAndParams(String name, ReadableMap params) {
858860
try {
859-
Map paramsMap = toMap(params);
861+
Map<String, Object> paramsMap = MapUtil.toMap(params);
860862
UserEventParam[] userEventParams = new UserEventParam[paramsMap.size()];
861863
int index = 0;
862864
UserEventParam userEventParam;
863-
for (Map.Entry<String, String> entry : paramsMap.entrySet()) {
865+
for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
864866
userEventParam = new UserEventParam().setKey(entry.getKey())
865-
.setValue(entry.getValue());
867+
.setValue((entry.getValue()).toString());
866868
userEventParams[index] = userEventParam;
867869
index++;
868870
}
@@ -873,38 +875,7 @@ public void logUserEventWithNameAndParams(String name, ReadableMap params) {
873875
}
874876
}
875877

876-
private Map<String, Object> toMap(ReadableMap readableMap) {
877-
Map<String, Object> map = new HashMap<>();
878-
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
879-
880-
while (iterator.hasNextKey()) {
881-
String key = iterator.nextKey();
882-
ReadableType type = readableMap.getType(key);
883-
884-
switch (type) {
885-
case Null:
886-
map.put(key, null);
887-
break;
888-
case Boolean:
889-
map.put(key, readableMap.getBoolean(key));
890-
break;
891-
case Number:
892-
map.put(key, readableMap.getDouble(key));
893-
break;
894-
case String:
895-
map.put(key, readableMap.getString(key));
896-
break;
897-
case Map:
898-
map.put(key, MapUtil.toMap(readableMap.getMap(key)));
899-
break;
900-
case cluster:
901-
map.put(key, ArrayUtil.toArray(readableMap.getArray(key)));
902-
break;
903-
}
904-
}
905878

906-
return map;
907-
}
908879

909880
private InstabugCustomTextPlaceHolder.Key getStringToKeyConstant(String key) {
910881
String keyInLowerCase = key.toLowerCase();
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
/*
2+
ArrayUtil exposes a set of helper methods for working with
3+
ReadableArray (by React Native), Object[], and JSONArray.
4+
*/
5+
6+
package com.instabug.reactlibrary.utils;
7+
8+
import com.facebook.react.bridge.Arguments;
9+
import com.facebook.react.bridge.ReadableArray;
10+
import com.facebook.react.bridge.ReadableType;
11+
import com.facebook.react.bridge.WritableArray;
12+
13+
import java.util.Map;
14+
15+
import org.json.JSONArray;
16+
import org.json.JSONObject;
17+
import org.json.JSONException;
18+
19+
public class ArrayUtil {
20+
21+
public static JSONArray toJSONArray(ReadableArray readableArray) throws JSONException {
22+
JSONArray jsonArray = new JSONArray();
23+
24+
for (int i = 0; i < readableArray.size(); i++) {
25+
ReadableType type = readableArray.getType(i);
26+
27+
switch (type) {
28+
case Null:
29+
jsonArray.put(i, null);
30+
break;
31+
case Boolean:
32+
jsonArray.put(i, readableArray.getBoolean(i));
33+
break;
34+
case Number:
35+
jsonArray.put(i, readableArray.getDouble(i));
36+
break;
37+
case String:
38+
jsonArray.put(i, readableArray.getString(i));
39+
break;
40+
case Map:
41+
jsonArray.put(i, MapUtil.toJSONObject(readableArray.getMap(i)));
42+
break;
43+
case Array:
44+
jsonArray.put(i, ArrayUtil.toJSONArray(readableArray.getArray(i)));
45+
break;
46+
}
47+
}
48+
49+
return jsonArray;
50+
}
51+
52+
public static Object[] toArray(JSONArray jsonArray) throws JSONException {
53+
Object[] array = new Object[jsonArray.length()];
54+
55+
for (int i = 0; i < jsonArray.length(); i++) {
56+
Object value = jsonArray.get(i);
57+
58+
if (value instanceof JSONObject) {
59+
value = MapUtil.toMap((JSONObject) value);
60+
}
61+
if (value instanceof JSONArray) {
62+
value = ArrayUtil.toArray((JSONArray) value);
63+
}
64+
65+
array[i] = value;
66+
}
67+
68+
return array;
69+
}
70+
71+
public static Object[] toArray(ReadableArray readableArray) {
72+
Object[] array = new Object[readableArray.size()];
73+
74+
for (int i = 0; i < readableArray.size(); i++) {
75+
ReadableType type = readableArray.getType(i);
76+
77+
switch (type) {
78+
case Null:
79+
array[i] = null;
80+
break;
81+
case Boolean:
82+
array[i] = readableArray.getBoolean(i);
83+
break;
84+
case Number:
85+
array[i] = readableArray.getDouble(i);
86+
break;
87+
case String:
88+
array[i] = readableArray.getString(i);
89+
break;
90+
case Map:
91+
array[i] = MapUtil.toMap(readableArray.getMap(i));
92+
break;
93+
case Array:
94+
array[i] = ArrayUtil.toArray(readableArray.getArray(i));
95+
break;
96+
}
97+
}
98+
99+
return array;
100+
}
101+
102+
public static WritableArray toWritableArray(Object[] array) {
103+
WritableArray writableArray = Arguments.createArray();
104+
105+
for (int i = 0; i < array.length; i++) {
106+
Object value = array[i];
107+
108+
if (value == null) {
109+
writableArray.pushNull();
110+
}
111+
if (value instanceof Boolean) {
112+
writableArray.pushBoolean((Boolean) value);
113+
}
114+
if (value instanceof Double) {
115+
writableArray.pushDouble((Double) value);
116+
}
117+
if (value instanceof Integer) {
118+
writableArray.pushInt((Integer) value);
119+
}
120+
if (value instanceof String) {
121+
writableArray.pushString((String) value);
122+
}
123+
if (value instanceof Map) {
124+
writableArray.pushMap(MapUtil.toWritableMap((Map<String, Object>) value));
125+
}
126+
if (value.getClass().isArray()) {
127+
writableArray.pushArray(ArrayUtil.toWritableArray((Object[]) value));
128+
}
129+
}
130+
131+
return writableArray;
132+
}
133+
}
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
/*
2+
MapUtil exposes a set of helper methods for working with
3+
ReadableMap (by React Native), Map<String, Object>, and JSONObject.
4+
*/
5+
6+
package com.instabug.reactlibrary.utils;
7+
8+
import com.facebook.react.bridge.Arguments;
9+
import com.facebook.react.bridge.ReadableMap;
10+
import com.facebook.react.bridge.ReadableMapKeySetIterator;
11+
import com.facebook.react.bridge.ReadableType;
12+
import com.facebook.react.bridge.WritableMap;
13+
14+
import java.util.Map;
15+
import java.util.HashMap;
16+
import java.util.Iterator;
17+
18+
import org.json.JSONArray;
19+
import org.json.JSONObject;
20+
import org.json.JSONException;
21+
22+
public class MapUtil {
23+
24+
public static JSONObject toJSONObject(ReadableMap readableMap) throws JSONException {
25+
JSONObject jsonObject = new JSONObject();
26+
27+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
28+
29+
while (iterator.hasNextKey()) {
30+
String key = iterator.nextKey();
31+
ReadableType type = readableMap.getType(key);
32+
33+
switch (type) {
34+
case Null:
35+
jsonObject.put(key, null);
36+
break;
37+
case Boolean:
38+
jsonObject.put(key, readableMap.getBoolean(key));
39+
break;
40+
case Number:
41+
jsonObject.put(key, readableMap.getDouble(key));
42+
break;
43+
case String:
44+
jsonObject.put(key, readableMap.getString(key));
45+
break;
46+
case Map:
47+
jsonObject.put(key, MapUtil.toJSONObject(readableMap.getMap(key)));
48+
break;
49+
case Array:
50+
jsonObject.put(key, ArrayUtil.toJSONArray(readableMap.getArray(key)));
51+
break;
52+
}
53+
}
54+
55+
return jsonObject;
56+
}
57+
58+
public static Map<String, Object> toMap(JSONObject jsonObject) throws JSONException {
59+
Map<String, Object> map = new HashMap<>();
60+
Iterator<String> iterator = jsonObject.keys();
61+
62+
while (iterator.hasNext()) {
63+
String key = iterator.next();
64+
Object value = jsonObject.get(key);
65+
66+
if (value instanceof JSONObject) {
67+
value = MapUtil.toMap((JSONObject) value);
68+
}
69+
if (value instanceof JSONArray) {
70+
value = ArrayUtil.toArray((JSONArray) value);
71+
}
72+
73+
map.put(key, value);
74+
}
75+
76+
return map;
77+
}
78+
79+
public static Map<String, Object> toMap(ReadableMap readableMap) {
80+
Map<String, Object> map = new HashMap<>();
81+
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
82+
83+
while (iterator.hasNextKey()) {
84+
String key = iterator.nextKey();
85+
ReadableType type = readableMap.getType(key);
86+
87+
switch (type) {
88+
case Null:
89+
map.put(key, null);
90+
break;
91+
case Boolean:
92+
map.put(key, readableMap.getBoolean(key));
93+
break;
94+
case Number:
95+
map.put(key, readableMap.getDouble(key));
96+
break;
97+
case String:
98+
map.put(key, readableMap.getString(key));
99+
break;
100+
case Map:
101+
map.put(key, MapUtil.toMap(readableMap.getMap(key)));
102+
break;
103+
case Array:
104+
map.put(key, ArrayUtil.toArray(readableMap.getArray(key)));
105+
break;
106+
}
107+
}
108+
109+
return map;
110+
}
111+
112+
public static WritableMap toWritableMap(Map<String, Object> map) {
113+
WritableMap writableMap = Arguments.createMap();
114+
Iterator iterator = map.entrySet().iterator();
115+
116+
while (iterator.hasNext()) {
117+
Map.Entry pair = (Map.Entry) iterator.next();
118+
Object value = pair.getValue();
119+
120+
if (value == null) {
121+
writableMap.putNull((String) pair.getKey());
122+
} else if (value instanceof Boolean) {
123+
writableMap.putBoolean((String) pair.getKey(), (Boolean) value);
124+
} else if (value instanceof Double) {
125+
writableMap.putDouble((String) pair.getKey(), (Double) value);
126+
} else if (value instanceof Integer) {
127+
writableMap.putInt((String) pair.getKey(), (Integer) value);
128+
} else if (value instanceof String) {
129+
writableMap.putString((String) pair.getKey(), (String) value);
130+
} else if (value instanceof Map) {
131+
writableMap.putMap((String) pair.getKey(), MapUtil.toWritableMap((Map<String,
132+
Object>) value));
133+
} else if (value.getClass() != null && value.getClass().isArray()) {
134+
writableMap.putArray((String) pair.getKey(), ArrayUtil.toWritableArray((Object[])
135+
value));
136+
}
137+
138+
iterator.remove();
139+
}
140+
141+
return writableMap;
142+
}
143+
}

0 commit comments

Comments
 (0)