diff --git a/node_modules/expo-notifications/android/build.gradle b/node_modules/expo-notifications/android/build.gradle index 13bffbb..5ebbede 100644 --- a/node_modules/expo-notifications/android/build.gradle +++ b/node_modules/expo-notifications/android/build.gradle @@ -46,6 +46,7 @@ dependencies { implementation 'com.google.firebase:firebase-messaging:24.0.1' implementation 'me.leolin:ShortcutBadger:1.1.22@aar' + implementation project(':expo-background-notification-handler') if (project.findProject(':expo-modules-test-core')) { testImplementation project(':expo-modules-test-core') diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/interfaces/INotificationContent.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/interfaces/INotificationContent.kt index 7b99e6c..45a450d 100644 --- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/interfaces/INotificationContent.kt +++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/interfaces/INotificationContent.kt @@ -15,6 +15,7 @@ import org.json.JSONObject * This interface exists to provide a common API for both classes. * */ interface INotificationContent : Parcelable { + val channelId: String? val title: String? val text: String? val subText: String? diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java index 191b64e..fe8b3c5 100644 --- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java +++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationContent.java @@ -35,6 +35,7 @@ import kotlin.coroutines.Continuation; * Refactoring this class may require a migration strategy for the data stored in SharedPreferences. */ public class NotificationContent implements Parcelable, Serializable, INotificationContent { + private String mChannelId; private String mTitle; private String mText; private String mSubtitle; @@ -65,6 +66,11 @@ public class NotificationContent implements Parcelable, Serializable, INotificat } }; + @Nullable + public String getChannelId() { + return mChannelId; + } + @Nullable public String getTitle() { return mTitle; @@ -158,6 +164,7 @@ public class NotificationContent implements Parcelable, Serializable, INotificat } protected NotificationContent(Parcel in) { + mChannelId = in.readString(); mTitle = in.readString(); mText = in.readString(); mSubtitle = in.readString(); @@ -183,6 +190,7 @@ public class NotificationContent implements Parcelable, Serializable, INotificat @Override public void writeToParcel(Parcel dest, int flags) { + dest.writeString(mChannelId); dest.writeString(mTitle); dest.writeString(mText); dest.writeString(mSubtitle); @@ -203,6 +211,7 @@ public class NotificationContent implements Parcelable, Serializable, INotificat private static final long serialVersionUID = 397666843266836802L; private void writeObject(java.io.ObjectOutputStream out) throws IOException { + out.writeObject(mChannelId); out.writeObject(mTitle); out.writeObject(mText); out.writeObject(mSubtitle); @@ -285,6 +294,11 @@ public class NotificationContent implements Parcelable, Serializable, INotificat useDefaultVibrationPattern(); } + public Builder setChannelId(String channelId) { + content.mChannelId = channelId; + return this; + } + public Builder setTitle(String title) { content.mTitle = title; return this; diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationData.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationData.kt index 39b5aad..e50797d 100644 --- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationData.kt +++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/NotificationData.kt @@ -11,6 +11,9 @@ import org.json.JSONObject * */ @JvmInline value class NotificationData(private val data: Map) { + val channelId: String? + get() = data["channelId"] + val title: String? get() = data["title"] diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/RemoteNotificationContent.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/RemoteNotificationContent.kt index d2cc6cf..6a48ff2 100644 --- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/RemoteNotificationContent.kt +++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/model/RemoteNotificationContent.kt @@ -31,6 +31,8 @@ class RemoteNotificationContent(private val remoteMessage: RemoteMessage) : INot return remoteMessage.notification?.imageUrl != null } + override val channelId = remoteMessage.notification?.channelId ?: notificationData.channelId + override val title = remoteMessage.notification?.title ?: notificationData.title override val text = remoteMessage.notification?.body ?: notificationData.message diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.kt index 8ca6ec5..57c3599 100644 --- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.kt +++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/notifications/presentation/builders/ExpoNotificationBuilder.kt @@ -101,6 +101,9 @@ open class ExpoNotificationBuilder( builder.setOngoing(content.isSticky) // see "Notification anatomy" https://developer.android.com/develop/ui/views/notifications#Templates + content.channelId?.let { + builder.setChannelId(it) + } builder.setContentTitle(content.title) builder.setContentText(content.text) builder.setSubText(content.subText) diff --git a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt index 9f22441..5f92f80 100644 --- a/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt +++ b/node_modules/expo-notifications/android/src/main/java/expo/modules/notifications/service/delegates/FirebaseMessagingDelegate.kt @@ -2,6 +2,9 @@ package expo.modules.notifications.service.delegates import android.content.Context import com.google.firebase.messaging.RemoteMessage +import expo.modules.backgroundnotificationhandler.BackgroundNotificationHandler +import expo.modules.backgroundnotificationhandler.BackgroundNotificationHandlerInterface +import expo.modules.backgroundnotificationhandler.ExpoBackgroundNotificationHandlerModule import expo.modules.interfaces.taskManager.TaskServiceProviderHelper import expo.modules.notifications.notifications.RemoteMessageSerializer import expo.modules.notifications.notifications.background.BackgroundRemoteNotificationTaskConsumer @@ -17,7 +20,8 @@ import expo.modules.notifications.tokens.interfaces.FirebaseTokenListener import java.lang.ref.WeakReference import java.util.* -open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate { +open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseMessagingDelegate, + BackgroundNotificationHandlerInterface { companion object { // Unfortunately we cannot save state between instances of a service other way // than by static properties. Fortunately, using weak references we can @@ -94,8 +98,17 @@ open class FirebaseMessagingDelegate(protected val context: Context) : FirebaseM DebugLogging.logRemoteMessage("FirebaseMessagingDelegate.onMessageReceived: message", remoteMessage) val notification = createNotification(remoteMessage) DebugLogging.logNotification("FirebaseMessagingDelegate.onMessageReceived: notification", notification) - NotificationsService.receive(context, notification) - runTaskManagerTasks(remoteMessage) + + if (!ExpoBackgroundNotificationHandlerModule.isForegrounded) { + BackgroundNotificationHandler(context, this).handleMessage(remoteMessage) + } else { + showMessage(remoteMessage) + runTaskManagerTasks(remoteMessage) + } + } + + override fun showMessage(remoteMessage: RemoteMessage) { + NotificationsService.receive(context, createNotification(remoteMessage)) } private fun runTaskManagerTasks(remoteMessage: RemoteMessage) {