# HG changeset patch # User Emmanuel Gil Peyrot # Date 1361633252 -3600 # Node ID 835a8ae799e7c7944701b7a94e882bb76b77f3ec # Parent 6126bd24e7dd2fda6b0a9798f465426c0283717b Add notifications support, fixes bug 7. diff -r 6126bd24e7dd -r 835a8ae799e7 browser_side/notification.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser_side/notification.py Sat Feb 23 16:27:32 2013 +0100 @@ -0,0 +1,45 @@ +from __pyjamas__ import JS + + +class Notification(object): + """ + If the browser supports it, the user allowed it to and the tab is in the + background, send desktop notifications on messages. + + Requires both Web Notifications and Page Visibility API. + """ + + def __init__(self): + JS(""" + this.enabled = false; + + if (!('hidden' in document)) + document.hidden = false; + + if (!('Notification' in window)) + return; + + if (Notification.permission === 'granted') + this.enabled = true; + + else if (Notification.permission === 'default') { + Notification.requestPermission(function(permission){ + if (permission !== 'granted') + return; + + this.enabled = true; + }); + } + """) + + def notify(self, title, body, icon='/media/icons/apps/48/sat.png'): + JS(""" + if (this.enabled && document.hidden) { + notification = Notification(title, {body: body, icon: icon}); + + // Probably won’t work, but it doesn’t hurt to try. + notification.addEventListener('click', function() { + window.focus(); + }); + } + """) diff -r 6126bd24e7dd -r 835a8ae799e7 libervia.py --- a/libervia.py Tue Jan 07 23:49:39 2014 +0100 +++ b/libervia.py Sat Feb 23 16:27:32 2013 +0100 @@ -35,6 +35,7 @@ from browser_side.jid import JID from browser_side.xmlui import XMLUI from browser_side.tools import html_sanitize +from browser_side.notification import Notification from sat_frontends.tools.misc import InputHistory from sat_frontends.tools.strings import getURLParams @@ -180,6 +181,7 @@ self.avatars_cache = {} # keep track of jid's avatar hash (key=jid, value=file) self._register_box = None RootPanel().add(self.panel) + self.notification = Notification() DOM.addEventPreview(self) self._register = RegisterCall() self._register.call('registerParams', None) @@ -305,6 +307,9 @@ panel = self.tab_panel.tabBar.getTabWidget(tab_index) panel.addWidget(wid) + def displayNotification(self, title, body): + self.notification.notify(title, body) + def _isRegisteredCB(self, registered): if not registered: self._register_box = RegisterBox(self.logged) @@ -648,10 +653,11 @@ _to = JID(to_jid) other = _to if _from.bare == self.whoami.bare else _from lib_wid = self.getLiberviaWidget(panels.ChatPanel, other, ignoreOtherTabs=False) + self.displayNotification(_from, msg) if lib_wid is not None: lib_wid.printMessage(_from, msg, extra) else: - # The message has not been showed, we must indicate it + # The message has not been shown, we must indicate it self.contact_panel.setContactMessageWaiting(other.bare, True) def _presenceUpdateCb(self, entity, show, priority, statuses):