diff --git a/dom/mobileconnection/MobileConnection.cpp b/dom/mobileconnection/MobileConnection.cpp index df1994c1d8a5..21eff515bb64 100644 --- a/dom/mobileconnection/MobileConnection.cpp +++ b/dom/mobileconnection/MobileConnection.cpp @@ -1127,6 +1127,13 @@ MobileConnection::NotifyNetworkSelectionModeChanged() return NS_OK; } +NS_IMETHODIMP +MobileConnection::NotifyDeviceIdentitiesChanged() +{ + // To be supported when bug 1222870 is required in m-c. + return NS_OK; +} + // nsIIccListener NS_IMETHODIMP diff --git a/dom/mobileconnection/gonk/MobileConnectionService.js b/dom/mobileconnection/gonk/MobileConnectionService.js index 5311a8e1359b..c0114ed5dfa7 100644 --- a/dom/mobileconnection/gonk/MobileConnectionService.js +++ b/dom/mobileconnection/gonk/MobileConnectionService.js @@ -462,6 +462,22 @@ CdmaCellInfo.prototype = { evdoSnr: UNKNOWN_VALUE }; +function MobileDeviceIdentities(aImei, aImeisv, aEsn, aMeid) { + this.imei = aImei; + this.imeisv = aImeisv; + this.esn = aEsn; + this.meid = aMeid; +} +MobileDeviceIdentities.prototype = { + QueryInterface: XPCOMUtils.generateQI([Ci.nsIMobileDeviceIdentities]), + + // nsIMobileDeviceIdentities + imei: null, + imeisv: null, + esn: null, + meid: null +}; + function MobileConnectionProvider(aClientId, aRadioInterface) { this._clientId = aClientId; this._radioInterface = aRadioInterface; @@ -501,6 +517,7 @@ MobileConnectionProvider.prototype = { lastKnownNetwork: null, lastKnownHomeNetwork: null, supportedNetworkTypes: null, + deviceIdentities: null, /** * A utility function to dump debug message. @@ -961,6 +978,17 @@ MobileConnectionProvider.prototype = { aServiceClass]); }, + notifyDeviceIdentitiesChanged: function(aImei, aImeisv, aEsn, aMeid) { + if (this.deviceIdentities) { + if (DEBUG) this._debug("deviceIdentities shall not be changed once being updated."); + return; + } + + this.deviceIdentities = + new MobileDeviceIdentities(aImei, aImeisv, aEsn, aMeid); + this.deliverListenerEvent("notifyDeviceIdentitiesChanged"); + }, + getSupportedNetworkTypes: function(aTypes) { aTypes.value = this.supportedNetworkTypes.slice(); return aTypes.value.length; @@ -1693,6 +1721,12 @@ MobileConnectionService.prototype = { .notifyCdmaInfoRecAudioControl(aClientId, aUpLink, aDownLink); }, + notifyDeviceIdentitiesChanged: function(aClientId, aImei, aImeisv, + aEsn, aMeid) { + this.getItemByServiceId(aClientId) + .notifyDeviceIdentitiesChanged(aImei, aImeisv, aEsn, aMeid); + }, + /** * nsIObserver interface. */ diff --git a/dom/mobileconnection/ipc/MobileConnectionChild.cpp b/dom/mobileconnection/ipc/MobileConnectionChild.cpp index ece338f639f6..a41ccdbdd8ad 100644 --- a/dom/mobileconnection/ipc/MobileConnectionChild.cpp +++ b/dom/mobileconnection/ipc/MobileConnectionChild.cpp @@ -107,6 +107,12 @@ MobileConnectionChild::GetRadioState(int32_t* aRadioState) return NS_OK; } +NS_IMETHODIMP +MobileConnectionChild::GetDeviceIdentities(nsIMobileDeviceIdentities** aIdentities) +{ + return NS_ERROR_NOT_IMPLEMENTED; +} + NS_IMETHODIMP MobileConnectionChild::GetSupportedNetworkTypes(int32_t** aTypes, uint32_t* aLength) diff --git a/dom/mobileconnection/ipc/MobileConnectionParent.cpp b/dom/mobileconnection/ipc/MobileConnectionParent.cpp index cc227e654f19..d5824182dbb6 100644 --- a/dom/mobileconnection/ipc/MobileConnectionParent.cpp +++ b/dom/mobileconnection/ipc/MobileConnectionParent.cpp @@ -288,6 +288,13 @@ MobileConnectionParent::NotifyNetworkSelectionModeChanged() return SendNotifyNetworkSelectionModeChanged(mode) ? NS_OK : NS_ERROR_FAILURE; } +NS_IMETHODIMP +MobileConnectionParent::NotifyDeviceIdentitiesChanged() +{ + // To be supported when bug 1222870 is required in m-c. + return NS_OK; +} + /****************************************************************************** * PMobileConnectionRequestParent ******************************************************************************/ diff --git a/dom/mobilemessage/gonk/SmsService.js b/dom/mobilemessage/gonk/SmsService.js index 72e759c47986..be39f4e6804f 100644 --- a/dom/mobilemessage/gonk/SmsService.js +++ b/dom/mobilemessage/gonk/SmsService.js @@ -1410,7 +1410,9 @@ SmsSendingScheduler.prototype = { notifyClirModeChanged: function(mode) {}, notifyLastKnownNetworkChanged: function() {}, notifyLastKnownHomeNetworkChanged: function() {}, - notifyNetworkSelectionModeChanged: function() {} + notifyNetworkSelectionModeChanged: function() {}, + notifyDeviceIdentitiesChanged: function() {} + }; this.NSGetFactory = XPCOMUtils.generateNSGetFactory([SmsService]); diff --git a/dom/system/gonk/DataCallManager.js b/dom/system/gonk/DataCallManager.js index b7a6fcc01d91..5411987cdc2c 100644 --- a/dom/system/gonk/DataCallManager.js +++ b/dom/system/gonk/DataCallManager.js @@ -941,7 +941,9 @@ DataCallHandler.prototype = { notifyLastKnownHomeNetworkChanged: function() {}, - notifyNetworkSelectionModeChanged: function() {} + notifyNetworkSelectionModeChanged: function() {}, + + notifyDeviceIdentitiesChanged: function() {} }; function DataCall(aClientId, aApnSetting, aDataCallHandler) { diff --git a/dom/system/gonk/RadioInterfaceLayer.js b/dom/system/gonk/RadioInterfaceLayer.js index b6419c1e4b67..58292b5010b2 100644 --- a/dom/system/gonk/RadioInterfaceLayer.js +++ b/dom/system/gonk/RadioInterfaceLayer.js @@ -768,6 +768,13 @@ RadioInterface.prototype = { case "otastatuschange": gMobileConnectionService.notifyOtaStatusChanged(this.clientId, message.status); break; + case "deviceidentitieschange": + gMobileConnectionService.notifyDeviceIdentitiesChanged(this.clientId, + message.deviceIdentities.imei, + message.deviceIdentities.imeisv, + message.deviceIdentities.esn, + message.deviceIdentities.meid); + break; case "radiostatechange": // gRadioEnabledController should know the radio state for each client, // so notify gRadioEnabledController here. diff --git a/dom/system/gonk/ril_worker.js b/dom/system/gonk/ril_worker.js index 3732e074abba..9c8c3586d360 100644 --- a/dom/system/gonk/ril_worker.js +++ b/dom/system/gonk/ril_worker.js @@ -164,12 +164,9 @@ RilObject.prototype = { this.cardState = GECKO_CARDSTATE_UNINITIALIZED; /** - * Strings + * Device Identities including IMEI, IMEISV, ESN and MEID. */ - this.IMEI = null; - this.IMEISV = null; - this.ESN = null; - this.MEID = null; + this.deviceIdentities = null; /** * ICC information that is not exposed to Gaia. @@ -1166,25 +1163,8 @@ RilObject.prototype = { this.context.Buf.simpleRequest(REQUEST_SIGNAL_STRENGTH); }, - getIMEI: function(options) { - // A device's IMEI can't change, so we only need to request it once. - if (this.IMEI) { - if (options && options.rilMessageType) { - options.imei = this.IMEI; - this.sendChromeMessage(options); - } - return; - } - - this.context.Buf.simpleRequest(REQUEST_GET_IMEI, options); - }, - - getIMEISV: function() { - this.context.Buf.simpleRequest(REQUEST_GET_IMEISV); - }, - getDeviceIdentity: function() { - this.context.Buf.simpleRequest(REQUEST_DEVICE_IDENTITY); + this.deviceIdentities || this.context.Buf.simpleRequest(REQUEST_DEVICE_IDENTITY); }, getBasebandVersion: function() { @@ -3137,12 +3117,6 @@ RilObject.prototype = { if (this._waitingRadioTech || isCdma != this._isCdma) { this._isCdma = isCdma; this._waitingRadioTech = false; - if (this._isCdma) { - this.getDeviceIdentity(); - } else { - this.getIMEI(); - this.getIMEISV(); - } this.getICCStatus(); } }, @@ -4369,28 +4343,8 @@ RilObject.prototype[REQUEST_SET_CALL_WAITING] = function REQUEST_SET_CALL_WAITIN this.sendChromeMessage(options); }; RilObject.prototype[REQUEST_SMS_ACKNOWLEDGE] = null; -RilObject.prototype[REQUEST_GET_IMEI] = function REQUEST_GET_IMEI(length, options) { - this.IMEI = this.context.Buf.readString(); - - // If the request wasn't made by ril_worker itself, we send the IMEI back to - // chrome. - if (options.rilMessageType) { - if (options.errorMsg) { - this.sendChromeMessage(options); - return; - } - - options.imei = this.IMEI; - this.sendChromeMessage(options); - } -}; -RilObject.prototype[REQUEST_GET_IMEISV] = function REQUEST_GET_IMEISV(length, options) { - if (options.errorMsg) { - return; - } - - this.IMEISV = this.context.Buf.readString(); -}; +RilObject.prototype[REQUEST_GET_IMEI] = null; +RilObject.prototype[REQUEST_GET_IMEISV] = null; RilObject.prototype[REQUEST_ANSWER] = function REQUEST_ANSWER(length, options) { this.sendDefaultResponse(options); }; @@ -4806,16 +4760,22 @@ RilObject.prototype[REQUEST_CDMA_WRITE_SMS_TO_RUIM] = null; RilObject.prototype[REQUEST_CDMA_DELETE_SMS_ON_RUIM] = null; RilObject.prototype[REQUEST_DEVICE_IDENTITY] = function REQUEST_DEVICE_IDENTITY(length, options) { if (options.errorMsg) { + this.context.debug("Failed to get device identities:" + options.errorMsg); return; } let result = this.context.Buf.readStringList(); + this.deviceIdentities = { + imei: result[0] || null, + imeisv: result[1] || null, + esn: result[2] || null, + meid: result[3] || null, + }; - // The result[0] is for IMEI. (Already be handled in REQUEST_GET_IMEI) - // The result[1] is for IMEISV. (Already be handled in REQUEST_GET_IMEISV) - // They are both ignored. - this.ESN = result[2]; - this.MEID = result[3]; + this.sendChromeMessage({ + rilMessageType: "deviceidentitieschange", + deviceIdentities: this.deviceIdentities + }); }; RilObject.prototype[REQUEST_EXIT_EMERGENCY_CALLBACK_MODE] = function REQUEST_EXIT_EMERGENCY_CALLBACK_MODE(length, options) { if (options.internal) { @@ -5061,6 +5021,11 @@ RilObject.prototype[UNSOLICITED_RESPONSE_RADIO_STATE_CHANGED] = function UNSOLIC return; } + if (radioState !== RADIO_STATE_UNAVAILABLE) { + // Retrieve device identities once radio is available. + this.getDeviceIdentity(); + } + if (radioState == RADIO_STATE_ON) { // This value is defined in RIL v7, we will retrieve radio tech by another // request. We leave _isCdma untouched, and it will be set once we get the @@ -5073,14 +5038,6 @@ RilObject.prototype[UNSOLICITED_RESPONSE_RADIO_STATE_CHANGED] = function UNSOLIC this.radioState == GECKO_RADIOSTATE_DISABLED) && newState == GECKO_RADIOSTATE_ENABLED) { // The radio became available, let's get its info. - if (!this._waitingRadioTech) { - if (this._isCdma) { - this.getDeviceIdentity(); - } else { - this.getIMEI(); - this.getIMEISV(); - } - } this.getBasebandVersion(); this.updateCellBroadcastConfig(); if ((RILQUIRKS_DATA_REGISTRATION_ON_DEMAND || diff --git a/dom/telephony/gonk/TelephonyService.js b/dom/telephony/gonk/TelephonyService.js index 8a072d754ffd..c43c8535d431 100644 --- a/dom/telephony/gonk/TelephonyService.js +++ b/dom/telephony/gonk/TelephonyService.js @@ -359,7 +359,8 @@ MobileConnectionListener.prototype = { notifyClirModeChanged: function(mode) {}, notifyLastKnownNetworkChanged: function() {}, notifyLastKnownHomeNetworkChanged: function() {}, - notifyNetworkSelectionModeChanged: function() {} + notifyNetworkSelectionModeChanged: function() {}, + notifyDeviceIdentitiesChanged: function() {} }; function TelephonyService() { @@ -1230,22 +1231,13 @@ TelephonyService.prototype = { * A nsITelephonyDialCallback object. */ _getImeiMMI: function(aClientId, aMmi, aCallback) { - this._sendToRilWorker(aClientId, "getIMEI", {}, aResponse => { - if (aResponse.errorMsg) { - aCallback.notifyDialMMIError(aResponse.errorMsg); - return; - } + let connection = gGonkMobileConnectionService.getItemByServiceId(aClientId); + if (!connection.deviceIdentities || !connection.deviceIdentities.imei) { + aCallback.notifyDialMMIError(RIL.GECKO_ERROR_GENERIC_FAILURE); + return; + } - // We expect to have an IMEI at this point if the request was supposed - // to query for the IMEI, so getting a successful reply from the RIL - // without containing an actual IMEI number is considered an error. - if (!aResponse.imei) { - aCallback.notifyDialMMIError(RIL.GECKO_ERROR_GENERIC_FAILURE); - return; - } - - aCallback.notifyDialMMISuccess(aResponse.imei); - }); + aCallback.notifyDialMMISuccess(connection.deviceIdentities.imei); }, /**