Newer
Older
Matthew Hodgson
committed
Copyright 2014 OpenMarket Ltd
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
'use strict';
/*
* This service tracks user activity on the page to determine his presence state.
* Any state change will be sent to the Home Server.
*/
angular.module('mPresence', [])
.service('mPresence', ['$timeout', 'matrixService', function ($timeout, matrixService) {
// Time in ms after that a user is considered as unavailable/away
var UNAVAILABLE_TIME = 3 * 60000; // 3 mins
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// The current presence state
var state = undefined;
var self =this;
var timer;
/**
* Start listening the user activity to evaluate his presence state.
* Any state change will be sent to the Home Server.
*/
this.start = function() {
if (undefined === state) {
// The user is online if he moves the mouser or press a key
document.onmousemove = resetTimer;
document.onkeypress = resetTimer;
resetTimer();
}
};
/**
* Stop tracking user activity
*/
this.stop = function() {
if (timer) {
$timeout.cancel(timer);
timer = undefined;
}
state = undefined;
};
/**
* Get the current presence state.
* @returns {matrixService.presence} the presence state
*/
this.getState = function() {
return state;
};
/**
* Set the presence state.
* If the state has changed, the Home Server will be notified.
* @param {matrixService.presence} newState the new presence state
*/
this.setState = function(newState) {
if (newState !== state) {
console.log("mPresence - New state: " + newState);
state = newState;
// Inform the HS on the new user state
matrixService.setUserPresence(state).then(
function() {
},
function(error) {
console.log("mPresence - Failed to send new presence state: " + JSON.stringify(error));
});
}
};
/**
* Callback called when the user made no action on the page for UNAVAILABLE_TIME ms.
function onUnvailableTimerFire() {
self.setState(matrixService.presence.unavailable);
}
/**
* Callback called when the user made an action on the page
* @private
*/
function resetTimer() {
// User is still here
self.setState(matrixService.presence.online);
// Re-arm the timer
$timeout.cancel(timer);
timer = $timeout(onUnvailableTimerFire, UNAVAILABLE_TIME);