Loading src/java/com/android/internal/telephony/IccSmsInterfaceManager.java +81 −71 Original line number Diff line number Diff line Loading @@ -676,6 +676,8 @@ public class IccSmsInterfaceManager { } } final long ident = Binder.clearCallingIdentity(); try { destAddr = filterDestAddress(destAddr); if (parts.size() > 1 && parts.size() < 10 && !SmsMessage.hasEmsSupport()) { Loading Loading @@ -715,6 +717,9 @@ public class IccSmsInterfaceManager { (ArrayList<PendingIntent>) deliveryIntents, null, callingPackage, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod); } finally { Binder.restoreCallingIdentity(ident); } } public int getPremiumSmsPermission(String packageName) { Loading Loading @@ -1152,6 +1157,8 @@ public class IccSmsInterfaceManager { return; } final long ident = Binder.clearCallingIdentity(); try { textAndAddress[1] = filterDestAddress(textAndAddress[1]); if (parts.size() > 1 && parts.size() < 10 && !SmsMessage.hasEmsSupport()) { Loading Loading @@ -1196,6 +1203,9 @@ public class IccSmsInterfaceManager { SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); } finally { Binder.restoreCallingIdentity(ident); } } private boolean isFailedOrDraft(ContentResolver resolver, Uri messageUri) { Loading src/java/com/android/internal/telephony/SMSDispatcher.java +17 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.os.AsyncResult; import android.os.Binder; import android.os.Handler; import android.os.Message; import android.os.PersistableBundle; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; Loading @@ -61,6 +62,7 @@ import android.service.carrier.CarrierMessagingService; import android.service.carrier.ICarrierMessagingCallback; import android.service.carrier.ICarrierMessagingService; import android.telephony.CarrierMessagingServiceManager; import android.telephony.CarrierConfigManager; import android.telephony.PhoneNumberUtils; import android.telephony.Rlog; import android.telephony.ServiceState; Loading Loading @@ -1063,7 +1065,9 @@ public abstract class SMSDispatcher extends Handler { uData.payloadStr = message; uData.userDataHeader = smsHeader; if (encoding == SmsConstants.ENCODING_7BIT) { uData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET; uData.msgEncoding = isAscii7bitSupportedForLongMessage() ? UserData.ENCODING_7BIT_ASCII : UserData.ENCODING_GSM_7BIT_ALPHABET; Rlog.d(TAG, "Message encoding for proper 7 bit: " + uData.msgEncoding); } else { // assume UTF-16 uData.msgEncoding = UserData.ENCODING_UNICODE_16; } Loading Loading @@ -1977,4 +1981,16 @@ public abstract class SMSDispatcher extends Handler { protected boolean isCdmaMo() { return mSmsDispatchersController.isCdmaMo(); } private boolean isAscii7bitSupportedForLongMessage() { CarrierConfigManager configManager = (CarrierConfigManager)mContext.getSystemService( Context.CARRIER_CONFIG_SERVICE); PersistableBundle pb = null; pb = configManager.getConfigForSubId(mPhone.getSubId()); if (pb != null) { return pb.getBoolean(CarrierConfigManager .KEY_ASCII_7_BIT_SUPPORT_FOR_LONG_MESSAGE_BOOL); } return false; } } tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java +38 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,44 @@ public class CdmaSmsTest extends AndroidTestCase { assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); } @SmallTest public void testUserData7BitAsciiFeedback() throws Exception { BearerData bearerData = new BearerData(); bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER; bearerData.messageId = 0; bearerData.hasUserDataHeader = false; UserData userData = new UserData(); userData.payloadStr = "Test standard SMS"; userData.msgEncoding = UserData.ENCODING_7BIT_ASCII; userData.msgEncodingSet = true; bearerData.userData = userData; byte[] encodedSms = BearerData.encode(bearerData); BearerData revBearerData = BearerData.decode(encodedSms); assertEquals(userData.msgEncoding, revBearerData.userData.msgEncoding); assertEquals(userData.payloadStr.length(), revBearerData.userData.numFields); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); userData.payloadStr = "1234567"; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); userData.payloadStr = ""; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); userData.payloadStr = "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "1234567890"; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); userData.payloadStr = "Test \u007f illegal \u0000 SMS chars"; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals("Test illegal SMS chars", revBearerData.userData.payloadStr); userData.payloadStr = "More @ testing\nis great^|^~woohoo"; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); } @SmallTest public void testMonolithicOne() throws Exception { String pdu = "0003200010010410168d2002010503060812011101590501c706069706180000000701c108" + Loading Loading
src/java/com/android/internal/telephony/IccSmsInterfaceManager.java +81 −71 Original line number Diff line number Diff line Loading @@ -676,6 +676,8 @@ public class IccSmsInterfaceManager { } } final long ident = Binder.clearCallingIdentity(); try { destAddr = filterDestAddress(destAddr); if (parts.size() > 1 && parts.size() < 10 && !SmsMessage.hasEmsSupport()) { Loading Loading @@ -715,6 +717,9 @@ public class IccSmsInterfaceManager { (ArrayList<PendingIntent>) deliveryIntents, null, callingPackage, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod); } finally { Binder.restoreCallingIdentity(ident); } } public int getPremiumSmsPermission(String packageName) { Loading Loading @@ -1152,6 +1157,8 @@ public class IccSmsInterfaceManager { return; } final long ident = Binder.clearCallingIdentity(); try { textAndAddress[1] = filterDestAddress(textAndAddress[1]); if (parts.size() > 1 && parts.size() < 10 && !SmsMessage.hasEmsSupport()) { Loading Loading @@ -1196,6 +1203,9 @@ public class IccSmsInterfaceManager { SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); } finally { Binder.restoreCallingIdentity(ident); } } private boolean isFailedOrDraft(ContentResolver resolver, Uri messageUri) { Loading
src/java/com/android/internal/telephony/SMSDispatcher.java +17 −1 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import android.os.AsyncResult; import android.os.Binder; import android.os.Handler; import android.os.Message; import android.os.PersistableBundle; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; Loading @@ -61,6 +62,7 @@ import android.service.carrier.CarrierMessagingService; import android.service.carrier.ICarrierMessagingCallback; import android.service.carrier.ICarrierMessagingService; import android.telephony.CarrierMessagingServiceManager; import android.telephony.CarrierConfigManager; import android.telephony.PhoneNumberUtils; import android.telephony.Rlog; import android.telephony.ServiceState; Loading Loading @@ -1063,7 +1065,9 @@ public abstract class SMSDispatcher extends Handler { uData.payloadStr = message; uData.userDataHeader = smsHeader; if (encoding == SmsConstants.ENCODING_7BIT) { uData.msgEncoding = UserData.ENCODING_GSM_7BIT_ALPHABET; uData.msgEncoding = isAscii7bitSupportedForLongMessage() ? UserData.ENCODING_7BIT_ASCII : UserData.ENCODING_GSM_7BIT_ALPHABET; Rlog.d(TAG, "Message encoding for proper 7 bit: " + uData.msgEncoding); } else { // assume UTF-16 uData.msgEncoding = UserData.ENCODING_UNICODE_16; } Loading Loading @@ -1977,4 +1981,16 @@ public abstract class SMSDispatcher extends Handler { protected boolean isCdmaMo() { return mSmsDispatchersController.isCdmaMo(); } private boolean isAscii7bitSupportedForLongMessage() { CarrierConfigManager configManager = (CarrierConfigManager)mContext.getSystemService( Context.CARRIER_CONFIG_SERVICE); PersistableBundle pb = null; pb = configManager.getConfigForSubId(mPhone.getSubId()); if (pb != null) { return pb.getBoolean(CarrierConfigManager .KEY_ASCII_7_BIT_SUPPORT_FOR_LONG_MESSAGE_BOOL); } return false; } }
tests/telephonytests/src/com/android/internal/telephony/cdma/sms/CdmaSmsTest.java +38 −0 Original line number Diff line number Diff line Loading @@ -262,6 +262,44 @@ public class CdmaSmsTest extends AndroidTestCase { assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); } @SmallTest public void testUserData7BitAsciiFeedback() throws Exception { BearerData bearerData = new BearerData(); bearerData.messageType = BearerData.MESSAGE_TYPE_DELIVER; bearerData.messageId = 0; bearerData.hasUserDataHeader = false; UserData userData = new UserData(); userData.payloadStr = "Test standard SMS"; userData.msgEncoding = UserData.ENCODING_7BIT_ASCII; userData.msgEncodingSet = true; bearerData.userData = userData; byte[] encodedSms = BearerData.encode(bearerData); BearerData revBearerData = BearerData.decode(encodedSms); assertEquals(userData.msgEncoding, revBearerData.userData.msgEncoding); assertEquals(userData.payloadStr.length(), revBearerData.userData.numFields); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); userData.payloadStr = "1234567"; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); userData.payloadStr = ""; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); userData.payloadStr = "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "12345678901234567890123456789012345678901234567890" + "1234567890"; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); userData.payloadStr = "Test \u007f illegal \u0000 SMS chars"; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals("Test illegal SMS chars", revBearerData.userData.payloadStr); userData.payloadStr = "More @ testing\nis great^|^~woohoo"; revBearerData = BearerData.decode(BearerData.encode(bearerData)); assertEquals(userData.payloadStr, revBearerData.userData.payloadStr); } @SmallTest public void testMonolithicOne() throws Exception { String pdu = "0003200010010410168d2002010503060812011101590501c706069706180000000701c108" + Loading