Browse Source

notification: keep track of shown notifications

Currently notifications shown so far are not tracked, thus often it
happens that multiple notifications regarding the same topic appear,
where only one should be shown. The change adds tracking of
notifications being shown within the Notification class.

Notifications cleared by user will be re-shown if device pushes them
again.
bboozzoo/device-cache v0.2
Maciek Borzecki 10 years ago
parent
commit
e4d57eff5c
1 changed files with 50 additions and 6 deletions
  1. +50
    -6
      src/notification.vala

+ 50
- 6
src/notification.vala View File

@ -17,17 +17,20 @@
* AUTHORS
* Maciek Borzecki <maciek.borzecki (at] gmail.com>
*/
using Gee;
class NotificationHandler : Object, PacketHandlerInterface {
private const string NOTIFICATION = "kdeconnect.notification";
private HashMap<string, Notify.Notification> _pending_notifications;
public string get_pkt_type() {
return NOTIFICATION;
}
private NotificationHandler() {
_pending_notifications = new HashMap<string, Notify.Notification>();
}
public static NotificationHandler instance() {
@ -52,15 +55,41 @@ class NotificationHandler : Object, PacketHandlerInterface {
if (id.match_string("com.android.dialer", false) == true)
return;
// other notifications
if (pkt.body.has_member("appName") == false ||
pkt.body.has_member("ticker") == false)
return;
// maybe it's a notification about a notification being
// cancelled
if (pkt.body.has_member("isCancel") == true &&
pkt.body.get_boolean_member("isCancel") == true)
{
debug("message cancels notification %s", id);
if (_pending_notifications.has_key(id) == true)
{
// cancel out pending notifications
Notify.Notification notif = _pending_notifications.@get(id);
if (notif != null)
{
_pending_notifications.unset(id);
try {
notif.close();
} catch (Error e) {
critical("error closing notification: %s", e.message);
}
}
}
return;
}
// check if notification is already known, if so don't show
// anything
if (_pending_notifications.has_key(id) == true)
{
debug("notification %s is known, ignore", id);
return;
}
debug("new notification %s", id);
// other notifications
if (pkt.body.has_member("appName") == false ||
pkt.body.has_member("ticker") == false)
return;
string app = pkt.body.get_string_member("appName");
@ -81,6 +110,8 @@ class NotificationHandler : Object, PacketHandlerInterface {
} else {
time = new DateTime.now_local();
}
// format the body of notification, so that a time information
// is included
if (time != null)
ticker = "%s %s".printf(time.format("%X"),
ticker);
@ -90,9 +121,22 @@ class NotificationHandler : Object, PacketHandlerInterface {
var notif = new Notify.Notification(app, ticker,
"phone");
try {
// react to closed signal
notif.closed.connect((n) => {
this.handle_closed_notification(id);
});
notif.show();
_pending_notifications.@set(id, notif);
} catch (Error e) {
critical("failed to show notification: %s", e.message);
}
}
private void handle_closed_notification(string id) {
debug("notification %s closed by user", id);
if (_pending_notifications.has_key(id) == true)
{
_pending_notifications.unset(id);
}
}
}

Loading…
Cancel
Save