diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index 073b87acc..114645885 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -41,6 +41,17 @@ const State = { HIDING: 3 }; +// These reasons are useful when we destroy the notifications received through +// the notification daemon. We use EXPIRED for transient notifications that the +// user did not interact with, DISMISSED for all other notifications that were +// destroyed as a result of a user action, and SOURCE_CLOSED for the notifications +// that were requested to be destroyed by the associated source. +const NotificationDestroyedReason = { + EXPIRED: 1, + DISMISSED: 2, + SOURCE_CLOSED 3 +}; + // Message tray has its custom Urgency enumeration. LOW, NORMAL and CRITICAL // urgency values map to the corresponding values for the notifications received // through the notification daemon. HIGH urgency value is used for chats received @@ -755,8 +766,10 @@ Notification.prototype = { } }, - destroy: function() { - this.emit('destroy'); + destroy: function(reason) { + if (!reason) + reason = NotificationDestroyedReason.DISMISSED; + this.emit('destroy', reason); } }; Signals.addSignalMethods(Notification.prototype); @@ -1596,7 +1609,7 @@ MessageTray.prototype = { let notification = this._notification; this._notification = null; if (notification.isTransient) - notification.destroy(); + notification.destroy(NotificationDestroyedReason.EXPIRED); }, _expandNotification: function(autoExpanding) { @@ -1746,7 +1759,7 @@ MessageTray.prototype = { let summaryNotification = this._summaryNotification; this._summaryNotification = null; if (summaryNotification.isTransient && !this._reNotifyWithSummaryNotificationAfterHide) - summaryNotification.destroy(); + summaryNotification.destroy(NotificationDestroyedReason.EXPIRED); if (this._reNotifyWithSummaryNotificationAfterHide) { this._onNotify(summaryNotification.source, summaryNotification); this._reNotifyWithSummaryNotificationAfterHide = false; diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js index 63062794e..4984d4886 100644 --- a/js/ui/notificationDaemon.js +++ b/js/ui/notificationDaemon.js @@ -322,13 +322,22 @@ NotificationDaemon.prototype = { { icon: iconActor, bannerMarkup: true }); ndata.notification = notification; - notification.connect('clicked', Lang.bind(this, - function(n) { - this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED); - })); notification.connect('destroy', Lang.bind(this, - function(n) { + function(n, reason) { delete this._notifications[id]; + let notificationClosedReason; + switch (reason) { + case MessageTray.NotificationDestroyedReason.EXPIRED: + notificationClosedReason = NotificationClosedReason.EXPIRED; + break; + case MessageTray.NotificationDestroyedReason.DISMISSED: + notificationClosedReason = NotificationClosedReason.DISMISSED; + break; + case MessageTray.NotificationDestroyedReason.SOURCE_CLOSED: + notificationClosedReason = NotificationClosedReason.APP_CLOSED; + break; + } + this._emitNotificationClosed(id, notificationClosedReason); })); notification.connect('action-invoked', Lang.bind(this, function(n, actionId) { @@ -369,10 +378,9 @@ NotificationDaemon.prototype = { let ndata = this._notifications[id]; if (ndata) { if (ndata.notification) - ndata.notification.destroy(); + ndata.notification.destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED); delete this._notifications[id]; } - this._emitNotificationClosed(id, NotificationClosedReason.APP_CLOSED); }, GetCapabilities: function() {