From 3c2b069c2031b8f72142fcb69829b1d5aa81ee6d Mon Sep 17 00:00:00 2001 From: Den <2119348+dzianisv@users.noreply.github.com> Date: Wed, 3 Jun 2026 03:06:34 -0700 Subject: [PATCH] fix(fdroid): Firebase-free stubs for expo-notifications --- .../delegates/FirebaseMessagingDelegate.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 fdroid/expo-notifications-patches/service/delegates/FirebaseMessagingDelegate.kt diff --git a/fdroid/expo-notifications-patches/service/delegates/FirebaseMessagingDelegate.kt b/fdroid/expo-notifications-patches/service/delegates/FirebaseMessagingDelegate.kt new file mode 100644 index 0000000..2ed2faa --- /dev/null +++ b/fdroid/expo-notifications-patches/service/delegates/FirebaseMessagingDelegate.kt @@ -0,0 +1,54 @@ +package expo.modules.notifications.service.delegates + +import android.content.Context +import android.os.Bundle +import expo.modules.notifications.notifications.background.BackgroundRemoteNotificationTaskConsumer +import expo.modules.notifications.tokens.interfaces.FirebaseTokenListener +import java.lang.ref.WeakReference +import java.util.* + +/** + * Stub implementation (Firebase-free) for F-Droid builds. + * This app only uses local notifications - no FCM push tokens or remote messages. + */ +open class FirebaseMessagingDelegate(protected val context: Context) : + expo.modules.notifications.service.interfaces.FirebaseMessagingDelegate { + + companion object { + protected var sLastToken: String? = null + protected val sTokenListenersReferences = WeakHashMap?>() + protected var sBackgroundTaskConsumerReferences = WeakHashMap>() + + @JvmStatic + fun addTokenListener(listener: FirebaseTokenListener) { + if (!sTokenListenersReferences.containsKey(listener)) { + sTokenListenersReferences[listener] = WeakReference(listener) + sLastToken?.let { listener.onNewToken(it) } + } + } + + fun addBackgroundTaskConsumer(taskConsumer: BackgroundRemoteNotificationTaskConsumer) { + if (!sBackgroundTaskConsumerReferences.containsKey(taskConsumer)) { + sBackgroundTaskConsumerReferences[taskConsumer] = WeakReference(taskConsumer) + } + } + + fun getBackgroundTasks() = sBackgroundTaskConsumerReferences.values.mapNotNull { it.get() } + + /** No-op for F-Droid builds (no FCM, local notifications only). */ + fun runTaskManagerTasks(applicationContext: Context, bundle: Bundle) { + // no-op: no FCM in this build + } + } + + override fun onNewToken(token: String) { + for (listenerReference in sTokenListenersReferences.values) { + listenerReference?.get()?.onNewToken(token) + } + sLastToken = token + } + + override fun onDeletedMessages() { + // no-op + } +}