package com.dieam.reactnativepushnotification.modules; import android.os.Bundle; import android.support.annotation.NonNull; import android.util.Log; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableMapKeySetIterator; import org.json.JSONException; import org.json.JSONObject; import static com.dieam.reactnativepushnotification.modules.RNPushNotification.LOG_TAG; public class RNPushNotificationAttributes { private static final String ID = "id"; private static final String MESSAGE = "message"; private static final String FIRE_DATE = "fireDate"; private static final String TITLE = "title"; private static final String TICKER = "ticker"; private static final String AUTO_CANCEL = "autoCancel"; private static final String LARGE_ICON = "largeIcon"; private static final String SMALL_ICON = "smallIcon"; private static final String BIG_TEXT = "bigText"; private static final String SUB_TEXT = "subText"; private static final String NUMBER = "number"; private static final String SOUND = "sound"; private static final String COLOR = "color"; private static final String GROUP = "group"; private static final String USER_INTERACTION = "userInteraction"; private static final String PLAY_SOUND = "playSound"; private static final String VIBRATE = "vibrate"; private static final String VIBRATION = "vibration"; private static final String ACTIONS = "actions"; private static final String TAG = "tag"; private static final String REPEAT_TYPE = "repeatType"; private static final String REPEAT_TIME = "repeatTime"; private static final String ONGOING = "ongoing"; private final String id; private final String message; private final double fireDate; private final String title; private final String ticker; private final boolean autoCancel; private final String largeIcon; private final String smallIcon; private final String bigText; private final String subText; private final String number; private final String sound; private final String color; private final String group; private final boolean userInteraction; private final boolean playSound; private final boolean vibrate; private final double vibration; private final String actions; private final String tag; private final String repeatType; private final double repeatTime; private final boolean ongoing; public RNPushNotificationAttributes(Bundle bundle) { id = bundle.getString(ID); message = bundle.getString(MESSAGE); fireDate = bundle.getDouble(FIRE_DATE); title = bundle.getString(TITLE); ticker = bundle.getString(TICKER); autoCancel = bundle.getBoolean(AUTO_CANCEL); largeIcon = bundle.getString(LARGE_ICON); smallIcon = bundle.getString(SMALL_ICON); bigText = bundle.getString(BIG_TEXT); subText = bundle.getString(SUB_TEXT); number = bundle.getString(NUMBER); sound = bundle.getString(SOUND); color = bundle.getString(COLOR); group = bundle.getString(GROUP); userInteraction = bundle.getBoolean(USER_INTERACTION); playSound = bundle.getBoolean(PLAY_SOUND); vibrate = bundle.getBoolean(VIBRATE); vibration = bundle.getDouble(VIBRATION); actions = bundle.getString(ACTIONS); tag = bundle.getString(TAG); repeatType = bundle.getString(REPEAT_TYPE); repeatTime = bundle.getDouble(REPEAT_TIME); ongoing = bundle.getBoolean(ONGOING); } private RNPushNotificationAttributes(JSONObject jsonObject) { try { id = jsonObject.has(ID) ? jsonObject.getString(ID) : null; message = jsonObject.has(MESSAGE) ? jsonObject.getString(MESSAGE) : null; fireDate = jsonObject.has(FIRE_DATE) ? jsonObject.getDouble(FIRE_DATE) : 0.0; title = jsonObject.has(TITLE) ? jsonObject.getString(TITLE) : null; ticker = jsonObject.has(TICKER) ? jsonObject.getString(TICKER) : null; autoCancel = jsonObject.has(AUTO_CANCEL) ? jsonObject.getBoolean(AUTO_CANCEL) : true; largeIcon = jsonObject.has(LARGE_ICON) ? jsonObject.getString(LARGE_ICON) : null; smallIcon = jsonObject.has(SMALL_ICON) ? jsonObject.getString(SMALL_ICON) : null; bigText = jsonObject.has(BIG_TEXT) ? jsonObject.getString(BIG_TEXT) : null; subText = jsonObject.has(SUB_TEXT) ? jsonObject.getString(SUB_TEXT) : null; number = jsonObject.has(NUMBER) ? jsonObject.getString(NUMBER) : null; sound = jsonObject.has(SOUND) ? jsonObject.getString(SOUND) : null; color = jsonObject.has(COLOR) ? jsonObject.getString(COLOR) : null; group = jsonObject.has(GROUP) ? jsonObject.getString(GROUP) : null; userInteraction = jsonObject.has(USER_INTERACTION) ? jsonObject.getBoolean(USER_INTERACTION) : false; playSound = jsonObject.has(PLAY_SOUND) ? jsonObject.getBoolean(PLAY_SOUND) : true; vibrate = jsonObject.has(VIBRATE) ? jsonObject.getBoolean(VIBRATE) : true; vibration = jsonObject.has(VIBRATION) ? jsonObject.getDouble(VIBRATION) : 1000; actions = jsonObject.has(ACTIONS) ? jsonObject.getString(ACTIONS) : null; tag = jsonObject.has(TAG) ? jsonObject.getString(TAG) : null; repeatType = jsonObject.has(REPEAT_TYPE) ? jsonObject.getString(REPEAT_TYPE) : null; repeatTime = jsonObject.has(REPEAT_TIME) ? jsonObject.getDouble(REPEAT_TIME) : 0.0; ongoing = jsonObject.has(ONGOING) ? jsonObject.getBoolean(ONGOING) : false; } catch (JSONException e) { throw new IllegalStateException("Exception while initializing RNPushNotificationAttributes from JSON", e); } } @NonNull public static RNPushNotificationAttributes fromJson(String notificationAttributesJson) throws JSONException { JSONObject jsonObject = new JSONObject(notificationAttributesJson); return new RNPushNotificationAttributes(jsonObject); } /** * User to find notifications: * <p> * https://github.com/facebook/react-native/blob/master/Libraries/PushNotificationIOS/RCTPushNotificationManager.m#L294 * * @param userInfo map of fields to match * @return true all fields in userInfo object match, false otherwise */ public boolean matches(ReadableMap userInfo) { Bundle bundle = toBundle(); ReadableMapKeySetIterator iterator = userInfo.keySetIterator(); while (iterator.hasNextKey()) { String key = iterator.nextKey(); if (!bundle.containsKey(key)) return false; switch (userInfo.getType(key)) { case Null: { if (bundle.get(key) != null) return false; break; } case Boolean: { if (userInfo.getBoolean(key) != bundle.getBoolean(key)) return false; break; } case Number: { if ((userInfo.getDouble(key) != bundle.getDouble(key)) && (userInfo.getInt(key) != bundle.getInt(key))) return false; break; } case String: { if (!userInfo.getString(key).equals(bundle.getString(key))) return false; break; } case Map: return false;//there are no maps in the bundle case Array: return false;//there are no arrays in the bundle } } return true; } public Bundle toBundle() { Bundle bundle = new Bundle(); bundle.putString(ID, id); bundle.putString(MESSAGE, message); bundle.putDouble(FIRE_DATE, fireDate); bundle.putString(TITLE, title); bundle.putString(TICKER, ticker); bundle.putBoolean(AUTO_CANCEL, autoCancel); bundle.putString(LARGE_ICON, largeIcon); bundle.putString(SMALL_ICON, smallIcon); bundle.putString(BIG_TEXT, bigText); bundle.putString(SUB_TEXT, subText); bundle.putString(NUMBER, number); bundle.putString(SOUND, sound); bundle.putString(COLOR, color); bundle.putString(GROUP, group); bundle.putBoolean(USER_INTERACTION, userInteraction); bundle.putBoolean(PLAY_SOUND, playSound); bundle.putBoolean(VIBRATE, vibrate); bundle.putDouble(VIBRATION, vibration); bundle.putString(ACTIONS, actions); bundle.putString(TAG, tag); bundle.putString(REPEAT_TYPE, repeatType); bundle.putDouble(REPEAT_TIME, repeatTime); bundle.putBoolean(ONGOING, ongoing); return bundle; } public JSONObject toJson() { JSONObject jsonObject = new JSONObject(); try { jsonObject.put(ID, id); jsonObject.put(MESSAGE, message); jsonObject.put(FIRE_DATE, fireDate); jsonObject.put(TITLE, title); jsonObject.put(TICKER, ticker); jsonObject.put(AUTO_CANCEL, autoCancel); jsonObject.put(LARGE_ICON, largeIcon); jsonObject.put(SMALL_ICON, smallIcon); jsonObject.put(BIG_TEXT, bigText); jsonObject.put(SUB_TEXT, subText); jsonObject.put(NUMBER, number); jsonObject.put(SOUND, sound); jsonObject.put(COLOR, color); jsonObject.put(GROUP, group); jsonObject.put(USER_INTERACTION, userInteraction); jsonObject.put(PLAY_SOUND, playSound); jsonObject.put(VIBRATE, vibrate); jsonObject.put(VIBRATION, vibration); jsonObject.put(ACTIONS, actions); jsonObject.put(TAG, tag); jsonObject.put(REPEAT_TYPE, repeatType); jsonObject.put(REPEAT_TIME, repeatTime); jsonObject.put(ONGOING, ongoing); } catch (JSONException e) { Log.e(LOG_TAG, "Exception while converting RNPushNotificationAttributes to " + "JSON. Returning an empty object", e); return new JSONObject(); } return jsonObject; } @Override // For debugging public String toString() { return "RNPushNotificationAttributes{" + "id='" + id + '\'' + ", message='" + message + '\'' + ", fireDate=" + fireDate + ", title='" + title + '\'' + ", ticker='" + ticker + '\'' + ", autoCancel=" + autoCancel + ", largeIcon='" + largeIcon + '\'' + ", smallIcon='" + smallIcon + '\'' + ", bigText='" + bigText + '\'' + ", subText='" + subText + '\'' + ", number='" + number + '\'' + ", sound='" + sound + '\'' + ", color='" + color + '\'' + ", group='" + group + '\'' + ", userInteraction=" + userInteraction + ", playSound=" + playSound + ", vibrate=" + vibrate + ", vibration=" + vibration + ", actions='" + actions + '\'' + ", tag='" + tag + '\'' + ", repeatType='" + repeatType + '\'' + ", repeatTime=" + repeatTime + ", ongoing=" + ongoing + '}'; } public String getId() { return id; } public double getFireDate() { return fireDate; } }