Nucleus
OS integration

Notifications cross-plateforme

Envoie une notification sur macOS, Windows et Linux depuis un seul DSL Kotlin — titre, message, image, boutons d'action, callbacks de cycle de vie.

Chaque OS desktop expose sa propre pile de notifications — UserNotifications sur macOS, toasts WinRT sur Windows, FreeDesktop D-Bus sous Linux. notification-common rassemble l'intersection dans un seul DSL Kotlin : le cas 80 % tient en une dépendance.

En bref

  • Un DSL : notification { … }.send().
  • Titre, corps, grande image, petite icône, jusqu'à cinq boutons d'action, callbacks de cycle de vie.
  • Route vers notification-macos, notification-windows ou notification-linux à l'exécution.
  • Descends au module par OS pour les barres de progression, la planification, les catégories.

Installation

dependencies {
    implementation("dev.nucleusframework:nucleus.notification-common:<version>")
}

Cette unique dépendance tire les trois modules par plateforme ; seul celui qui correspond est chargé à l'exécution.

Démarrage rapide

import dev.nucleusframework.notification.common.*

NotificationManager.initialize()

val n = notification {
    title = "Téléchargement terminé"
    message = "report.pdf a été enregistré"
    button("Ouvrir") { openFile() }
    button("Afficher dans le dossier") { showInFolder() }
}

n.send()

Fonctionnement

NotificationManager détecte la plateforme active au démarrage et délègue au pont natif adéquat. Le DSL ne capture que le plus petit dénominateur commun : texte, image, jusqu'à cinq boutons et événements de cycle de vie (onShown, onDismissed, onAction). Tout ce qui dépasse — planifications, catégories, images héros, barres de progression — reste dans le module par OS.

Il est possible de mixer : passer par l'API commune pour la plupart des notifications, puis basculer sur WindowsNotificationCenter ou NotificationCenter (macOS) quand une notification précise a besoin du reste.

Route vers notification-macos. Requiert l'autorisation utilisateur et une app signée bundlée (./gradlew runDistributable).

Route vers notification-windows. L'AUMID est dérivé de NucleusApp.appId pour les apps non packagées ; les apps MSIX utilisent leur identité de package.

Route vers notification-linux via org.freedesktop.Notifications sur D-Bus. Fonctionne sous GNOME, KDE, Cinnamon, tout ce qui expose un daemon de notifications.

Référence

Construire une notification

val n = notification {
    title = "Nouveau message d'Alice"
    message = "Tu as vu le dernier build ?"
    button("Répondre") { /* … */ }
    button("Muet") { /* … */ }
    onShown { id -> log.info("affichée: $id") }
    onDismissed { reason -> log.info("rejetée: $reason") }
}

Envoyer

when (val result = n.send()) {
    is NotificationResult.Shown -> /* livrée */
    is NotificationResult.Failed -> log.warn(result.toString())
}

Disponibilité

if (!NotificationManager.isAvailable()) {
    // L'OS courant ou la sandbox interdit les notifications.
}

Notes

  • Pour les APIs plus riches : macOS, Windows, Linux.
  • macOS ignore silencieusement les notifications des apps non bundlées — teste toujours sur le binaire packagé.