VulpesOS/gaia/apps/settings/js/modules/apn/apn_settings.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

245 lines
6.7 KiB
JavaScript
Executable file

/**
* ApnSettings provides functions for manipulating the apn settings in the
* settings database.
* Implementation details please refer to {@link ApnSettings}.
*
* @module modules/apn/apn_settings
*/
define(function(require) {
'use strict';
var SettingsCache = require('modules/settings_cache');
var ApnUtils = require('modules/apn/apn_utils');
var ApnConst = require('modules/apn/apn_const');
var APN_SETTINGS_KEY = ApnConst.APN_SETTINGS_KEY;
var DEFAULT_APN_SETTINGS_KEY = ApnConst.DEFAULT_APN_SETTINGS_KEY;
/**
* @class ApnSettings
* @returns {ApnSettings}
*/
function ApnSettings() {
this._isReady = false;
this._readyPromise = null;
this._isWritingDB = false;
this._isDirty = false;
this._apnSettings = null;
this._promiseChain = Promise.resolve();
}
ApnSettings.prototype = {
/**
* As the operations should not be performed concurrently. We use this
* function to enusre the operations are performed one by one.
*
* @access private
* @memberOf ApnSettings.prototype
* @param {Function} task
* @returns {Promise}
*/
_schedule: function al__schedule(task) {
var that = this;
this._promiseChain = this._promiseChain.then(function() {
return task().then(function() {
return that._commit();
});
});
return this._promiseChain;
},
/**
* Stores the current copy of apn settings to the settings database.
*
* @access private
* @memberOf ApnSettings.prototype
* @returns {Promise}
*/
_commit: function al__commit() {
if (!this._isDirty) {
return Promise.resolve();
}
var that = this;
return new Promise(function(resolve) {
that._isWritingDB = true;
var obj = {};
obj[APN_SETTINGS_KEY] = that._apnSettings;
var req = navigator.mozSettings.createLock().set(obj);
req.onsuccess = req.onerror = function() {
that._isDirty = false;
that._isWritingDB = false;
resolve();
};
});
},
/**
* Registers an observer on setting changes because ril.data.apnSettings
* could be changed by other apps (system and wap).
*
* @access private
* @memberOf ApnSettings.prototype
*/
_addObservers: function as__registerListeners() {
var mozSettings = window.navigator.mozSettings;
if (!mozSettings) {
return;
}
mozSettings.addObserver(APN_SETTINGS_KEY, function(event) {
if (!this._isWritingDB) {
// Do not reflect the change during the committing.
this._apnSettings = event.settingValue || [];
}
}.bind(this));
},
/**
* Initializes the settings based on the values stored in the settings
* database.
*
* @access private
* @memberOf ApnSettings.prototype
* @returns {Promise}
*/
_ready: function as__ready() {
if (this._isReady) {
return Promise.resolve();
} else {
// This ensures that the ready process being executed only once.
if (!this._readyPromise) {
var that = this;
this._readyPromise = new Promise(function(resolve) {
SettingsCache.getSettings(function(results) {
that._isReady = true;
that._apnSettings = results[APN_SETTINGS_KEY] || [];
that._addObservers();
resolve();
});
});
}
return this._readyPromise;
}
},
/**
* The internal update function.
*
* @access private
* @memberOf ApnSettings.prototype
* @params {Number} serviceId
* @params {String} apnType
* @params {Object} newApn
* @returns {Promise}
*/
_update: function as__update(serviceId, apnType, newApn) {
return this._ready().then(function() {
var apns = this._apnSettings[serviceId];
if (!apns) {
apns = this._apnSettings[serviceId] = [];
}
var index = apns.findIndex(function(apn) {
return apn.types.some((type) => apnType === type);
});
if (index === -1) {
if (newApn) {
this._isDirty = true;
apns.push(newApn);
}
} else {
if (newApn) {
if (!ApnUtils.isMatchedApn(apns[index], newApn)) {
this._isDirty = true;
apns[index] = newApn;
}
} else {
this._isDirty = true;
apns.splice(index, 1);
}
}
}.bind(this));
},
/**
* Get all apns with of a sim card.
*
* @access public
* @memberOf ApnSettings.prototype
* @params {Number} serviceId
* @returns {Promise.<Array>}
*/
getAll: function as_getAll(serviceId) {
return this._ready().then(function() {
return this._apnSettings[serviceId];
}.bind(this));
},
/**
* Get the apn of the specified apn type.
*
* @access public
* @memberOf ApnSettings.prototype
* @params {Number} serviceId
* @params {String} apnType
* @returns {Promise.<Object>}
*/
get: function as_get(serviceId, apnType) {
return this._ready().then(function() {
var apns = this._apnSettings[serviceId];
if (apns) {
return apns.find((apn) => apn.types.indexOf(apnType) >= 0);
} else {
return null;
}
}.bind(this));
},
/**
* Update an apn and the change will be saved into the settings database.
*
* @access public
* @memberOf ApnSettings.prototype
* @params {Number} serviceId
* @params {String} apnType
* @params {Object} apn
* @returns {Promise}
*/
update: function as_update(serviceId, apnType, apn) {
var apnClone = ApnUtils.clone(apn);
return this._schedule(
this._update.bind(this, serviceId, apnType, apnClone));
},
/**
* Restore the apn settings to the default value determined in
* system/js/operator_variants.js.
*
* @access public
* @memberOf ApnSettings.prototype
* @params {String} serviceId
* @returns {Promise}
*/
restore: function as_restore(serviceId) {
var that = this;
return this._ready().then(function() {
return new Promise(function(resolve) {
SettingsCache.getSettings(function(results) {
resolve(results[DEFAULT_APN_SETTINGS_KEY] || []);
});
});
}).then(function(defaultApnSettings) {
return that._schedule(function() {
that._isDirty = true;
that._apnSettings[serviceId] = defaultApnSettings[serviceId];
return Promise.resolve();
});
});
}
};
return function ctor_apn_settings() {
return new ApnSettings();
};
});