Server (gateway-plugin): - push.py: FCM (HTTP v1 service-account / legacy key) + ntfy backends; NtfyBackend.server_url for app discovery - adapter.py: push on offline broadcast + high-priority push when live; fcm.register; server_caps.push_ntfy_server; outbox now ALWAYS appends so a reconnecting app catches up on live-delivered frames (fixes empty chat after notification tap / activity recreation) - protocol.py / ws_server.py / outbox.py / plugin.yaml: M5 frames + env vars App (Kotlin CMP): - Protocol.kt: notification / fcm.register / sync frames + push caps - GatewayClient.kt: hello carries push creds; auto-sync on reconnect - IrisController.kt: banners, deep-link, notifyMessageIfBackgrounded (system notification on a regular reply when backgrounded) - Android: PlatformPush, AppBridge, IrisNotifications, NtfyListenerService, IrisFirebaseMessagingService, AndroidPush, AndroidSecureStore - Desktop: DesktopPush, DesktopSecureStore - build files + manifest (permissions, services, deep-links) Tests: 35-test tests/gateway/test_android.py suite passes (incl. new regression test_live_delivered_frame_still_parked_for_sync). E2E verified on device: push fire, reconnect sync, background notification, and message replay after ChatStore reset.
27 lines
938 B
Kotlin
27 lines
938 B
Kotlin
// M5: google-services plugin classpath (applied conditionally in :androidApp
|
|
// only when a google-services.json is present; the FCM path is inert without
|
|
// a Firebase project and the ntfy listener is the fallback).
|
|
buildscript {
|
|
repositories {
|
|
google()
|
|
mavenCentral()
|
|
}
|
|
dependencies {
|
|
classpath("com.google.gms:google-services:4.4.2")
|
|
}
|
|
}
|
|
|
|
plugins {
|
|
kotlin("multiplatform") version "2.1.0" apply false
|
|
kotlin("android") version "2.1.0" apply false
|
|
kotlin("jvm") version "2.1.0" apply false
|
|
kotlin("plugin.serialization") version "2.1.0" apply false
|
|
id("com.android.application") version "8.7.3" apply false
|
|
id("com.android.library") version "8.7.3" apply false
|
|
id("org.jetbrains.compose") version "1.7.3" apply false
|
|
id("org.jetbrains.kotlin.plugin.compose") version "2.1.0" apply false
|
|
}
|
|
|
|
tasks.register("clean") {
|
|
delete(rootProject.layout.buildDirectory)
|
|
} |