diff --git a/apps/settings/js/call.js b/apps/settings/js/call.js index a7e680845848..1dbece4cb509 100644 --- a/apps/settings/js/call.js +++ b/apps/settings/js/call.js @@ -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(); + }); }); }); } @@ -520,55 +523,96 @@ 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(); } - }; + }); } /** @@ -576,19 +620,31 @@ var CallSettings = (function(window, document, undefined) { */ 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); } /** diff --git a/apps/system/js/telephony_settings.js b/apps/system/js/telephony_settings.js index 159d9258969b..077bc9c210cc 100644 --- a/apps/system/js/telephony_settings.js +++ b/apps/system/js/telephony_settings.js @@ -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'; });