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

Commit

Permalink
Merge pull request #18774 from crh0716/997601_v1.3t
Browse files Browse the repository at this point in the history
Bug 997601 - Save the caller id preferece across reboots r=jaoo, a=1.3T+
  • Loading branch information
crh0716 committed May 8, 2014
2 parents 8969848 + 6c87b64 commit 554fd99
Show file tree
Hide file tree
Showing 2 changed files with 189 additions and 37 deletions.
130 changes: 93 additions & 37 deletions apps/settings/js/call.js
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
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

0 comments on commit 554fd99

Please sign in to comment.