1616
1717package com .android .internal .telephony .gsm ;
1818
19- import android .os .Parcel ;
2019import android .telephony .PhoneNumberUtils ;
2120import android .text .format .Time ;
2221import android .util .Log ;
23- import com . android . internal . telephony . IccUtils ;
22+
2423import com .android .internal .telephony .EncodeException ;
2524import com .android .internal .telephony .GsmAlphabet ;
25+ import com .android .internal .telephony .IccUtils ;
2626import com .android .internal .telephony .SmsHeader ;
2727import com .android .internal .telephony .SmsMessageBase ;
2828
2929import java .io .ByteArrayOutputStream ;
3030import java .io .UnsupportedEncodingException ;
3131
32+ import static android .telephony .SmsMessage .ENCODING_16BIT ;
3233import static android .telephony .SmsMessage .ENCODING_7BIT ;
3334import static android .telephony .SmsMessage .ENCODING_8BIT ;
34- import static android .telephony .SmsMessage .ENCODING_16BIT ;
3535import static android .telephony .SmsMessage .ENCODING_KSC5601 ;
3636import static android .telephony .SmsMessage .ENCODING_UNKNOWN ;
3737import static android .telephony .SmsMessage .MAX_USER_DATA_BYTES ;
@@ -240,18 +240,43 @@ public static SubmitPdu getSubmitPdu(String scAddress,
240240 return null ;
241241 }
242242
243+ if (encoding == ENCODING_UNKNOWN ) {
244+ // Find the best encoding to use
245+ TextEncodingDetails ted = calculateLength (message , false );
246+ encoding = ted .codeUnitSize ;
247+ languageTable = ted .languageTable ;
248+ languageShiftTable = ted .languageShiftTable ;
249+
250+ if (encoding == ENCODING_7BIT && (languageTable != 0 || languageShiftTable != 0 )) {
251+ if (header != null ) {
252+ SmsHeader smsHeader = SmsHeader .fromByteArray (header );
253+ if (smsHeader .languageTable != languageTable
254+ || smsHeader .languageShiftTable != languageShiftTable ) {
255+ Log .w (LOG_TAG , "Updating language table in SMS header: "
256+ + smsHeader .languageTable + " -> " + languageTable + ", "
257+ + smsHeader .languageShiftTable + " -> " + languageShiftTable );
258+ smsHeader .languageTable = languageTable ;
259+ smsHeader .languageShiftTable = languageShiftTable ;
260+ header = SmsHeader .toByteArray (smsHeader );
261+ }
262+ } else {
263+ SmsHeader smsHeader = new SmsHeader ();
264+ smsHeader .languageTable = languageTable ;
265+ smsHeader .languageShiftTable = languageShiftTable ;
266+ header = SmsHeader .toByteArray (smsHeader );
267+ }
268+ }
269+ }
270+
243271 SubmitPdu ret = new SubmitPdu ();
244272 // MTI = SMS-SUBMIT, UDHI = header != null
245273 byte mtiByte = (byte )(0x01 | (header != null ? 0x40 : 0x00 ));
246274 ByteArrayOutputStream bo = getSubmitPduHead (
247275 scAddress , destinationAddress , mtiByte ,
248276 statusReportRequested , ret );
277+
249278 // User Data (and length)
250279 byte [] userData ;
251- if (encoding == ENCODING_UNKNOWN ) {
252- // First, try encoding it with the GSM alphabet
253- encoding = ENCODING_7BIT ;
254- }
255280 try {
256281 if (encoding == ENCODING_7BIT ) {
257282 userData = GsmAlphabet .stringToGsm7BitPackedWithHeader (message , header ,
@@ -283,6 +308,7 @@ public static SubmitPdu getSubmitPdu(String scAddress,
283308 if (encoding == ENCODING_7BIT ) {
284309 if ((0xff & userData [0 ]) > MAX_USER_DATA_SEPTETS ) {
285310 // Message too long
311+ Log .e (LOG_TAG , "Message too long (" + (0xff & userData [0 ]) + " septets)" );
286312 return null ;
287313 }
288314 // TP-Data-Coding-Scheme
@@ -297,6 +323,7 @@ public static SubmitPdu getSubmitPdu(String scAddress,
297323 } else { // assume UCS-2
298324 if ((0xff & userData [0 ]) > MAX_USER_DATA_BYTES ) {
299325 // Message too long
326+ Log .e (LOG_TAG , "Message too long (" + (0xff & userData [0 ]) + " bytes)" );
300327 return null ;
301328 }
302329 // TP-Data-Coding-Scheme
0 commit comments