diff --git a/node_modules/expo-notifications/android/.gradle/8.10/checksums/checksums.lock b/node_modules/expo-notifications/android/.gradle/8.10/checksums/checksums.lock new file mode 100644 index 0000000..883ef6a Binary files /dev/null and b/node_modules/expo-notifications/android/.gradle/8.10/checksums/checksums.lock differ diff --git a/node_modules/expo-notifications/android/.gradle/8.10/dependencies-accessors/gc.properties b/node_modules/expo-notifications/android/.gradle/8.10/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/expo-notifications/android/.gradle/8.10/fileChanges/last-build.bin b/node_modules/expo-notifications/android/.gradle/8.10/fileChanges/last-build.bin new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/node_modules/expo-notifications/android/.gradle/8.10/fileChanges/last-build.bin differ diff --git a/node_modules/expo-notifications/android/.gradle/8.10/fileHashes/fileHashes.lock b/node_modules/expo-notifications/android/.gradle/8.10/fileHashes/fileHashes.lock new file mode 100644 index 0000000..774caf7 Binary files /dev/null and b/node_modules/expo-notifications/android/.gradle/8.10/fileHashes/fileHashes.lock differ diff --git a/node_modules/expo-notifications/android/.gradle/8.10/gc.properties b/node_modules/expo-notifications/android/.gradle/8.10/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/expo-notifications/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/node_modules/expo-notifications/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000..a3c1514 Binary files /dev/null and b/node_modules/expo-notifications/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/node_modules/expo-notifications/android/.gradle/buildOutputCleanup/cache.properties b/node_modules/expo-notifications/android/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..0e5b4da --- /dev/null +++ b/node_modules/expo-notifications/android/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Thu Apr 24 20:44:36 PDT 2025 +gradle.version=8.10 diff --git a/node_modules/expo-notifications/android/.gradle/config.properties b/node_modules/expo-notifications/android/.gradle/config.properties new file mode 100644 index 0000000..0bd71c6 --- /dev/null +++ b/node_modules/expo-notifications/android/.gradle/config.properties @@ -0,0 +1,2 @@ +#Thu Apr 24 20:44:32 PDT 2025 +java.home=/Applications/Android Studio.app/Contents/jbr/Contents/Home diff --git a/node_modules/expo-notifications/android/.gradle/vcs-1/gc.properties b/node_modules/expo-notifications/android/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/node_modules/expo-notifications/android/.idea/.gitignore b/node_modules/expo-notifications/android/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/node_modules/expo-notifications/android/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/node_modules/expo-notifications/android/.idea/AndroidProjectSystem.xml b/node_modules/expo-notifications/android/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/node_modules/expo-notifications/android/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/node_modules/expo-notifications/android/.idea/caches/deviceStreaming.xml b/node_modules/expo-notifications/android/.idea/caches/deviceStreaming.xml new file mode 100644 index 0000000..9e9ba09 --- /dev/null +++ b/node_modules/expo-notifications/android/.idea/caches/deviceStreaming.xml @@ -0,0 +1,607 @@ + + + + + + \ No newline at end of file diff --git a/node_modules/expo-notifications/android/.idea/gradle.xml b/node_modules/expo-notifications/android/.idea/gradle.xml new file mode 100644 index 0000000..b838237 --- /dev/null +++ b/node_modules/expo-notifications/android/.idea/gradle.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/node_modules/expo-notifications/android/.idea/migrations.xml b/node_modules/expo-notifications/android/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/node_modules/expo-notifications/android/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/node_modules/expo-notifications/android/.idea/misc.xml b/node_modules/expo-notifications/android/.idea/misc.xml new file mode 100644 index 0000000..3040d03 --- /dev/null +++ b/node_modules/expo-notifications/android/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/node_modules/expo-notifications/android/.idea/runConfigurations.xml b/node_modules/expo-notifications/android/.idea/runConfigurations.xml new file mode 100644 index 0000000..16660f1 --- /dev/null +++ b/node_modules/expo-notifications/android/.idea/runConfigurations.xml @@ -0,0 +1,17 @@ + + + + + + \ No newline at end of file diff --git a/node_modules/expo-notifications/android/.idea/workspace.xml b/node_modules/expo-notifications/android/.idea/workspace.xml new file mode 100644 index 0000000..df26928 --- /dev/null +++ b/node_modules/expo-notifications/android/.idea/workspace.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + 1745552672693 + + + + \ No newline at end of file diff --git a/node_modules/expo-notifications/android/build.gradle b/node_modules/expo-notifications/android/build.gradle index bc479ee..1ebfa00 100644 --- a/node_modules/expo-notifications/android/build.gradle +++ b/node_modules/expo-notifications/android/build.gradle @@ -42,6 +42,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/local.properties b/node_modules/expo-notifications/android/local.properties new file mode 100644 index 0000000..ab4c86d --- /dev/null +++ b/node_modules/expo-notifications/android/local.properties @@ -0,0 +1,8 @@ +## This file must *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +#Thu Apr 24 20:44:32 PDT 2025 +sdk.dir=/Users/hailey/Library/Android/sdk 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 3af254c..3c77e9d 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 98f003f..2f745e8 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 90ca4ff..9d4cb09 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 @@ -3,6 +3,9 @@ package expo.modules.notifications.service.delegates import android.content.Context import android.os.Bundle 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 @@ -18,7 +21,7 @@ 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 @@ -105,8 +108,19 @@ 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(context.applicationContext, RemoteMessageSerializer.toBundle(remoteMessage)) + if (!ExpoBackgroundNotificationHandlerModule.isForegrounded) { + BackgroundNotificationHandler(context, this).handleMessage(remoteMessage) + } else { + NotificationsService.receive(context, notification) + runTaskManagerTasks( + context.applicationContext, + RemoteMessageSerializer.toBundle(remoteMessage) + ) + } + } + + override fun showMessage(remoteMessage: RemoteMessage) { + NotificationsService.receive(context, createNotification(remoteMessage)) } protected fun createNotification(remoteMessage: RemoteMessage): Notification {