Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
258 lines
8.4 KiB
JavaScript
258 lines
8.4 KiB
JavaScript
'use strict';
|
|
/* global SettingsHelper, BaseModule, LazyLoader */
|
|
|
|
(function() {
|
|
/**
|
|
* TelephonySettings sets voice privacy and roaming modes based on
|
|
* the users saved settings.
|
|
* @requires SettingsHelper
|
|
* @class TelephonySettings
|
|
*/
|
|
function TelephonySettings(core) {
|
|
this.started = false;
|
|
this.connections = Array.slice(core.mobileConnections || []);
|
|
}
|
|
|
|
BaseModule.create(TelephonySettings, {
|
|
name: 'TelephonySettings',
|
|
/**
|
|
* Initialzes all settings.
|
|
* @memberof TelephonySettings.prototype
|
|
*/
|
|
_start: function() {
|
|
// XXX: Deprecate SettingsHelper usage in system app
|
|
// and use this.readSetting instead.
|
|
return LazyLoader.load('shared/js/settings_helper.js').then(() => {
|
|
this.initVoicePrivacy();
|
|
this.initRoaming();
|
|
this.initCallerIdPreference();
|
|
this.initPreferredNetworkType();
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Initializes voice privacy based on user setting.
|
|
*/
|
|
initVoicePrivacy: function() {
|
|
var defaultVoicePrivacySettings =
|
|
this.connections.map(function() { return false; });
|
|
var voicePrivacyHelper =
|
|
SettingsHelper('ril.voicePrivacy.enabled', defaultVoicePrivacySettings);
|
|
voicePrivacyHelper.get(function got_vp(values) {
|
|
this.connections.forEach(function vp_iterator(conn, index) {
|
|
var setReq = conn.setVoicePrivacyMode(values[index]);
|
|
setReq.onerror = function set_vpm_error() {
|
|
if (setReq.error.name === 'RequestNotSupported' ||
|
|
setReq.error.name === 'GenericFailure') {
|
|
console.log('Request not supported.');
|
|
} else {
|
|
console.error('Error setting voice privacy.');
|
|
}
|
|
};
|
|
});
|
|
}.bind(this));
|
|
},
|
|
|
|
/**
|
|
* Initializes roaming based on user setting.
|
|
*/
|
|
initRoaming: function() {
|
|
var defaultRoamingPreferences =
|
|
this.connections.map(function() { return 'any'; });
|
|
var roamingPreferenceHelper =
|
|
SettingsHelper('ril.roaming.preference', defaultRoamingPreferences);
|
|
roamingPreferenceHelper.get(function got_rp(values) {
|
|
this.connections.forEach(function rp_iterator(conn, index) {
|
|
var setReq = conn.setRoamingPreference(values[index]);
|
|
setReq.onerror = function set_vpm_error() {
|
|
if (setReq.error.name === 'RequestNotSupported' ||
|
|
setReq.error.name === 'GenericFailure') {
|
|
console.log('Request not supported.');
|
|
} else {
|
|
console.error('Error roaming preference.');
|
|
}
|
|
};
|
|
});
|
|
}.bind(this));
|
|
},
|
|
|
|
/**
|
|
* Initializes caller id restriction based on user setting.
|
|
*
|
|
* CLIR_DEFAULT: 0
|
|
* CLIR_INVOCATION: 1
|
|
* CLIR_SUPPRESSION: 2
|
|
*/
|
|
initCallerIdPreference: function() {
|
|
var callerIdPreferenceHelper = SettingsHelper('ril.clirMode', null);
|
|
var that = this;
|
|
|
|
callerIdPreferenceHelper.get(function got_cid(values) {
|
|
that.connections.forEach(function cid_iterator(conn, index) {
|
|
if (values && values[index] !== null) {
|
|
that._setCallerIdPreference(conn, values[index], function() {
|
|
that._syncCallerIdPreferenceWithCarrier(conn, index,
|
|
callerIdPreferenceHelper);
|
|
that._registerListenerForCallerIdPreference(conn, index,
|
|
callerIdPreferenceHelper);
|
|
});
|
|
} else {
|
|
that._registerListenerForCallerIdPreference(conn, index,
|
|
callerIdPreferenceHelper);
|
|
}
|
|
});
|
|
});
|
|
},
|
|
|
|
_registerListenerForCallerIdPreference: function(conn, index, helper) {
|
|
// register event handler for caller id preference change, but we should
|
|
// always query the real settings value from the carrier.
|
|
conn.addEventListener('clirmodechange', function onclirchanged(event) {
|
|
this._syncCallerIdPreferenceWithCarrier(conn, index, helper);
|
|
}.bind(this));
|
|
},
|
|
|
|
_syncCallerIdPreferenceWithCarrier: function(conn, index, helper) {
|
|
var that = this;
|
|
this._getCallerIdPreference(conn, function(realValue) {
|
|
helper.get(function got_cid(values) {
|
|
values = values || that.connections.map(function() {
|
|
return 0;
|
|
});
|
|
values[index] = realValue;
|
|
helper.set(values);
|
|
});
|
|
});
|
|
},
|
|
|
|
_getCallerIdPreference: function(conn, callback) {
|
|
var req = conn.getCallingLineIdRestriction();
|
|
req.onsuccess = req.onerror = function(event) {
|
|
var value = 0;
|
|
if (req.result) {
|
|
switch (req.result.m) {
|
|
case 1: // Permanently provisioned
|
|
case 3: // Temporary presentation disallowed
|
|
case 4: // Temporary presentation allowed
|
|
value = req.result.n;
|
|
break;
|
|
case 0: // Not Provisioned
|
|
case 2: // Unknown (network error, etc)
|
|
value = 0;
|
|
break;
|
|
default:
|
|
value = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (callback) {
|
|
callback(value);
|
|
}
|
|
};
|
|
},
|
|
|
|
_setCallerIdPreference: function(conn, callerIdPreference, callback) {
|
|
if (!conn.setCallingLineIdRestriction) {
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
return;
|
|
}
|
|
|
|
var doSet = function() {
|
|
var setReq = conn.setCallingLineIdRestriction(callerIdPreference);
|
|
setReq.onsuccess = function set_cid_success() {
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
};
|
|
setReq.onerror = function set_cid_error() {
|
|
console.error('Error set caller id restriction.');
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
};
|
|
};
|
|
|
|
// Waiting for voice connected
|
|
if (conn.voice && conn.voice.connected) {
|
|
doSet();
|
|
} else {
|
|
conn.addEventListener('voicechange', function onchange() {
|
|
if (conn.voice && conn.voice.connected) {
|
|
conn.removeEventListener('voicechange', onchange);
|
|
doSet();
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Initialize preferred network type. If the default value is null, we
|
|
* should use the option that makes the device able to connect all supported
|
|
* netwrok types.
|
|
*/
|
|
initPreferredNetworkType: function() {
|
|
var preferredNetworkTypeHelper =
|
|
SettingsHelper('ril.radio.preferredNetworkType');
|
|
preferredNetworkTypeHelper.get(function got_pnt(values) {
|
|
if (!values) {
|
|
values = this._getDefaultPreferredNetworkTypes();
|
|
preferredNetworkTypeHelper.set(values);
|
|
} else if (typeof values == 'string') {
|
|
// do the migration
|
|
var tempDefault = this._getDefaultPreferredNetworkTypes();
|
|
tempDefault[0] = values;
|
|
values = tempDefault;
|
|
preferredNetworkTypeHelper.set(values);
|
|
}
|
|
|
|
this.connections.forEach(function pnt_iterator(conn, index) {
|
|
this._setDefaultPreferredNetworkType(conn, values[index]);
|
|
}, this);
|
|
}.bind(this));
|
|
},
|
|
|
|
_setDefaultPreferredNetworkType: function(conn, preferredNetworkType) {
|
|
var doSet = function() {
|
|
var setReq = conn.setPreferredNetworkType(preferredNetworkType);
|
|
setReq.onerror = function set_vpm_error() {
|
|
console.error('Error setting preferred network type: ' +
|
|
preferredNetworkType);
|
|
};
|
|
};
|
|
if (conn.radioState === 'enabled') {
|
|
doSet();
|
|
} else {
|
|
conn.addEventListener('radiostatechange', function onchange() {
|
|
if (conn.radioState === 'enabled') {
|
|
conn.removeEventListener('radiostatechange', onchange);
|
|
doSet();
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
/**
|
|
* Returns an array specifying the default preferred network types of all
|
|
* mobile connections.
|
|
*/
|
|
_getDefaultPreferredNetworkTypes: function() {
|
|
return this.connections.map(function(conn) {
|
|
return this._getDefaultPreferredNetworkType(conn.supportedNetworkTypes);
|
|
}, this);
|
|
},
|
|
|
|
/**
|
|
* Returns the default preferred network types based on the hardware
|
|
* supported network types.
|
|
*/
|
|
_getDefaultPreferredNetworkType: function(hwSupportedTypes) {
|
|
return ['lte', 'wcdma', 'gsm', 'cdma', 'evdo'].filter(function(type) {
|
|
return (hwSupportedTypes && hwSupportedTypes.indexOf(type) !== -1);
|
|
}).join('/');
|
|
}
|
|
});
|
|
|
|
}());
|