Skip to content
This repository has been archived by the owner on Nov 3, 2021. It is now read-only.

Bug 997601 - Save the caller id preferece across reboots r=jaoo, a=1.3T+ #18774

Merged
merged 1 commit into from
May 8, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
130 changes: 93 additions & 37 deletions apps/settings/js/call.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,11 +114,14 @@ var CallSettings = (function(window, document, undefined) {
if (!_updatingInProgress) {
cs_updateVoiceMailItemState();
cs_updateFdnStatus();
cs_updateCallerIdItemState(
function panelready_updateCallerIdItemState() {
cs_updateCallWaitingItemState(
function panelready_updateCallWaitingItemState() {
cs_updateCallForwardingSubpanels();
cs_updateCallerIdPreference(
function panelready_updateCallerIdPref() {
cs_updateCallerIdItemState(
function panelready_updateCallerIdItemState() {
cs_updateCallWaitingItemState(
function panelready_updateCallWaitingItemState() {
cs_updateCallForwardingSubpanels();
});
});
});
}
Expand Down Expand Up @@ -520,75 +523,128 @@ var CallSettings = (function(window, document, undefined) {
}
}

/**
*
*/
function cs_updateCallerIdItemState(callback) {
function cs_updateCallerIdPreference(callback) {
if (typeof callback !== 'function') {
callback = function() {};
}

cs_enableTabOnCallerIdItem(false);
cs_enableTabOnCallWaitingItem(false);
cs_enableTapOnCallForwardingItems(false);

var req = _mobileConnection.getCallingLineIdRestriction();
req.onsuccess = req.onerror = function(event) {
var input = document.getElementById('ril-callerId');

var value = 'CLIR_DEFAULT';
req.onsuccess = function() {
var value = 0; //CLIR_DEFAULT

// In some legitimates error cases (FdnCheckFailure), the req.result is
// undefined. This is fine, we want this, and in this case we will just
// display an error message for all the matching requests.
// In some legitimates error cases (FdnCheckFailure), the req.result
// is undefined. This is fine, we want this, and in this case we will
// just display an error message for all the matching requests.
if (req.result) {
switch (req.result['m']) {
case 1: // Permanently provisioned
case 3: // Temporary presentation disallowed
case 4: // Temporary presentation allowed
switch (req.result['n']) {
case 1: // CLIR invoked
value = 'CLIR_INVOCATION';
break;
case 2: // CLIR suppressed
value = 'CLIR_SUPPRESSION';
case 1: // CLIR invoked, CLIR_INVOCATION
case 2: // CLIR suppressed, CLIR_SUPPRESSION
case 0: // Network default, CLIR_DEFAULT
value = req.result['n']; //'CLIR_INVOCATION'
break;
case 0: // Network default
default:
value = 'CLIR_DEFAULT';
value = 0; //CLIR_DEFAULT
break;
}
break;
case 0: // Not Provisioned
case 2: // Unknown (network error, etc)
default:
value = 'CLIR_DEFAULT';
value = 0; //CLIR_DEFAULT
break;
}

Settings.getSettings(function(results) {
var preferences = results['ril.clirMode'] || [0, 0];
var targetIndex = DsdsSettings.getIccCardIndexForCallSettings();
preferences[targetIndex] = value;
var setReq = _settings.createLock().set({
'ril.clirMode': preferences
});
setReq.onsuccess = callback;
setReq.onerror = callback;
});
} else {
callback();
}
};
req.onerror = callback;
}

/**
*
*/
function cs_updateCallerIdItemState(callback) {
cs_enableTabOnCallerIdItem(false);
cs_enableTabOnCallWaitingItem(false);
cs_enableTapOnCallForwardingItems(false);

Settings.getSettings(function(results) {
var targetIndex = DsdsSettings.getIccCardIndexForCallSettings();
var preferences = results['ril.clirMode'];
var preference = (preferences && preferences[targetIndex]) || 0;
var input = document.getElementById('ril-callerId');

var value;
switch (preference) {
case 1: // CLIR invoked
value = 'CLIR_INVOCATION';
break;
case 2: // CLIR suppressed
value = 'CLIR_SUPPRESSION';
break;
case 0: // Network default
default:
value = 'CLIR_DEFAULT';
break;
}

input.value = value;

if (callback) {
callback(null);
if (typeof callback === 'function') {
callback();
}
};
});
}

/**
*
*/
function cs_initCallerId() {
var element = document.getElementById('ril-callerId');
// We listen for blur events so that way we set the CLIR mode once the user
// clicks on the OK button.

var updateItem = function() {
cs_updateCallerIdItemState(function() {
cs_enableTabOnCallerIdItem(true);
cs_enableTabOnCallWaitingItem(true);
cs_enableTapOnCallForwardingItems(true);
});
};

var updatePreferenceAndItem =
cs_updateCallerIdPreference.bind(null, updateItem);

// We listen for blur events so that way we set the CLIR mode once the
// user clicks on the OK button.
element.addEventListener('blur', function(event) {
var clirMode = _clirConstantsMapping[element.value];
var req = _mobileConnection.setCallingLineIdRestriction(clirMode);
req.onsuccess = req.onerror = function() {
cs_updateCallerIdItemState(function() {
cs_enableTabOnCallerIdItem(true);
cs_enableTabOnCallWaitingItem(true);
cs_enableTapOnCallForwardingItems(true);
});
};
var setReq = _mobileConnection.setCallingLineIdRestriction(clirMode);
// If the setting success, system app will sync the value.
// If the setting fails, we force sync the value here and update the UI.
setReq.onerror = updatePreferenceAndItem;
});

// As system app will sync the value 'ril.clirMode' with the carrier,
// the UI update will be triggered by updateItem.
navigator.mozSettings.addObserver('ril.clirMode', updateItem);
}

/**
Expand Down
96 changes: 96 additions & 0 deletions apps/system/js/telephony_settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,102 @@
});
});

/**
* Initializes caller id restriction based on user setting.
*
* CLIR_DEFAULT: 0
* CLIR_INVOCATION: 1
* CLIR_SUPPRESSION: 2
*/
var defaultCallerIdPreferences =
mobileConnections.map(function() { return 0; });
var callerIdPreferenceHelper =
SettingsHelper('ril.clirMode', defaultCallerIdPreferences);

callerIdPreferenceHelper.get(function got_cid(values) {
mobileConnections.forEach(function cid_iterator(conn, index) {
_setCallerIdPreference(conn, values[index], function() {
_syncCallerIdPreferenceWithCarrier(conn, index,
callerIdPreferenceHelper);
_registerListenerForCallerIdPreference(conn, index,
callerIdPreferenceHelper);
});
});
});

function _registerListenerForCallerIdPreference(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) {
_syncCallerIdPreferenceWithCarrier(conn, index, helper);
});
}

function _syncCallerIdPreferenceWithCarrier(conn, index, helper) {
_getCallerIdPreference(conn, function(realValue) {
helper.get(function got_cid(values) {
values[index] = realValue;
helper.set(values);
});
});
}

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

function _setCallerIdPreference(conn, callerIdPreference, callback) {
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 roaming preference
var defaultRoamingPreferences =
mobileConnections.map(function() { return 'any'; });
Expand Down