Podcast/js/alarmManagers.js

107 lines
3.5 KiB
JavaScript

'use strict';
angular.module('podcasts.alarmManager', ['podcasts.settings', 'podcasts.downloader'])
.run(['alarmManager', 'updateFeedsAlarmManager', function(alarmManager, updateFeedsAlarmManager) {
updateFeedsAlarmManager.setAlarmListener();
alarmManager.setAlarmListener();
}])
.service('alarmManager', function() {
var alarmManager = navigator.mozAlarms,
alarmHandlers = [];
if (!alarmManager) {
console.log('navigator.mozAlarms is not available');
return {
setAlarmIn: angular.noop,
removeExistingAlarms: angular.noop,
setAlarmListener: angular.noop,
addAlarmListener: angular.noop
};
}
function setAlarmIn(milliSeconds, data) {
var now = new Date(),
alarmDate = new Date(+now + +milliSeconds);
//TODO: check how to set timezone-specific alarms
var setAlarmRequest = alarmManager.add(alarmDate, "ignoreTimezone", data);
setAlarmRequest.onsuccess = function () {
console.log("Alarm scheduled for " + alarmDate);
};
setAlarmRequest.onerror = function () {
console.log("An error occurred when scheduling the alarm: " + e.target.error.name);
};
}
function removeExistingAlarms(type)
{
var allAlarms = alarmManager.getAll();
allAlarms.onsuccess = function (e) {
this.result.forEach(function (alarm) {
if (type === alarm.data.type) {
alarmManager.remove(alarm.id);
}
});
};
}
function addAlarmListener(type, alarmFunction)
{
alarmHandlers.push({type: type, handle: alarmFunction});
}
function handleAlarm(alarm)
{
alarmHandlers.forEach(function (alarmHandler) {
if (alarm.data.type == alarmHandler.type) {
alarmHandler.handle(alarm);
}
});
}
function setAlarmListener()
{
navigator.mozSetMessageHandler("alarm", handleAlarm);
}
return {
setAlarmIn: setAlarmIn,
removeExistingAlarms: removeExistingAlarms,
addAlarmListener: addAlarmListener,
setAlarmListener: setAlarmListener
};
})
.service('updateFeedsAlarmManager', ['settings', 'alarmManager', 'downloader', function(settings, alarmManager, downloader) {
var alarmType = "updateFeeds";
function setAlarm()
{
settings.get('refreshInterval', function(value) {
if (value.value > 0) {
var refreshInterval = value.value;
alarmManager.setAlarmIn(refreshInterval, {type: alarmType});
}
});
}
function changeAlarmInterval(newInterval)
{
alarmManager.removeExistingAlarms(alarmType);
this.setAlarm();
}
function setAlarmListener()
{
alarmManager.addAlarmListener(alarmType, function(alarm) {
downloader.downloadAll(true);
setAlarm();
});
}
return {
setAlarm: setAlarm,
changeAlarmInterval: changeAlarmInterval,
setAlarmListener: setAlarmListener
};
}]);