diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingModule.java b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingModule.java index 88b66da722..7196021b11 100644 --- a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingModule.java +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingModule.java @@ -28,6 +28,7 @@ import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.WritableMap; import com.google.android.gms.tasks.Tasks; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.messaging.FirebaseMessaging; @@ -41,7 +42,7 @@ public class ReactNativeFirebaseMessagingModule extends ReactNativeFirebaseModule implements ActivityEventListener { private static final String TAG = "Messaging"; - RemoteMessage initialNotification = null; + ReadableMap initialNotification = null; private HashMap initialNotificationMap = new HashMap<>(); ReactNativeFirebaseMessagingModule(ReactApplicationContext reactContext) { @@ -49,17 +50,17 @@ public class ReactNativeFirebaseMessagingModule extends ReactNativeFirebaseModul reactContext.addActivityEventListener(this); } - private RemoteMessage popRemoteMessageFromMessagingStore(String messageId) { + private WritableMap popRemoteMessageMapFromMessagingStore(String messageId) { ReactNativeFirebaseMessagingStore messagingStore = ReactNativeFirebaseMessagingStoreHelper.getInstance().getMessagingStore(); - RemoteMessage remoteMessage = messagingStore.getFirebaseMessage(messageId); + WritableMap remoteMessageMap = messagingStore.getFirebaseMessageMap(messageId); messagingStore.clearFirebaseMessage(messageId); - return remoteMessage; + return remoteMessageMap; } @ReactMethod public void getInitialNotification(Promise promise) { if (initialNotification != null) { - promise.resolve(ReactNativeFirebaseMessagingSerializer.remoteMessageToWritableMap(initialNotification)); + promise.resolve(initialNotification); initialNotification = null; return; } else { @@ -75,12 +76,15 @@ public void getInitialNotification(Promise promise) { // only handle non-consumed initial notifications if (messageId != null && initialNotificationMap.get(messageId) == null) { + WritableMap remoteMessageMap; RemoteMessage remoteMessage = ReactNativeFirebaseMessagingReceiver.notifications.get(messageId); if (remoteMessage == null) { - remoteMessage = popRemoteMessageFromMessagingStore(messageId); + remoteMessageMap = popRemoteMessageMapFromMessagingStore(messageId); + } else { + remoteMessageMap = ReactNativeFirebaseMessagingSerializer.remoteMessageToWritableMap(remoteMessage); } - if (remoteMessage != null) { - promise.resolve(ReactNativeFirebaseMessagingSerializer.remoteMessageToWritableMap(remoteMessage)); + if (remoteMessageMap != null){ + promise.resolve(remoteMessageMap); initialNotificationMap.put(messageId, true); return; } @@ -217,16 +221,20 @@ public void onNewIntent(Intent intent) { if (messageId != null) { RemoteMessage remoteMessage = ReactNativeFirebaseMessagingReceiver.notifications.get(messageId); + WritableMap remoteMessageMap; + if (remoteMessage == null) { - remoteMessage = popRemoteMessageFromMessagingStore(messageId); + remoteMessageMap = popRemoteMessageMapFromMessagingStore(messageId); + } else { + remoteMessageMap = ReactNativeFirebaseMessagingSerializer.remoteMessageToWritableMap(remoteMessage); } - - if (remoteMessage != null) { - initialNotification = remoteMessage; + + if (remoteMessageMap != null){ + initialNotification = remoteMessageMap; ReactNativeFirebaseMessagingReceiver.notifications.remove(messageId); ReactNativeFirebaseEventEmitter emitter = ReactNativeFirebaseEventEmitter.getSharedInstance(); - emitter.sendEvent(ReactNativeFirebaseMessagingSerializer.remoteMessageToEvent(remoteMessage, true)); + emitter.sendEvent(ReactNativeFirebaseMessagingSerializer.remoteMessageMapToEvent(remoteMessageMap, true)); } } } diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingSerializer.java b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingSerializer.java index 0036b033b3..f6ad52d679 100644 --- a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingSerializer.java +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingSerializer.java @@ -50,6 +50,10 @@ public static ReactNativeFirebaseEvent remoteMessageToEvent(RemoteMessage remote return new ReactNativeFirebaseEvent(openEvent ? EVENT_NOTIFICATION_OPENED : EVENT_MESSAGE_RECEIVED, remoteMessageToWritableMap(remoteMessage)); } + public static ReactNativeFirebaseEvent remoteMessageMapToEvent(WritableMap remoteMessageMap, Boolean openEvent) { + return new ReactNativeFirebaseEvent(openEvent ? EVENT_NOTIFICATION_OPENED : EVENT_MESSAGE_RECEIVED, remoteMessageMap); + } + public static ReactNativeFirebaseEvent newTokenToTokenEvent(String newToken) { WritableMap eventBody = Arguments.createMap(); eventBody.putString(KEY_TOKEN, newToken); diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingStore.java b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingStore.java index c7effba925..ac2a4318dd 100644 --- a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingStore.java +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingStore.java @@ -2,10 +2,15 @@ import com.google.firebase.messaging.RemoteMessage; +import com.facebook.react.bridge.WritableMap; + public interface ReactNativeFirebaseMessagingStore { void storeFirebaseMessage(RemoteMessage remoteMessage); + @Deprecated RemoteMessage getFirebaseMessage(String remoteMessageId); + WritableMap getFirebaseMessageMap(String remoteMessageId); + void clearFirebaseMessage(String remoteMessageId); } diff --git a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingStoreImpl.java b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingStoreImpl.java index 94c2b16e12..c0045d7c2c 100644 --- a/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingStoreImpl.java +++ b/packages/messaging/android/src/main/java/io/invertase/firebase/messaging/ReactNativeFirebaseMessagingStoreImpl.java @@ -1,5 +1,6 @@ package io.invertase.firebase.messaging; +import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.google.firebase.messaging.RemoteMessage; @@ -47,16 +48,26 @@ public void storeFirebaseMessage(RemoteMessage remoteMessage) { } } + @Deprecated @Override public RemoteMessage getFirebaseMessage(String remoteMessageId) { + ReadableMap messageMap = getFirebaseMessageMap(remoteMessageId); + if (messageMap != null){ + return remoteMessageFromReadableMap(messageMap); + } + return null; + } + + @Override + public WritableMap getFirebaseMessageMap(String remoteMessageId) { String remoteMessageString = UniversalFirebasePreferences.getSharedInstance().getStringValue(remoteMessageId, null); if (remoteMessageString != null) { // Log.d("getFirebaseMessage", remoteMessageString); try { - WritableMap readableMap = jsonToReact(new JSONObject(remoteMessageString)); - readableMap.putString("to", remoteMessageId);//fake to - return remoteMessageFromReadableMap(readableMap); - } catch (JSONException e) { + WritableMap remoteMessageMap = jsonToReact(new JSONObject(remoteMessageString)); + remoteMessageMap.putString("to", remoteMessageId);//fake to + return remoteMessageMap; + } catch (JSONException e) { e.printStackTrace(); } }