Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
165 lines
5.2 KiB
JavaScript
Executable file
165 lines
5.2 KiB
JavaScript
Executable file
/* global asyncStorage, Promise, TaskRunner */
|
|
/* exported SilentSms */
|
|
'use strict';
|
|
|
|
var SilentSms = (function () {
|
|
var NO_ALARM_ID = -1;
|
|
// The maximum amount of time that the SmsManager waits for a message before
|
|
// disabling automatically the silent mode is five minutes.
|
|
var SERVICE_TIMEOUT = 5 * 60 * 1000;
|
|
var taskQueue;
|
|
|
|
function init() {
|
|
taskQueue = new TaskRunner();
|
|
if (!window.navigator.mozSetMessageHandler) {
|
|
// bailout if we're in Firefox
|
|
return;
|
|
}
|
|
|
|
// Msg from Usage (activation / deactivation)
|
|
window.navigator.mozSetMessageHandler('connection',
|
|
function onConnected(request) {
|
|
if (request.keyword !== 'costcontrolSmsQuery') {
|
|
return;
|
|
}
|
|
var port = request.port;
|
|
port.onmessage = function onReceivedMessage(evt) {
|
|
var data = evt.data;
|
|
switch (data.action) {
|
|
case 'enable':
|
|
taskQueue.push(function() {
|
|
return SilentSms.enableSilentModeFor(data.smsNumbers, data.type)
|
|
.then(updateUsageSilentSms)
|
|
.then(port.postMessage.bind(port, 'silentSMSEnabled'));
|
|
});
|
|
break;
|
|
case 'disable':
|
|
taskQueue.push(function() {
|
|
return SilentSms.disableSilentModeFor(data.type)
|
|
.then(updateUsageSilentSms)
|
|
.then(port.postMessage.bind(port, 'silentSMSDisabled'));
|
|
});
|
|
break;
|
|
}
|
|
};
|
|
}
|
|
);
|
|
|
|
// Deactivated silentSms mode by alarm
|
|
window.navigator.mozSetMessageHandler('alarm', function _onAlarm(alarm) {
|
|
if (alarm.data.alarmType === 'silentSmsTimeout') {
|
|
SilentSms.disableSilentModeFor(alarm.data.type)
|
|
.then(updateUsageSilentSms);
|
|
}
|
|
});
|
|
}
|
|
|
|
function getUsageSilentSms() {
|
|
return new Promise(function(resolve, reject) {
|
|
asyncStorage.getItem('usageSilentSms', function(usageSilentSms) {
|
|
resolve(usageSilentSms || {});
|
|
});
|
|
});
|
|
}
|
|
|
|
function removeAlarmTimeout(alarmId) {
|
|
// There is already an alarm, remove it
|
|
if (alarmId && alarmId !== NO_ALARM_ID) {
|
|
navigator.mozAlarms.remove(alarmId);
|
|
}
|
|
}
|
|
|
|
function addAlarmTimeout(type, delay) {
|
|
return new Promise(function doEnablingSilentMode(resolve, reject) {
|
|
var date = new Date();
|
|
date.setTime(date.getTime() + delay);
|
|
var request = navigator.mozAlarms.add(date, 'ignoreTimezone',
|
|
{alarmType: 'silentSmsTimeout',
|
|
type: type });
|
|
request.onsuccess = function _alarmSet(evt) {
|
|
var alarmId = evt.target.result;
|
|
resolve(alarmId);
|
|
};
|
|
request.onerror = function _onError() {
|
|
var errorMsg = 'Failed to set timeout for ' + type + 'request';
|
|
reject(new Error(errorMsg));
|
|
};
|
|
});
|
|
}
|
|
|
|
// The enabling silentMode process consist on two steps:
|
|
// 1. Enabling silentMode for the provided number
|
|
// 2. Activating alarm for TimeOut
|
|
function enableSilentModeFor(smsNumbers, type) {
|
|
function _removeAlarmTimeout(usageSilentSms) {
|
|
if (usageSilentSms && usageSilentSms[type] &&
|
|
usageSilentSms[type].alarmId !== NO_ALARM_ID) {
|
|
removeAlarmTimeout(usageSilentSms[type].alarmId);
|
|
}
|
|
}
|
|
|
|
function handleErrorAddingAlarm(error) {
|
|
console.error(error.toString());
|
|
return NO_ALARM_ID;
|
|
}
|
|
|
|
return getUsageSilentSms().then(function(usageSilentSms) {
|
|
function refreshUsageSilentSms(alarmId) {
|
|
usageSilentSms[type] = {
|
|
smsNumbers: smsNumbers,
|
|
alarmId: alarmId
|
|
};
|
|
return usageSilentSms;
|
|
}
|
|
_removeAlarmTimeout(usageSilentSms);
|
|
return addAlarmTimeout(type, SERVICE_TIMEOUT)
|
|
.catch(handleErrorAddingAlarm)
|
|
.then(refreshUsageSilentSms);
|
|
});
|
|
|
|
}
|
|
|
|
function disableSilentModeFor(type) {
|
|
return getUsageSilentSms().then(function(usageSilentSms) {
|
|
if (usageSilentSms && usageSilentSms[type] &&
|
|
usageSilentSms[type].alarmId !== NO_ALARM_ID) {
|
|
removeAlarmTimeout(usageSilentSms[type].alarmId);
|
|
}
|
|
usageSilentSms[type] = null;
|
|
return usageSilentSms;
|
|
});
|
|
}
|
|
|
|
function updateUsageSilentSms(usageSilentSms) {
|
|
usageSilentSms.smsIndex = getIndex(usageSilentSms);
|
|
asyncStorage.setItem('usageSilentSms', usageSilentSms);
|
|
}
|
|
|
|
function getIndex(usageSilentSms) {
|
|
var newIndex = [];
|
|
Object.keys(usageSilentSms).forEach(function(silentRequest) {
|
|
var silentSmsRequest = usageSilentSms[silentRequest];
|
|
if (silentSmsRequest && silentSmsRequest.hasOwnProperty('smsNumbers')) {
|
|
newIndex = newIndex.concat(silentSmsRequest.smsNumbers);
|
|
}
|
|
});
|
|
return newIndex;
|
|
}
|
|
|
|
function checkSilentModeFor(smsNumber) {
|
|
return taskQueue.push(function() {
|
|
function checkSilentMode(usageSilentSms) {
|
|
return usageSilentSms && usageSilentSms.smsIndex &&
|
|
usageSilentSms.smsIndex.indexOf(smsNumber) !== -1;
|
|
}
|
|
return getUsageSilentSms().then(checkSilentMode);
|
|
});
|
|
}
|
|
|
|
return {
|
|
init: init,
|
|
enableSilentModeFor: enableSilentModeFor,
|
|
disableSilentModeFor: disableSilentModeFor,
|
|
checkSilentModeFor: checkSilentModeFor
|
|
};
|
|
}());
|