Bug 1053110 - Part 4: Move clir logic to TelephonyService. r=hsinyi

This commit is contained in:
Szu-Yu Chen [:aknow] 2014-08-19 00:24:00 -04:00
parent a816f91cf4
commit fda6b3a0e9
2 changed files with 85 additions and 44 deletions

View File

@ -1679,20 +1679,6 @@ RilObject.prototype = {
this.exitEmergencyCbMode();
}
if (!this._isCdma) {
// TODO: Both dial() and sendMMI() functions should be unified at some
// point in the future. In the mean time we handle temporary CLIR MMI
// commands through the dial() function. Please see bug 889737.
let mmi = this._parseMMI(options.number);
if (mmi && this._isTemporaryModeCLIR(mmi)) {
options.number = mmi.dialNumber;
// In temporary mode, MMI_PROCEDURE_ACTIVATION means allowing CLI
// presentation, i.e. CLIR_SUPPRESSION. See TS 22.030, Annex B.
options.clirMode = mmi.procedure == MMI_PROCEDURE_ACTIVATION ?
CLIR_SUPPRESSION : CLIR_INVOCATION;
}
}
options.request = REQUEST_DIAL;
this.sendDialRequest(options);
},
@ -2390,6 +2376,20 @@ RilObject.prototype = {
{callback: callback});
},
/**
* Parse the dial number to extract its mmi code part.
*
* @param number
* Phone number to be parsed
*/
parseMMIFromDialNumber: function(options) {
// We don't have to parse mmi in cdma.
if (!this._isCdma) {
options.mmi = this._parseMMI(options.number);
}
this.sendChromeMessage(options);
},
/**
* Helper to parse MMI/USSD string. TS.22.030 Figure 3.5.3.2.
*/
@ -3404,20 +3404,6 @@ RilObject.prototype = {
Buf.sendParcel();
},
/**
* Checks whether to temporarily suppress caller id for the call.
*
* @param mmi
* MMI full object.
*/
_isTemporaryModeCLIR: function(mmi) {
return (mmi &&
mmi.serviceCode == MMI_SC_CLIR &&
mmi.dialNumber &&
(mmi.procedure == MMI_PROCEDURE_ACTIVATION ||
mmi.procedure == MMI_PROCEDURE_DEACTIVATION));
},
/**
* Report STK Service is running.
*/

View File

@ -357,6 +357,35 @@ TelephonyService.prototype = {
return numbers.indexOf(aNumber) != -1;
},
/**
* Checks whether to temporarily suppress caller id for the call.
*
* @param aMmi
* MMI full object.
*/
_isTemporaryCLIR: function(aMmi) {
return (aMmi && aMmi.serviceCode === RIL.MMI_SC_CLIR) && aMmi.dialNumber;
},
/**
* Map MMI procedure to CLIR MODE.
*
* @param aProcedure
* MMI procedure
*/
_getTemporaryCLIRMode: function(aProcedure) {
// In temporary mode, MMI_PROCEDURE_ACTIVATION means allowing CLI
// presentation, i.e. CLIR_SUPPRESSION. See TS 22.030, Annex B.
switch (aProcedure) {
case RIL.MMI_PROCEDURE_ACTIVATION:
return RIL.CLIR_SUPPRESSION;
case RIL.MMI_PROCEDURE_DEACTIVATION:
return RIL.CLIR_INVOCATION;
default:
return RIL.CLIR_DEFAULT;
}
},
/**
* nsITelephonyService interface.
*/
@ -457,6 +486,29 @@ TelephonyService.prototype = {
this.notifyCallStateChanged(aClientId, parentCall);
},
_composeDialRequest: function(aClientId, aNumber) {
return new Promise((resolve, reject) => {
this._sendToRilWorker(aClientId, "parseMMIFromDialNumber",
{number: aNumber}, response => {
let options = {};
let mmi = response.mmi;
if (!mmi) {
resolve({
number: aNumber
});
} else if (this._isTemporaryCLIR(mmi)) {
resolve({
number: mmi.dialNumber,
clirMode: this._getTemporaryCLIRMode(mmi.procedure)
});
} else {
reject(DIAL_ERROR_BAD_NUMBER);
}
});
});
},
isDialing: false,
dial: function(aClientId, aNumber, aIsDialEmergency, aCallback) {
@ -497,27 +549,30 @@ TelephonyService.prototype = {
return;
}
let isEmergencyNumber = this._isEmergencyNumber(aNumber);
this._composeDialRequest(aClientId, aNumber).then(options => {
options.isEmergency = this._isEmergencyNumber(options.number);
options.isDialEmergency = aIsDialEmergency;
if (isEmergencyNumber) {
// Automatically select a proper clientId for emergency call.
aClientId = gRadioInterfaceLayer.getClientIdForEmergencyCall() ;
if (aClientId === -1) {
if (DEBUG) debug("Error: No client is avaialble for emergency call.");
aCallback.notifyDialError(DIAL_ERROR_INVALID_STATE_ERROR);
return;
if (options.isEmergency) {
// Automatically select a proper clientId for emergency call.
aClientId = gRadioInterfaceLayer.getClientIdForEmergencyCall() ;
if (aClientId === -1) {
if (DEBUG) debug("Error: No client is avaialble for emergency call.");
aCallback.notifyDialError(DIAL_ERROR_INVALID_STATE_ERROR);
return;
}
}
}
this._dialInternal(aClientId, options, aCallback);
}, cause => {
aCallback.notifyDialError(DIAL_ERROR_BAD_NUMBER);
});
},
_dialInternal: function(aClientId, aOptions, aCallback) {
this.isDialing = true;
let options = {
isDialEmergency: aIsDialEmergency,
isEmergency: isEmergencyNumber,
number: aNumber
};
this._sendToRilWorker(aClientId, "dial", options, response => {
this._sendToRilWorker(aClientId, "dial", aOptions, response => {
this.isDialing = false;
if (!response.success) {