From 45077bc7a74143febc065092faaae5c8969bd16f Mon Sep 17 00:00:00 2001 From: Libin Lu Date: Tue, 6 Mar 2018 16:00:35 -0500 Subject: [PATCH] convert android actions to json objects --- .../com/evollu/react/fcm/ReactNativeJson.java | 122 ++++++++++++++++++ .../react/fcm/SendNotificationTask.java | 18 ++- 2 files changed, 134 insertions(+), 6 deletions(-) create mode 100644 android/src/main/java/com/evollu/react/fcm/ReactNativeJson.java diff --git a/android/src/main/java/com/evollu/react/fcm/ReactNativeJson.java b/android/src/main/java/com/evollu/react/fcm/ReactNativeJson.java new file mode 100644 index 0000000..e71f77a --- /dev/null +++ b/android/src/main/java/com/evollu/react/fcm/ReactNativeJson.java @@ -0,0 +1,122 @@ +package com.evollu.react.fcm; + +import com.facebook.react.bridge.ReadableArray; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ReadableMapKeySetIterator; +import com.facebook.react.bridge.WritableArray; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.WritableNativeArray; +import com.facebook.react.bridge.WritableNativeMap; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.Iterator; + +public class ReactNativeJson { + public static WritableMap convertJsonToMap(JSONObject jsonObject) throws JSONException { + WritableMap map = new WritableNativeMap(); + + Iterator iterator = jsonObject.keys(); + while (iterator.hasNext()) { + String key = iterator.next(); + Object value = jsonObject.get(key); + if (value instanceof JSONObject) { + map.putMap(key, convertJsonToMap((JSONObject) value)); + } else if (value instanceof JSONArray) { + map.putArray(key, convertJsonToArray((JSONArray) value)); + } else if (value instanceof Boolean) { + map.putBoolean(key, (Boolean) value); + } else if (value instanceof Integer) { + map.putInt(key, (Integer) value); + } else if (value instanceof Double) { + map.putDouble(key, (Double) value); + } else if (value instanceof String) { + map.putString(key, (String) value); + } else { + map.putString(key, value.toString()); + } + } + return map; + } + + public static WritableArray convertJsonToArray(JSONArray jsonArray) throws JSONException { + WritableArray array = new WritableNativeArray(); + + for (int i = 0; i < jsonArray.length(); i++) { + Object value = jsonArray.get(i); + if (value instanceof JSONObject) { + array.pushMap(convertJsonToMap((JSONObject) value)); + } else if (value instanceof JSONArray) { + array.pushArray(convertJsonToArray((JSONArray) value)); + } else if (value instanceof Boolean) { + array.pushBoolean((Boolean) value); + } else if (value instanceof Integer) { + array.pushInt((Integer) value); + } else if (value instanceof Double) { + array.pushDouble((Double) value); + } else if (value instanceof String) { + array.pushString((String) value); + } else { + array.pushString(value.toString()); + } + } + return array; + } + + public static JSONObject convertMapToJson(ReadableMap readableMap) throws JSONException { + JSONObject object = new JSONObject(); + ReadableMapKeySetIterator iterator = readableMap.keySetIterator(); + while (iterator.hasNextKey()) { + String key = iterator.nextKey(); + switch (readableMap.getType(key)) { + case Null: + object.put(key, JSONObject.NULL); + break; + case Boolean: + object.put(key, readableMap.getBoolean(key)); + break; + case Number: + object.put(key, readableMap.getDouble(key)); + break; + case String: + object.put(key, readableMap.getString(key)); + break; + case Map: + object.put(key, convertMapToJson(readableMap.getMap(key))); + break; + case Array: + object.put(key, convertArrayToJson(readableMap.getArray(key))); + break; + } + } + return object; + } + + public static JSONArray convertArrayToJson(ReadableArray readableArray) throws JSONException { + JSONArray array = new JSONArray(); + for (int i = 0; i < readableArray.size(); i++) { + switch (readableArray.getType(i)) { + case Null: + break; + case Boolean: + array.put(readableArray.getBoolean(i)); + break; + case Number: + array.put(readableArray.getDouble(i)); + break; + case String: + array.put(readableArray.getString(i)); + break; + case Map: + array.put(convertMapToJson(readableArray.getMap(i))); + break; + case Array: + array.put(convertArrayToJson(readableArray.getArray(i))); + break; + } + } + return array; + } +} diff --git a/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java b/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java index d97ecf8..b9db6cb 100644 --- a/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java +++ b/android/src/main/java/com/evollu/react/fcm/SendNotificationTask.java @@ -21,6 +21,11 @@ import android.support.v4.app.NotificationManagerCompat; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableArray; + +import org.json.JSONArray; + import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; @@ -213,20 +218,21 @@ public class SendNotificationTask extends AsyncTask { notification.setContentIntent(pendingIntent); if (bundle.containsKey("android_actions")) { - List actions = bundle.getStringArrayList("android_actions"); - bundle.remove("android_actions"); + WritableArray actions = ReactNativeJson.convertJsonToArray(new JSONArray(bundle.getString("android_actions"))); for (int a = 0; a < actions.size(); a++) { - String actionValue = actions.get(a).trim(); + ReadableMap action = actions.getMap(a); + String actionTitle = action.getString("title"); + String actionId = action.getString("id"); Intent actionIntent = new Intent(); actionIntent.setClassName(mContext, intentClassName); - actionIntent.setAction("com.evollu.react.fcm." + actionValue + "_ACTION"); + actionIntent.setAction("com.evollu.react.fcm." + actionId + "_ACTION"); actionIntent.putExtras(bundle); - actionIntent.putExtra("_actionIdentifier", actionValue); + actionIntent.putExtra("_actionIdentifier", actionId); actionIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent pendingActionIntent = PendingIntent.getActivity(mContext, notificationID, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT); - notification.addAction(1, actionValue, pendingActionIntent); + notification.addAction(1, actionTitle, pendingActionIntent); } } -- 2.26.2