diff --git a/android/build.gradle.kts b/android/build.gradle.kts
index 4588ce4b..83bef07b 100644
--- a/android/build.gradle.kts
+++ b/android/build.gradle.kts
@@ -31,6 +31,14 @@ android {
buildConfigField("boolean", "ENABLE_PUSH_NOTIFICATIONS", "$enablePush")
}
+ // FCM pulls proprietary Google libraries that FOSS repos reject. The foss
+ // flavour drops them, leaving UnifiedPush as the only transport.
+ flavorDimensions += "push"
+ productFlavors {
+ create("gms")
+ create("foss")
+ }
+
buildTypes {
debug {
enableUnitTestCoverage = true
@@ -78,8 +86,8 @@ dependencies {
implementation("com.google.android.material:material:1.14.0")
implementation("com.fasterxml.jackson.core:jackson-databind:2.22.1")
- implementation(platform("com.google.firebase:firebase-bom:34.16.0"))
- implementation("com.google.firebase:firebase-messaging-ktx:24.1.2")
+ "gmsImplementation"(platform("com.google.firebase:firebase-bom:34.16.0"))
+ "gmsImplementation"("com.google.firebase:firebase-messaging-ktx:24.1.2")
implementation("com.squareup.okhttp3:okhttp:5.3.2")
implementation("org.unifiedpush.android:connector:3.3.3")
// The connector declares Tink as a runtime-only dependency, so its WebPush
@@ -89,7 +97,7 @@ dependencies {
// classpath — `tink-android` repackages the same classes and trips AGP's
// duplicate-class check.
implementation("com.google.crypto.tink:tink:1.21.0")
- implementation("org.unifiedpush.android:embedded-fcm-distributor:3.0.0")
+ "gmsImplementation"("org.unifiedpush.android:embedded-fcm-distributor:3.0.0")
testImplementation("junit:junit:4.13.2")
testImplementation("io.mockk:mockk-android:1.14.11")
testImplementation("io.mockk:mockk-agent:1.14.11")
diff --git a/android/src/foss/java/app/tauri/notification/FcmBridge.kt b/android/src/foss/java/app/tauri/notification/FcmBridge.kt
new file mode 100644
index 00000000..19ab3b5b
--- /dev/null
+++ b/android/src/foss/java/app/tauri/notification/FcmBridge.kt
@@ -0,0 +1,15 @@
+package app.tauri.notification
+
+import android.content.Context
+
+object FcmBridge {
+ fun isConfigured(context: Context): Boolean = false
+
+ fun fetchToken(onResult: (FcmTokenResult) -> Unit) {
+ onResult(FcmTokenResult.Unavailable("FCM is not available in this build"))
+ }
+
+ fun deleteToken(onResult: (FcmDeleteResult) -> Unit) {
+ onResult(FcmDeleteResult.NotConfigured)
+ }
+}
diff --git a/android/src/gms/AndroidManifest.xml b/android/src/gms/AndroidManifest.xml
new file mode 100644
index 00000000..2f9cca43
--- /dev/null
+++ b/android/src/gms/AndroidManifest.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/android/src/gms/java/app/tauri/notification/FcmBridge.kt b/android/src/gms/java/app/tauri/notification/FcmBridge.kt
new file mode 100644
index 00000000..798b39dc
--- /dev/null
+++ b/android/src/gms/java/app/tauri/notification/FcmBridge.kt
@@ -0,0 +1,40 @@
+package app.tauri.notification
+
+import android.content.Context
+import com.google.firebase.FirebaseApp
+import com.google.firebase.messaging.FirebaseMessaging
+
+object FcmBridge {
+ fun isConfigured(context: Context): Boolean =
+ try {
+ FirebaseApp.getApps(context).isNotEmpty()
+ } catch (_: Exception) {
+ false
+ }
+
+ fun fetchToken(onResult: (FcmTokenResult) -> Unit) {
+ try {
+ FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
+ onResult(
+ if (task.isSuccessful) FcmTokenResult.Success(task.result)
+ else FcmTokenResult.Failed("Failed to get FCM token: ${task.exception?.message}")
+ )
+ }
+ } catch (error: Exception) {
+ onResult(FcmTokenResult.Unavailable(error.message ?: "Failed to get FCM token"))
+ }
+ }
+
+ fun deleteToken(onResult: (FcmDeleteResult) -> Unit) {
+ try {
+ FirebaseMessaging.getInstance().deleteToken().addOnCompleteListener { task ->
+ onResult(
+ if (task.isSuccessful) FcmDeleteResult.Deleted
+ else FcmDeleteResult.Failed("Failed to delete FCM token: ${task.exception?.message}")
+ )
+ }
+ } catch (_: Exception) {
+ onResult(FcmDeleteResult.NotConfigured)
+ }
+ }
+}
diff --git a/android/src/main/java/app/tauri/notification/TauriFirebaseMessagingService.kt b/android/src/gms/java/app/tauri/notification/TauriFirebaseMessagingService.kt
similarity index 100%
rename from android/src/main/java/app/tauri/notification/TauriFirebaseMessagingService.kt
rename to android/src/gms/java/app/tauri/notification/TauriFirebaseMessagingService.kt
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index e49abf16..11d670a8 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -22,15 +22,6 @@
-
-
-
-
-
-
-