From 8dfe2dc96af4b68adc92243f3fb3927c36334435 Mon Sep 17 00:00:00 2001 From: Erwan Leboucher Date: Sat, 19 Sep 2026 19:19:42 +0200 Subject: [PATCH] feat(android): add a foss flavour without Firebase --- android/build.gradle.kts | 14 ++++- .../java/app/tauri/notification/FcmBridge.kt | 15 +++++ android/src/gms/AndroidManifest.xml | 12 ++++ .../java/app/tauri/notification/FcmBridge.kt | 40 ++++++++++++ .../TauriFirebaseMessagingService.kt | 0 android/src/main/AndroidManifest.xml | 9 --- .../java/app/tauri/notification/FcmResult.kt | 19 ++++++ .../tauri/notification/NotificationPlugin.kt | 61 +++++++------------ 8 files changed, 120 insertions(+), 50 deletions(-) create mode 100644 android/src/foss/java/app/tauri/notification/FcmBridge.kt create mode 100644 android/src/gms/AndroidManifest.xml create mode 100644 android/src/gms/java/app/tauri/notification/FcmBridge.kt rename android/src/{main => gms}/java/app/tauri/notification/TauriFirebaseMessagingService.kt (100%) create mode 100644 android/src/main/java/app/tauri/notification/FcmResult.kt 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 @@ - - - - - - -