diff --git a/webclient/components/matrix/event-handler-service.js b/webclient/components/matrix/event-handler-service.js
index fc5a81617c..8783b9b1e0 100644
--- a/webclient/components/matrix/event-handler-service.js
+++ b/webclient/components/matrix/event-handler-service.js
@@ -27,7 +27,8 @@ Typically, this service will store events or broadcast them to any listeners
if typically all the $on method would do is update its own $scope.
*/
angular.module('eventHandlerService', [])
-.factory('eventHandlerService', ['matrixService', '$rootScope', '$q', function(matrixService, $rootScope, $q) {
+.factory('eventHandlerService', ['matrixService', '$rootScope', '$q', '$timeout', 'mPresence',
+function(matrixService, $rootScope, $q, $timeout, mPresence) {
var ROOM_CREATE_EVENT = "ROOM_CREATE_EVENT";
var MSG_EVENT = "MSG_EVENT";
var MEMBER_EVENT = "MEMBER_EVENT";
@@ -137,6 +138,23 @@ angular.module('eventHandlerService', [])
else {
$rootScope.events.rooms[event.room_id].messages.push(event);
}
+
+ if (window.Notification) {
+ // Show notification when the window is hidden, or the user is idle
+ if (document.hidden || matrixService.presence.unavailable === mPresence.getState()) {
+ console.log("Displaying notification for "+JSON.stringify(event));
+ var notification = new window.Notification(
+ ($rootScope.events.rooms[event.room_id].members[event.user_id].displayname || event.user_id) +
+ " (" + (matrixService.getRoomIdToAliasMapping(event.room_id) || event.room_id) + ")", // FIXME: don't leak room_ids here
+ {
+ "body": event.content.body,
+ "icon": $rootScope.events.rooms[event.room_id].members[event.user_id].avatar_url
+ });
+ $timeout(function() {
+ notification.close();
+ }, 5 * 1000);
+ }
+ }
}
else {
$rootScope.events.rooms[event.room_id].messages.unshift(event);
|