VulpesOS/gaia/apps/sms/views/shared/js/silent_sms.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

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
};
}());