diff options
| author | 2018-06-15 15:26:51 +0900 | |
|---|---|---|
| committer | 2019-05-21 10:32:59 -0700 | |
| commit | 98d41e6917af1411c525efde2698dd8874e068e8 (patch) | |
| tree | b5f2e3ebadf5ca009ce468e4b51d5fd7eeeb7371 | |
| parent | b92f0771dc495402d0fcefb76e5eb2e47e8431d2 (diff) | |
Divide a message text into correctly sized parts
Message format info is required in order to divide a message text into
correctly sized parts on a device that supports for both 3GPP and 3GPP2
formats in multi-sim. And fixed to get default SMS subId from SmsManager
in SmsMessage class instead.
Test: Manual
Bug: 132259056
Merged-in: Id2512eb62504b7e789f58b7d9697009d565c4a18
Change-Id: Id2512eb62504b7e789f58b7d9697009d565c4a18
Signed-off-by: Taesu Lee <taesu82.lee@samsung.com>
(cherry picked from commit 8debeeb12671275bd310c63926347f80aa512ef3)
7 files changed, 133 insertions, 109 deletions
diff --git a/config/hiddenapi-greylist.txt b/config/hiddenapi-greylist.txt index c267e779983a..82d0fbe32993 100644 --- a/config/hiddenapi-greylist.txt +++ b/config/hiddenapi-greylist.txt @@ -1431,8 +1431,6 @@ Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->DBG:Z Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->mTranslationTableCDMA:Landroid/util/SparseIntArray; Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->mTranslationTableCommon:Landroid/util/SparseIntArray; Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->mTranslationTableGSM:Landroid/util/SparseIntArray; -Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->translate(Ljava/lang/CharSequence;)Ljava/lang/String; -Lcom/android/internal/telephony/Sms7BitEncodingTranslator;->useCdmaFormatForMoSms()Z Lcom/android/internal/telephony/SmsApplication$SmsApplicationData;->mApplicationName:Ljava/lang/String; Lcom/android/internal/telephony/SmsApplication;->configurePreferredActivity(Landroid/content/pm/PackageManager;Landroid/content/ComponentName;I)V Lcom/android/internal/telephony/SmsApplication;->getApplicationCollection(Landroid/content/Context;)Ljava/util/Collection; diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java index 8c20afecca80..3b117414826c 100644 --- a/telephony/java/android/telephony/SmsManager.java +++ b/telephony/java/android/telephony/SmsManager.java @@ -721,20 +721,17 @@ public final class SmsManager { } /** - * Divide a message text into several fragments, none bigger than - * the maximum SMS message size. + * Divide a message text into several fragments, none bigger than the maximum SMS message size. * - * @param text the original message. Must not be null. - * @return an <code>ArrayList</code> of strings that, in order, - * comprise the original message - * - * @throws IllegalArgumentException if text is null + * @param text the original message. Must not be null. + * @return an <code>ArrayList</code> of strings that, in order, comprise the original message. + * @throws IllegalArgumentException if text is null. */ public ArrayList<String> divideMessage(String text) { if (null == text) { throw new IllegalArgumentException("text is null"); } - return SmsMessage.fragmentText(text); + return SmsMessage.fragmentText(text, getSubscriptionId()); } /** diff --git a/telephony/java/android/telephony/SmsMessage.java b/telephony/java/android/telephony/SmsMessage.java index 2aa4768d3f00..7d4bcb740f61 100644 --- a/telephony/java/android/telephony/SmsMessage.java +++ b/telephony/java/android/telephony/SmsMessage.java @@ -337,27 +337,45 @@ public class SmsMessage { */ /** - * Calculates the number of SMS's required to encode the message body and - * the number of characters remaining until the next message. + * Calculates the number of SMS's required to encode the message body and the number of + * characters remaining until the next message. * * @param msgBody the message to encode - * @param use7bitOnly if true, characters that are not part of the - * radio-specific 7-bit encoding are counted as single - * space chars. If false, and if the messageBody contains - * non-7-bit encodable characters, length is calculated - * using a 16-bit encoding. - * @return an int[4] with int[0] being the number of SMS's - * required, int[1] the number of code units used, and - * int[2] is the number of code units remaining until the - * next message. int[3] is an indicator of the encoding - * code unit size (see the ENCODING_* definitions in SmsConstants) + * @param use7bitOnly if true, characters that are not part of the radio-specific 7-bit encoding + * are counted as single space chars. If false, and if the messageBody contains non-7-bit + * encodable characters, length is calculated using a 16-bit encoding. + * @return an int[4] with int[0] being the number of SMS's required, int[1] the number of code + * units used, and int[2] is the number of code units remaining until the next message. + * int[3] is an indicator of the encoding code unit size (see the ENCODING_* definitions in + * SmsConstants). */ public static int[] calculateLength(CharSequence msgBody, boolean use7bitOnly) { + return calculateLength(msgBody, use7bitOnly, SmsManager.getDefaultSmsSubscriptionId()); + } + + /** + * Calculates the number of SMS's required to encode the message body and the number of + * characters remaining until the next message. + * + * @param msgBody the message to encode + * @param use7bitOnly if true, characters that are not part of the radio-specific 7-bit encoding + * are counted as single space chars. If false, and if the messageBody contains non-7-bit + * encodable characters, length is calculated using a 16-bit encoding. + * @param subId Subscription to take SMS format. + * @return an int[4] with int[0] being the number of SMS's required, int[1] the number of code + * units used, and int[2] is the number of code units remaining until the next message. + * int[3] is an indicator of the encoding code unit size (see the ENCODING_* definitions in + * SmsConstants). + * @hide + */ + public static int[] calculateLength(CharSequence msgBody, boolean use7bitOnly, int subId) { // this function is for MO SMS - TextEncodingDetails ted = (useCdmaFormatForMoSms()) ? - com.android.internal.telephony.cdma.SmsMessage.calculateLength(msgBody, use7bitOnly, - true) : - com.android.internal.telephony.gsm.SmsMessage.calculateLength(msgBody, use7bitOnly); + TextEncodingDetails ted = + useCdmaFormatForMoSms(subId) + ? 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; ret[1] = ted.codeUnitCount; @@ -367,21 +385,37 @@ public class SmsMessage { } /** - * Divide a message text into several fragments, none bigger than - * the maximum SMS message text size. + * Divide a message text into several fragments, none bigger than the maximum SMS message text + * size. * * @param text text, must not be null. - * @return an <code>ArrayList</code> of strings that, in order, - * comprise the original msg text - * + * @return an <code>ArrayList</code> of strings that, in order, comprise the original msg text. * @hide */ @UnsupportedAppUsage public static ArrayList<String> fragmentText(String text) { + return fragmentText(text, SmsManager.getDefaultSmsSubscriptionId()); + } + + /** + * Divide a message text into several fragments, none bigger than the maximum SMS message text + * size. + * + * @param text text, must not be null. + * @param subId Subscription to take SMS format. + * @return an <code>ArrayList</code> of strings that, in order, comprise the original msg text. + * @hide + */ + public static ArrayList<String> fragmentText(String text, int subId) { // This function is for MO SMS - TextEncodingDetails ted = (useCdmaFormatForMoSms()) ? - com.android.internal.telephony.cdma.SmsMessage.calculateLength(text, false, true) : - com.android.internal.telephony.gsm.SmsMessage.calculateLength(text, false); + final boolean isCdma = useCdmaFormatForMoSms(subId); + + TextEncodingDetails ted = + isCdma + ? 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 // below cleanly if these MAX_* constants were defined more @@ -427,18 +461,19 @@ public class SmsMessage { String newMsgBody = null; Resources r = Resources.getSystem(); if (r.getBoolean(com.android.internal.R.bool.config_sms_force_7bit_encoding)) { - newMsgBody = Sms7BitEncodingTranslator.translate(text); + newMsgBody = Sms7BitEncodingTranslator.translate(text, isCdma); } if (TextUtils.isEmpty(newMsgBody)) { newMsgBody = text; } + int pos = 0; // Index in code units. int textLen = newMsgBody.length(); ArrayList<String> result = new ArrayList<String>(ted.msgCount); while (pos < textLen) { int nextPos = 0; // Counts code units. if (ted.codeUnitSize == SmsConstants.ENCODING_7BIT) { - if (useCdmaFormatForMoSms() && ted.msgCount == 1) { + if (isCdma && ted.msgCount == 1) { // For a singleton CDMA message, the encoding must be ASCII... nextPos = pos + Math.min(limit, textLen - pos); } else { @@ -461,25 +496,39 @@ public class SmsMessage { } /** - * Calculates the number of SMS's required to encode the message body and - * the number of characters remaining until the next message, given the - * current encoding. + * Calculates the number of SMS's required to encode the message body and the number of + * characters remaining until the next message, given the current encoding. * * @param messageBody the message to encode - * @param use7bitOnly if true, characters that are not part of the radio - * specific (GSM / CDMA) alphabet encoding are converted to as a - * single space characters. If false, a messageBody containing - * non-GSM or non-CDMA alphabet characters are encoded using - * 16-bit encoding. - * @return an int[4] with int[0] being the number of SMS's required, int[1] - * the number of code units used, and int[2] is the number of code - * units remaining until the next message. int[3] is the encoding - * type that should be used for the message. + * @param use7bitOnly if true, characters that are not part of the radio specific (GSM / CDMA) + * alphabet encoding are converted to as a single space characters. If false, a messageBody + * containing non-GSM or non-CDMA alphabet characters are encoded using 16-bit encoding. + * @return an int[4] with int[0] being the number of SMS's required, int[1] the number of code + * units used, and int[2] is the number of code units remaining until the next message. + * int[3] is the encoding type that should be used for the message. */ public static int[] calculateLength(String messageBody, boolean use7bitOnly) { return calculateLength((CharSequence)messageBody, use7bitOnly); } + /** + * Calculates the number of SMS's required to encode the message body and the number of + * characters remaining until the next message, given the current encoding. + * + * @param messageBody the message to encode + * @param use7bitOnly if true, characters that are not part of the radio specific (GSM / CDMA) + * alphabet encoding are converted to as a single space characters. If false, a messageBody + * containing non-GSM or non-CDMA alphabet characters are encoded using 16-bit encoding. + * @param subId Subscription to take SMS format. + * @return an int[4] with int[0] being the number of SMS's required, int[1] the number of code + * units used, and int[2] is the number of code units remaining until the next message. + * int[3] is the encoding type that should be used for the message. + * @hide + */ + public static int[] calculateLength(String messageBody, boolean use7bitOnly, int subId) { + return calculateLength((CharSequence) messageBody, use7bitOnly, subId); + } + /* * TODO(cleanup): It looks like there is now no useful reason why * apps should generate pdus themselves using these routines, @@ -510,8 +559,12 @@ public class SmsMessage { */ public static SubmitPdu getSubmitPdu(String scAddress, String destinationAddress, String message, boolean statusReportRequested) { - return getSubmitPdu(scAddress, destinationAddress, message, statusReportRequested, - SubscriptionManager.getDefaultSmsSubscriptionId()); + return getSubmitPdu( + scAddress, + destinationAddress, + message, + statusReportRequested, + SmsManager.getDefaultSmsSubscriptionId()); } /** @@ -834,7 +887,7 @@ public class SmsMessage { @UnsupportedAppUsage private static boolean useCdmaFormatForMoSms() { // IMS is registered with SMS support, check the SMS format supported - return useCdmaFormatForMoSms(SubscriptionManager.getDefaultSmsSubscriptionId()); + return useCdmaFormatForMoSms(SmsManager.getDefaultSmsSubscriptionId()); } /** @@ -863,7 +916,7 @@ public class SmsMessage { * @return true if current phone type is cdma, false otherwise. */ private static boolean isCdmaVoice() { - return isCdmaVoice(SubscriptionManager.getDefaultSmsSubscriptionId()); + return isCdmaVoice(SmsManager.getDefaultSmsSubscriptionId()); } /** diff --git a/telephony/java/com/android/internal/telephony/GsmAlphabet.java b/telephony/java/com/android/internal/telephony/GsmAlphabet.java index a774cdc8a280..87975897bc02 100644 --- a/telephony/java/com/android/internal/telephony/GsmAlphabet.java +++ b/telephony/java/com/android/internal/telephony/GsmAlphabet.java @@ -16,19 +16,17 @@ package com.android.internal.telephony; +import android.annotation.UnsupportedAppUsage; import android.content.res.Resources; +import android.os.Build; +import android.telephony.Rlog; import android.text.TextUtils; import android.util.SparseIntArray; -import android.annotation.UnsupportedAppUsage; -import android.os.Build; -import android.telephony.Rlog; +import com.android.internal.R; import java.nio.ByteBuffer; import java.nio.charset.Charset; -import com.android.internal.telephony.SmsConstants; -import com.android.internal.R; - import java.util.ArrayList; import java.util.List; @@ -868,7 +866,6 @@ public class GsmAlphabet { ted.msgCount = 1; ted.codeUnitsRemaining = SmsConstants.MAX_USER_DATA_SEPTETS - septets; } - ted.codeUnitSize = SmsConstants.ENCODING_7BIT; return ted; } diff --git a/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java b/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java index 439eaeac8de1..a360c646de5c 100644 --- a/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java +++ b/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java @@ -16,19 +16,14 @@ package com.android.internal.telephony; -import android.telephony.Rlog; -import android.os.Build; -import android.util.SparseIntArray; import android.content.res.Resources; import android.content.res.XmlResourceParser; -import android.telephony.SmsManager; -import android.telephony.TelephonyManager; +import android.os.Build; +import android.telephony.Rlog; +import android.util.SparseIntArray; -import com.android.internal.util.XmlUtils; import com.android.internal.telephony.cdma.sms.UserData; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; +import com.android.internal.util.XmlUtils; public class Sms7BitEncodingTranslator { private static final String TAG = "Sms7BitEncodingTranslator"; @@ -47,17 +42,14 @@ public class Sms7BitEncodingTranslator { private static final String XML_TO_TAG = "to"; /** - * Translates each message character that is not supported by GSM 7bit - * alphabet into a supported one + * Translates each message character that is not supported by GSM 7bit alphabet into a supported + * one. * - * @param message - * message to be translated - * @param throwsException - * if true and some error occurs during translation, an exception - * is thrown; otherwise a null String is returned - * @return translated message or null if some error occur + * @param message message to be translated. + * @param isCdmaFormat true if cdma format should be used. + * @return translated message or null if some error occur. */ - public static String translate(CharSequence message) { + public static String translate(CharSequence message, boolean isCdmaFormat) { if (message == null) { Rlog.w(TAG, "Null message can not be translated"); return null; @@ -80,7 +72,6 @@ public class Sms7BitEncodingTranslator { (mTranslationTableGSM != null && mTranslationTableGSM.size() > 0) || (mTranslationTableCDMA != null && mTranslationTableCDMA.size() > 0)) { char[] output = new char[size]; - boolean isCdmaFormat = useCdmaFormatForMoSms(); for (int i = 0; i < size; i++) { output[i] = translateIfNeeded(message.charAt(i), isCdmaFormat); } @@ -159,16 +150,6 @@ public class Sms7BitEncodingTranslator { } } - private static boolean useCdmaFormatForMoSms() { - if (!SmsManager.getDefault().isImsSmsSupported()) { - // use Voice technology to determine SMS format. - return TelephonyManager.getDefault().getCurrentPhoneType() - == PhoneConstants.PHONE_TYPE_CDMA; - } - // IMS is registered with SMS support, check the SMS format supported - return (SmsConstants.FORMAT_3GPP2.equals(SmsManager.getDefault().getImsSmsFormat())); - } - /** * Load the whole translation table file from the framework resource * encoded in XML. diff --git a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java index a31fa0b6a725..f2ebc9808134 100644 --- a/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/cdma/SmsMessage.java @@ -16,18 +16,18 @@ package com.android.internal.telephony.cdma; -import android.os.Parcel; +import android.content.res.Resources; import android.os.SystemProperties; import android.telephony.PhoneNumberUtils; +import android.telephony.Rlog; import android.telephony.SmsCbLocation; import android.telephony.SmsCbMessage; import android.telephony.cdma.CdmaSmsCbProgramData; -import android.telephony.Rlog; -import android.util.Log; import android.text.TextUtils; -import android.content.res.Resources; +import android.util.Log; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; +import com.android.internal.telephony.Sms7BitEncodingTranslator; import com.android.internal.telephony.SmsAddress; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; @@ -41,7 +41,6 @@ import com.android.internal.telephony.cdma.sms.UserData; import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.util.BitwiseInputStream; import com.android.internal.util.HexDump; -import com.android.internal.telephony.Sms7BitEncodingTranslator; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; @@ -418,7 +417,7 @@ public class SmsMessage extends SmsMessageBase { CharSequence newMsgBody = null; Resources r = Resources.getSystem(); if (r.getBoolean(com.android.internal.R.bool.config_sms_force_7bit_encoding)) { - newMsgBody = Sms7BitEncodingTranslator.translate(messageBody); + newMsgBody = Sms7BitEncodingTranslator.translate(messageBody, true); } if (TextUtils.isEmpty(newMsgBody)) { newMsgBody = messageBody; diff --git a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java index 19465a44e4e8..e2365710899e 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java +++ b/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java @@ -16,34 +16,33 @@ package com.android.internal.telephony.gsm; +import static com.android.internal.telephony.SmsConstants.ENCODING_16BIT; +import static com.android.internal.telephony.SmsConstants.ENCODING_7BIT; +import static com.android.internal.telephony.SmsConstants.ENCODING_8BIT; +import static com.android.internal.telephony.SmsConstants.ENCODING_KSC5601; +import static com.android.internal.telephony.SmsConstants.ENCODING_UNKNOWN; +import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_BYTES; +import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_SEPTETS; +import static com.android.internal.telephony.SmsConstants.MessageClass; + +import android.content.res.Resources; import android.telephony.PhoneNumberUtils; -import android.text.format.Time; import android.telephony.Rlog; -import android.content.res.Resources; import android.text.TextUtils; +import android.text.format.Time; import com.android.internal.telephony.EncodeException; import com.android.internal.telephony.GsmAlphabet; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; -import com.android.internal.telephony.uicc.IccUtils; +import com.android.internal.telephony.Sms7BitEncodingTranslator; import com.android.internal.telephony.SmsHeader; import com.android.internal.telephony.SmsMessageBase; -import com.android.internal.telephony.Sms7BitEncodingTranslator; +import com.android.internal.telephony.uicc.IccUtils; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.text.ParseException; -import static com.android.internal.telephony.SmsConstants.MessageClass; -import static com.android.internal.telephony.SmsConstants.ENCODING_UNKNOWN; -import static com.android.internal.telephony.SmsConstants.ENCODING_7BIT; -import static com.android.internal.telephony.SmsConstants.ENCODING_8BIT; -import static com.android.internal.telephony.SmsConstants.ENCODING_16BIT; -import static com.android.internal.telephony.SmsConstants.ENCODING_KSC5601; -import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_SEPTETS; -import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_BYTES; -import static com.android.internal.telephony.SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER; - /** * A Short Message Service message. * @@ -914,7 +913,7 @@ public class SmsMessage extends SmsMessageBase { CharSequence newMsgBody = null; Resources r = Resources.getSystem(); if (r.getBoolean(com.android.internal.R.bool.config_sms_force_7bit_encoding)) { - newMsgBody = Sms7BitEncodingTranslator.translate(msgBody); + newMsgBody = Sms7BitEncodingTranslator.translate(msgBody, false); } if (TextUtils.isEmpty(newMsgBody)) { newMsgBody = msgBody; |