Adding a new param to calculateLength for SMS to indicate if called for a
segment of multipart msg.
Encoding type is calculated separately for entire msg vs individual
segments. Change is to avoid overwriting the calculated value for
individual segment based.
Bug: 19399335
Change-Id: I8e89b7596e9c7440ace0486eceb1252094c373fa
diff --git a/src/java/android/telephony/SmsMessage.java b/src/java/android/telephony/SmsMessage.java
index 7688d6f..1dba484 100644
--- a/src/java/android/telephony/SmsMessage.java
+++ b/src/java/android/telephony/SmsMessage.java
@@ -297,7 +297,8 @@
public static int[] calculateLength(CharSequence msgBody, boolean use7bitOnly) {
// this function is for MO SMS
TextEncodingDetails ted = (useCdmaFormatForMoSms()) ?
- com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly) :
+ com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly,
+ true) :
com.android.internal.telephony.gsm.SmsMessage.calculateLength(msgBody, use7bitOnly);
int ret[] = new int[4];
ret[0] = ted.msgCount;
@@ -320,7 +321,7 @@
public static ArrayList<String> fragmentText(String text) {
// This function is for MO SMS
TextEncodingDetails ted = (useCdmaFormatForMoSms()) ?
- com.android.internal.telephony.cdma.SmsMessage.calculateLength(text, false) :
+ com.android.internal.telephony.cdma.SmsMessage.calculateLength(text, false, true) :
com.android.internal.telephony.gsm.SmsMessage.calculateLength(text, false);
// TODO(cleanup): The code here could be rolled into the logic
diff --git a/src/java/com/android/internal/telephony/SMSDispatcher.java b/src/java/com/android/internal/telephony/SMSDispatcher.java
index 6db5cac..098ed46 100644
--- a/src/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/src/java/com/android/internal/telephony/SMSDispatcher.java
@@ -783,7 +783,8 @@
protected abstract void injectSmsPdu(byte[] pdu, String format, PendingIntent receivedIntent);
/**
- * Calculate the number of septets needed to encode the message.
+ * Calculate the number of septets needed to encode the message. This function should only be
+ * called for individual segments of multipart message.
*
* @param messageBody the message to encode
* @param use7bitOnly ignore (but still count) illegal characters if true
diff --git a/src/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java b/src/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
index cc4ada9..f585c0f 100755
--- a/src/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
+++ b/src/java/com/android/internal/telephony/cdma/CdmaSMSDispatcher.java
@@ -160,7 +160,7 @@
@Override
protected GsmAlphabet.TextEncodingDetails calculateLength(CharSequence messageBody,
boolean use7bitOnly) {
- return SmsMessage.calculateLength(messageBody, use7bitOnly);
+ return SmsMessage.calculateLength(messageBody, use7bitOnly, false);
}
/** {@inheritDoc} */
diff --git a/src/java/com/android/internal/telephony/cdma/SmsMessage.java b/src/java/com/android/internal/telephony/cdma/SmsMessage.java
index 13aafb7..a137dac 100644
--- a/src/java/com/android/internal/telephony/cdma/SmsMessage.java
+++ b/src/java/com/android/internal/telephony/cdma/SmsMessage.java
@@ -458,10 +458,11 @@
*
* @param messageBody the message to encode
* @param use7bitOnly ignore (but still count) illegal characters if true
+ * @param isEntireMsg indicates if this is entire msg or a segment in multipart msg
* @return TextEncodingDetails
*/
public static TextEncodingDetails calculateLength(CharSequence messageBody,
- boolean use7bitOnly) {
+ boolean use7bitOnly, boolean isEntireMsg) {
CharSequence newMsgBody = null;
Resources r = Resources.getSystem();
if (r.getBoolean(com.android.internal.R.bool.config_sms_force_7bit_encoding)) {
@@ -470,7 +471,7 @@
if (TextUtils.isEmpty(newMsgBody)) {
newMsgBody = messageBody;
}
- return BearerData.calcTextEncodingDetails(newMsgBody, use7bitOnly);
+ return BearerData.calcTextEncodingDetails(newMsgBody, use7bitOnly, isEntireMsg);
}
/**
diff --git a/src/java/com/android/internal/telephony/cdma/sms/BearerData.java b/src/java/com/android/internal/telephony/cdma/sms/BearerData.java
index 86ffb94..05800b5 100644
--- a/src/java/com/android/internal/telephony/cdma/sms/BearerData.java
+++ b/src/java/com/android/internal/telephony/cdma/sms/BearerData.java
@@ -469,10 +469,11 @@
*
* @param msg message text
* @param force7BitEncoding ignore (but still count) illegal characters if true
+ * @param isEntireMsg indicates if this is entire msg or a segment in multipart msg
* @return septet count, or -1 on failure
*/
public static TextEncodingDetails calcTextEncodingDetails(CharSequence msg,
- boolean force7BitEncoding) {
+ boolean force7BitEncoding, boolean isEntireMsg) {
TextEncodingDetails ted;
int septets = countAsciiSeptets(msg, force7BitEncoding);
if (septets != -1 && septets <= SmsConstants.MAX_USER_DATA_SEPTETS) {
@@ -484,7 +485,8 @@
} else {
ted = com.android.internal.telephony.gsm.SmsMessage.calculateLength(
msg, force7BitEncoding);
- if (ted.msgCount == 1 && ted.codeUnitSize == SmsConstants.ENCODING_7BIT) {
+ if (ted.msgCount == 1 && ted.codeUnitSize == SmsConstants.ENCODING_7BIT &&
+ isEntireMsg) {
// We don't support single-segment EMS, so calculate for 16-bit
// TODO: Consider supporting single-segment EMS
ted.codeUnitCount = msg.length();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SmsMessageBodyTest.java b/tests/telephonytests/src/com/android/internal/telephony/SmsMessageBodyTest.java
index 36bad22..fdc66f4 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SmsMessageBodyTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SmsMessageBodyTest.java
@@ -590,13 +590,13 @@
}
GsmAlphabet.TextEncodingDetails ted =
- com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly);
+ com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly, true);
assertEquals("msgCount", expectedValues[0], ted.msgCount);
assertEquals("codeUnitCount", expectedValues[1], ted.codeUnitCount);
assertEquals("codeUnitsRemaining", expectedValues[2], ted.codeUnitsRemaining);
assertEquals("codeUnitSize", expectedValues[3], ted.codeUnitSize);
- ted = com.android.internal.telephony.cdma.sms.BearerData.calcTextEncodingDetails(msgBody, use7bitOnly);
+ ted = com.android.internal.telephony.cdma.sms.BearerData.calcTextEncodingDetails(msgBody, use7bitOnly, true);
assertEquals("msgCount", expectedValues[0], ted.msgCount);
assertEquals("codeUnitCount", expectedValues[1], ted.codeUnitCount);
assertEquals("codeUnitsRemaining", expectedValues[2], ted.codeUnitsRemaining);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java b/tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java
index 363321a..6f60e64 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java
@@ -917,7 +917,7 @@
String text1 = "123456789012345678901234567890123456789012345678901234567890" +
"1234567890123456789012345678901234567890123456789012345678901234567890" +
"12345678901234567890123456789[";
- TextEncodingDetails ted = SmsMessage.calculateLength(text1, false);
+ TextEncodingDetails ted = SmsMessage.calculateLength(text1, false, true);
assertEquals(ted.msgCount, 1);
assertEquals(ted.codeUnitCount, 160);
assertEquals(ted.codeUnitSize, 1);
@@ -953,7 +953,7 @@
String text2 = "123456789012345678901234567890123456789012345678901234567890" +
"1234567890123456789012345678901234567890123456789012345678901234567890" +
"12345678901234567890123456789\u00a3"; // Trailing pound-currency sign.
- ted = SmsMessage.calculateLength(text2, false);
+ ted = SmsMessage.calculateLength(text2, false, true);
assertEquals(3, ted.msgCount);
assertEquals(160, ted.codeUnitCount);
assertEquals(3, ted.codeUnitSize);
@@ -971,7 +971,7 @@
// Test case for multi-part UTF-16 message.
String text3 = sUnicodeChars + sUnicodeChars + sUnicodeChars;
- ted = SmsMessage.calculateLength(text3, false);
+ ted = SmsMessage.calculateLength(text3, false, true);
assertEquals(3, ted.msgCount);
assertEquals(189, ted.codeUnitCount);
assertEquals(3, ted.codeUnitSize);