зеркало из https://github.com/mozilla/gecko-dev.git
Bug 854326 - B2G Multi-SIM: support multiple SIM cards for SMS/MMS (part 3, add ICC ID). r=vicamo
This commit is contained in:
Родитель
339d80b66e
Коммит
c44807d445
|
@ -33,6 +33,7 @@ interface nsIRilMobileMessageDatabaseService : nsIMobileMessageDatabaseService
|
|||
* - |type| DOMString: "sms" or "mms"
|
||||
* - |sender| DOMString: the phone number of sender
|
||||
* - |timestamp| Number: the timestamp of received message
|
||||
* - |iccId| DOMString: the ICC ID of the SIM for receiving message
|
||||
*
|
||||
* - If |type| == "sms", we also need:
|
||||
* - |messageClass| DOMString: the message class of received message
|
||||
|
@ -57,6 +58,7 @@ interface nsIRilMobileMessageDatabaseService : nsIMobileMessageDatabaseService
|
|||
* - |sender| DOMString: the phone number of sender
|
||||
* - |timestamp| Number: the timestamp of sending message
|
||||
* - |deliveryStatusRequested| Bool: true when the delivery report is requested.
|
||||
* - |iccId| DOMString: the ICC ID of the SIM for sending message
|
||||
*
|
||||
* - If |type| == "sms", we also need:
|
||||
* - |receiver| DOMString: the phone number of receiver
|
||||
|
|
|
@ -246,6 +246,55 @@ XPCOMUtils.defineLazyGetter(this, "gMmsConnection", function () {
|
|||
return isRoaming;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get phone number from iccInfo.
|
||||
*
|
||||
* If the icc card is gsm card, the phone number is in msisdn.
|
||||
* @see nsIDOMMozGsmIccInfo
|
||||
*
|
||||
* Otherwise, the phone number is in mdn.
|
||||
* @see nsIDOMMozCdmaIccInfo
|
||||
*/
|
||||
getPhoneNumber: function getPhoneNumber() {
|
||||
let iccInfo = gRadioInterface.rilContext.iccInfo;
|
||||
|
||||
if (!iccInfo) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let number = (iccInfo instanceof Ci.nsIDOMMozGsmIccInfo)
|
||||
? iccInfo.msisdn : iccInfo.mdn;
|
||||
|
||||
// Workaround an xpconnect issue with undefined string objects.
|
||||
// See bug 808220
|
||||
if (number === undefined || number === "undefined") {
|
||||
return null;
|
||||
}
|
||||
|
||||
return number;
|
||||
},
|
||||
|
||||
/**
|
||||
* A utility function to get the ICC ID of the SIM card (if installed).
|
||||
*/
|
||||
getIccId: function getIccId() {
|
||||
let iccInfo = gRadioInterface.rilContext.iccInfo;
|
||||
|
||||
if (!iccInfo || !(iccInfo instanceof Ci.nsIDOMMozGsmIccInfo)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let iccId = iccInfo.iccid;
|
||||
|
||||
// Workaround an xpconnect issue with undefined string objects.
|
||||
// See bug 808220
|
||||
if (iccId === undefined || iccId === "undefined") {
|
||||
return null;
|
||||
}
|
||||
|
||||
return iccId;
|
||||
},
|
||||
|
||||
/**
|
||||
* Acquire the MMS network connection.
|
||||
*
|
||||
|
@ -1282,33 +1331,6 @@ MmsService.prototype = {
|
|||
return config >= CONFIG_SEND_REPORT_DEFAULT_YES;
|
||||
},
|
||||
|
||||
/**
|
||||
* Get phone number from iccInfo.
|
||||
*
|
||||
* If the icc card is gsm card, the phone number is in msisdn.
|
||||
* @see nsIDOMMozGsmIccInfo
|
||||
*
|
||||
* Otherwise, the phone number is in mdn.
|
||||
* @see nsIDOMMozCdmaIccInfo
|
||||
*/
|
||||
getPhoneNumber: function getPhoneNumber() {
|
||||
let iccInfo = gRadioInterface.rilContext.iccInfo;
|
||||
|
||||
if (!iccInfo) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let number = (iccInfo instanceof Ci.nsIDOMMozGsmIccInfo)
|
||||
? iccInfo.msisdn : iccInfo.mdn;
|
||||
|
||||
// Workaround an xpconnect issue with undefined string objects.
|
||||
// See bug 808220
|
||||
if (number === undefined || number === "undefined") {
|
||||
return null;
|
||||
}
|
||||
return number;
|
||||
},
|
||||
|
||||
/**
|
||||
* Convert intermediate message to indexedDB savable object.
|
||||
*
|
||||
|
@ -1354,7 +1376,8 @@ MmsService.prototype = {
|
|||
intermediate.sender = "anonymous";
|
||||
}
|
||||
intermediate.receivers = [];
|
||||
intermediate.phoneNumber = this.getPhoneNumber();
|
||||
intermediate.phoneNumber = gMmsConnection.getPhoneNumber();
|
||||
intermediate.iccId = gMmsConnection.getIccId();
|
||||
return intermediate;
|
||||
},
|
||||
|
||||
|
@ -1368,7 +1391,8 @@ MmsService.prototype = {
|
|||
* The indexedDB savable MMS message, which is going to be
|
||||
* merged with the extra retrieval confirmation.
|
||||
*/
|
||||
mergeRetrievalConfirmation: function mergeRetrievalConfirmation(intermediate, savable) {
|
||||
mergeRetrievalConfirmation: function mergeRetrievalConfirmation(intermediate,
|
||||
savable) {
|
||||
savable.timestamp = Date.now();
|
||||
if (intermediate.headers.from) {
|
||||
savable.sender = intermediate.headers.from.address;
|
||||
|
@ -1644,7 +1668,8 @@ MmsService.prototype = {
|
|||
retrievalMode = Services.prefs.getCharPref(kPrefRetrievalMode);
|
||||
} catch (e) {}
|
||||
|
||||
let savableMessage = this.convertIntermediateToSavable(notification, retrievalMode);
|
||||
let savableMessage = this.convertIntermediateToSavable(notification,
|
||||
retrievalMode);
|
||||
|
||||
gMobileMessageDatabaseService
|
||||
.saveReceivedMessage(savableMessage,
|
||||
|
@ -1845,7 +1870,8 @@ MmsService.prototype = {
|
|||
aMessage["type"] = "mms";
|
||||
aMessage["timestamp"] = Date.now();
|
||||
aMessage["receivers"] = receivers;
|
||||
aMessage["sender"] = this.getPhoneNumber();
|
||||
aMessage["sender"] = gMmsConnection.getPhoneNumber();
|
||||
aMessage["iccId"] = gMmsConnection.getIccId();
|
||||
try {
|
||||
aMessage["deliveryStatusRequested"] =
|
||||
Services.prefs.getBoolPref("dom.mms.requestStatusReport");
|
||||
|
|
|
@ -24,7 +24,7 @@ const DISABLE_MMS_GROUPING_FOR_RECEIVING = true;
|
|||
|
||||
|
||||
const DB_NAME = "sms";
|
||||
const DB_VERSION = 15;
|
||||
const DB_VERSION = 16;
|
||||
const MESSAGE_STORE_NAME = "sms";
|
||||
const THREAD_STORE_NAME = "thread";
|
||||
const PARTICIPANT_STORE_NAME = "participant";
|
||||
|
@ -230,6 +230,10 @@ MobileMessageDatabaseService.prototype = {
|
|||
self.upgradeSchema14(event.target.transaction, next);
|
||||
break;
|
||||
case 15:
|
||||
if (DEBUG) debug("Upgrade to version 15. Add ICC ID for each message.");
|
||||
self.upgradeSchema15(event.target.transaction, next);
|
||||
break;
|
||||
case 16:
|
||||
// This will need to be moved for each new version
|
||||
if (DEBUG) debug("Upgrade finished.");
|
||||
break;
|
||||
|
@ -1049,6 +1053,25 @@ MobileMessageDatabaseService.prototype = {
|
|||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Add ICC ID.
|
||||
*/
|
||||
upgradeSchema15: function upgradeSchema15(transaction, next) {
|
||||
let messageStore = transaction.objectStore(MESSAGE_STORE_NAME);
|
||||
messageStore.openCursor().onsuccess = function(event) {
|
||||
let cursor = event.target.result;
|
||||
if (!cursor) {
|
||||
next();
|
||||
return;
|
||||
}
|
||||
|
||||
let messageRecord = cursor.value;
|
||||
messageRecord.iccId = null;
|
||||
cursor.update(messageRecord);
|
||||
cursor.continue();
|
||||
};
|
||||
},
|
||||
|
||||
matchParsedPhoneNumbers: function matchParsedPhoneNumbers(addr1, parsedAddr1,
|
||||
addr2, parsedAddr2) {
|
||||
if ((parsedAddr1.internationalNumber &&
|
||||
|
@ -1104,7 +1127,7 @@ MobileMessageDatabaseService.prototype = {
|
|||
if (aMessageRecord.type == "sms") {
|
||||
return gMobileMessageService.createSmsMessage(aMessageRecord.id,
|
||||
aMessageRecord.threadId,
|
||||
null, // TODO
|
||||
aMessageRecord.iccId,
|
||||
aMessageRecord.delivery,
|
||||
aMessageRecord.deliveryStatus,
|
||||
aMessageRecord.sender,
|
||||
|
@ -1160,7 +1183,7 @@ MobileMessageDatabaseService.prototype = {
|
|||
}
|
||||
return gMobileMessageService.createMmsMessage(aMessageRecord.id,
|
||||
aMessageRecord.threadId,
|
||||
null, // TODO
|
||||
aMessageRecord.iccId,
|
||||
aMessageRecord.delivery,
|
||||
aMessageRecord.deliveryInfo,
|
||||
aMessageRecord.sender,
|
||||
|
|
|
@ -1144,9 +1144,31 @@ RadioInterface.prototype = {
|
|||
if (number === undefined || number === "undefined") {
|
||||
return null;
|
||||
}
|
||||
|
||||
return number;
|
||||
},
|
||||
|
||||
/**
|
||||
* A utility function to get the ICC ID of the SIM card (if installed).
|
||||
*/
|
||||
getIccId: function getIccId() {
|
||||
let iccInfo = this.rilContext.iccInfo;
|
||||
|
||||
if (!iccInfo || !(iccInfo instanceof GsmIccInfo)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let iccId = iccInfo.iccid;
|
||||
|
||||
// Workaround an xpconnect issue with undefined string objects.
|
||||
// See bug 808220
|
||||
if (iccId === undefined || iccId === "undefined") {
|
||||
return null;
|
||||
}
|
||||
|
||||
return iccId;
|
||||
},
|
||||
|
||||
updateNetworkInfo: function updateNetworkInfo(message) {
|
||||
let voiceMessage = message[RIL.NETWORK_INFO_VOICE_REGISTRATION_STATE];
|
||||
let dataMessage = message[RIL.NETWORK_INFO_DATA_REGISTRATION_STATE];
|
||||
|
@ -1835,6 +1857,7 @@ RadioInterface.prototype = {
|
|||
message.receiver = this.getPhoneNumber();
|
||||
message.body = message.fullBody = message.fullBody || null;
|
||||
message.timestamp = Date.now();
|
||||
message.iccId = this.getIccId();
|
||||
|
||||
if (gSmsService.isSilentNumber(message.sender)) {
|
||||
message.id = -1;
|
||||
|
@ -1846,7 +1869,7 @@ RadioInterface.prototype = {
|
|||
let domMessage =
|
||||
gMobileMessageService.createSmsMessage(message.id,
|
||||
message.threadId,
|
||||
null, // TODO
|
||||
message.iccId,
|
||||
message.delivery,
|
||||
message.deliveryStatus,
|
||||
message.sender,
|
||||
|
@ -1912,7 +1935,7 @@ RadioInterface.prototype = {
|
|||
let domMessage =
|
||||
gMobileMessageService.createSmsMessage(message.id,
|
||||
message.threadId,
|
||||
null, // TODO
|
||||
message.iccId,
|
||||
message.delivery,
|
||||
message.deliveryStatus,
|
||||
message.sender,
|
||||
|
@ -3022,7 +3045,7 @@ RadioInterface.prototype = {
|
|||
context.request.notifyMessageSent(
|
||||
gMobileMessageService.createSmsMessage(sms.id,
|
||||
sms.threadId,
|
||||
null, // TODO
|
||||
sms.iccId,
|
||||
DOM_MOBILE_MESSAGE_DELIVERY_SENT,
|
||||
sms.deliveryStatus,
|
||||
sms.sender,
|
||||
|
@ -3065,7 +3088,8 @@ RadioInterface.prototype = {
|
|||
receiver: number,
|
||||
body: message,
|
||||
deliveryStatusRequested: options.requestStatusReport,
|
||||
timestamp: Date.now()
|
||||
timestamp: Date.now(),
|
||||
iccId: this.getIccId()
|
||||
};
|
||||
|
||||
if (silent) {
|
||||
|
@ -3074,7 +3098,7 @@ RadioInterface.prototype = {
|
|||
let domMessage =
|
||||
gMobileMessageService.createSmsMessage(-1, // id
|
||||
0, // threadId
|
||||
null, // TODO
|
||||
sendingMessage.iccId,
|
||||
delivery,
|
||||
deliveryStatus,
|
||||
sendingMessage.sender,
|
||||
|
|
Загрузка…
Ссылка в новой задаче