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);