Notifications sur Windows
Toast Notifications WinRT en Kotlin — layouts adaptatifs, images héros, boutons, saisie texte, barres de progression, en-têtes, snooze / dismiss.
Les toasts Windows 10/11 portent images, barres de progression, sélecteurs, champs de saisie, en-têtes — bien au-delà du DSL cross-plateforme. notification-windows enveloppe toute l'API ToastNotificationManager dans un DSL Kotlin.
En bref
ToastNotificationManagerWinRT via un pont JNI C++/WRL — pas de JNA, pas de réflexion.- Apps MSIX packagées et non packagées (EXE/MSI) prises en charge.
- DSL adaptatif : image héros, app logo, attribution, groupes / sous-groupes, barres de progression, sélecteurs.
- Listener pour activation, rejet, échec.
Installation
dependencies {
implementation("dev.nucleusframework:nucleus.notification-windows:<version>")
}Démarrage rapide
import dev.nucleusframework.notification.windows.*
WindowsNotificationCenter.initialize()
WindowsNotificationCenter.send(toast {
visual {
text("Build terminé")
text("artifact-2.0.0.zip uploadé")
heroImage("https://example.com/hero.png")
}
actions {
button("Ouvrir", arguments = "open")
button("Afficher dans le dossier", arguments = "folder")
}
})Fonctionnement
Sous Windows, un toast est un payload XML dispatché par ToastNotificationManager et identifié par un AUMID (Application User Model ID). Le module gère les deux cas, packagé et non packagé :
Gestion de l'AUMID
- MSIX / APPX : l'AUMID est récupéré depuis l'identité du package.
- Non packagé (EXE/MSI/dev) : Nucleus dérive l'AUMID depuis
NucleusApp.appIdet l'enregistre sur le process viaSetCurrentProcessExplicitAppUserModelID. - Passe un AUMID explicite avec
WindowsNotificationCenter.initialize(aumid = "Vendor.App")si l'on veut forcer une valeur.
Raccourci Menu Démarrer requis (non packagé)
Les apps non packagées ont besoin d'un raccourci .lnk dans le menu Démarrer dont la propriété AUMID correspond à celle utilisée à l'exécution. Sans ça, les toasts peuvent ne pas s'afficher ou disparaître de l'Action Center. Le plugin Gradle Nucleus le configure pour soi quand on produit un installeur Windows.
Référence
Contenu adaptatif
toast {
visual {
text("Synchronisation en cours")
appLogo("logo.png", crop = AdaptiveImageCrop.Circle)
progressBar(
title = "report.pdf",
valueStringOverride = "3 sur 5 fichiers",
value = 0.6,
status = "Upload",
)
}
actions {
button("Pause", arguments = "pause")
snoozeButton()
dismissButton()
}
scenario = ToastScenario.Reminder
}Listener
WindowsNotificationCenter.setListener(object : ToastNotificationListener {
override fun onActivated(args: ToastActivatedEventArgs) { /* … */ }
override fun onDismissed(args: ToastDismissedEventArgs) { /* … */ }
override fun onFailed(args: ToastFailedEventArgs) { /* … */ }
})Mettre à jour un toast existant
WindowsNotificationCenter.update(
tag = "upload",
group = "transfers",
data = ToastNotificationData(mapOf("progressValue" to "0.8")),
)Historique
WindowsNotificationCenter.history().forEach { entry ->
println("${entry.tag}: ${entry.dateTime}")
}Notes
- Garde l'AUMID cohérent entre le raccourci Menu Démarrer, la config Gradle
nucleus { }(packageName) et l'exécution — un décalage cause des toasts qui apparaissent une fois puis plus jamais. - Les images héros et logos acceptent des URL
http(s)://distantes pour les apps non packagées tant qu'elles répondent vite ; pour un comportement offline-safe, embarque un fichier local viams-appx:///(MSIX) oufile:///(non packagé).
Notifications sur macOS
Mapping complet en Kotlin du framework UserNotifications d'Apple — catégories, pièces jointes, saisie texte, planifications, niveaux d'interruption.
Notifications sous Linux
Notifications FreeDesktop sur D-Bus — urgence, hints, sons, callbacks d'action, avec les particularités documentées par serveur.