Loading src/java/android/telephony/SmsManager.java +2 −1 Original line number Diff line number Diff line Loading @@ -329,7 +329,8 @@ public final class SmsManager { try { ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms")); if (iccISms != null) { iccISms.injectSmsPdu(pdu, format, receivedIntent); iccISms.injectSmsPduForSubscriber( getSubscriptionId(), pdu, format, receivedIntent); } } catch (RemoteException ex) { // ignore it Loading src/java/android/telephony/SmsMessage.java +13 −10 Original line number Diff line number Diff line Loading @@ -149,17 +149,18 @@ public class SmsMessage { } /** * Create an SmsMessage from a raw PDU. * * <p><b>This method will soon be deprecated</b> and all applications which handle * Create an SmsMessage from a raw PDU. Guess format based on Voice * technology first, if it fails use other format. * All applications which handle * incoming SMS messages by processing the {@code SMS_RECEIVED_ACTION} broadcast * intent <b>must</b> now pass the new {@code format} String extra from the intent * into the new method {@code createFromPdu(byte[], String)} which takes an * extra format parameter. This is required in order to correctly decode the PDU on * devices that require support for both 3GPP and 3GPP2 formats at the same time, * such as dual-mode GSM/CDMA and CDMA/LTE phones. Guess format based on Voice * technology first, if it fails use other format. * such as dual-mode GSM/CDMA and CDMA/LTE phones. * @deprecated Use {@link #createFromPdu(byte[], String)} instead. */ @Deprecated public static SmsMessage createFromPdu(byte[] pdu) { SmsMessage message = null; Loading @@ -181,13 +182,15 @@ public class SmsMessage { /** * Create an SmsMessage from a raw PDU with the specified message format. The * message format is passed in the {@code SMS_RECEIVED_ACTION} as the {@code format} * message format is passed in the * {@link android.provider.Telephony.Sms.Intents#SMS_RECEIVED_ACTION} as the {@code format} * String extra, and will be either "3gpp" for GSM/UMTS/LTE messages in 3GPP format * or "3gpp2" for CDMA/LTE messages in 3GPP2 format. * * @param pdu the message PDU from the SMS_RECEIVED_ACTION intent * @param format the format extra from the SMS_RECEIVED_ACTION intent * @hide pending API council approval * @param pdu the message PDU from the * {@link android.provider.Telephony.Sms.Intents#SMS_RECEIVED_ACTION} intent * @param format the format extra from the * {@link android.provider.Telephony.Sms.Intents#SMS_RECEIVED_ACTION} intent */ public static SmsMessage createFromPdu(byte[] pdu, String format) { SmsMessageBase wrappedMessage; Loading Loading @@ -388,7 +391,7 @@ public class SmsMessage { ted.languageTable, ted.languageShiftTable); } } else { // Assume unicode. nextPos = pos + Math.min(limit / 2, textLen - pos); nextPos = SmsMessageBase.findNextUnicodePosition(pos, limit, newMsgBody); } if ((nextPos <= pos) || (nextPos > textLen)) { Rlog.e(LOG_TAG, "fragmentText failed (" + pos + " >= " + nextPos + " or " + Loading src/java/com/android/internal/telephony/Connection.java +13 −1 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ public abstract class Connection { public void onConferenceParticipantsChanged(List<ConferenceParticipant> participants); public void onCallSubstateChanged(int callSubstate); public void onMultipartyStateChanged(boolean isMultiParty); public void onConferenceMergedFailed(); } /** Loading @@ -77,6 +78,8 @@ public abstract class Connection { public void onCallSubstateChanged(int callSubstate) {} @Override public void onMultipartyStateChanged(boolean isMultiParty) {} @Override public void onConferenceMergedFailed() {} } public static final int AUDIO_QUALITY_STANDARD = 1; Loading Loading @@ -640,7 +643,7 @@ public abstract class Connection { } /** * Notifies listeners of a change to the multiparty state of the connection.. * Notifies listeners of a change to the multiparty state of the connection. * * @param isMultiparty The participant(s). */ Loading @@ -650,6 +653,15 @@ public abstract class Connection { } } /** * Notifies listeners of a failure in merging this connection with the background connection. */ public void onConferenceMergeFailed() { for (Listener l : mListeners) { l.onConferenceMergedFailed(); } } /** * Notifies this Connection of a request to disconnect a participant of the conference managed * by the connection. Loading src/java/com/android/internal/telephony/SMSDispatcher.java +14 −3 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.internal.telephony; import android.annotation.Nullable; import android.app.Activity; import android.app.AlertDialog; import android.app.PendingIntent; Loading Loading @@ -354,6 +355,13 @@ public abstract class SMSDispatcher extends Handler { } } private static int getSendSmsFlag(@Nullable PendingIntent deliveryIntent) { if (deliveryIntent == null) { return 0; } return CarrierMessagingService.SEND_FLAG_REQUEST_DELIVERY_STATUS; } /** * Use the carrier messaging service to send a text SMS. */ Loading @@ -370,7 +378,8 @@ public abstract class SMSDispatcher extends Handler { if (text != null) { try { carrierMessagingService.sendTextSms(text, getSubId(), mTracker.mDestAddress, mSenderCallback); mTracker.mDestAddress, getSendSmsFlag(mTracker.mDeliveryIntent), mSenderCallback); } catch (RemoteException e) { Rlog.e(TAG, "Exception sending the SMS: " + e); mSenderCallback.onSendSmsComplete( Loading Loading @@ -402,7 +411,8 @@ public abstract class SMSDispatcher extends Handler { if (data != null) { try { carrierMessagingService.sendDataSms(data, getSubId(), mTracker.mDestAddress, destPort, mSenderCallback); mTracker.mDestAddress, destPort, getSendSmsFlag(mTracker.mDeliveryIntent), mSenderCallback); } catch (RemoteException e) { Rlog.e(TAG, "Exception sending the SMS: " + e); mSenderCallback.onSendSmsComplete( Loading Loading @@ -528,7 +538,8 @@ public abstract class SMSDispatcher extends Handler { protected void onServiceReady(ICarrierMessagingService carrierMessagingService) { try { carrierMessagingService.sendMultipartTextSms( mParts, getSubId(), mTrackers[0].mDestAddress, mSenderCallback); mParts, getSubId(), mTrackers[0].mDestAddress, getSendSmsFlag(mTrackers[0].mDeliveryIntent), mSenderCallback); } catch (RemoteException e) { Rlog.e(TAG, "Exception sending the SMS: " + e); mSenderCallback.onSendMultipartSmsComplete( Loading src/java/com/android/internal/telephony/SmsMessageBase.java +69 −0 Original line number Diff line number Diff line Loading @@ -16,11 +16,14 @@ package com.android.internal.telephony; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; import java.text.BreakIterator; import java.util.Arrays; import android.provider.Telephony; import android.telephony.SmsMessage; /** * Base class declaring the specific methods and members for SmsMessage. Loading Loading @@ -346,4 +349,70 @@ public abstract class SmsMessageBase { mIsEmail = Telephony.Mms.isEmailAddress(mEmailFrom); } /** * Find the next position to start a new fragment of a multipart SMS. * * @param currentPosition current start position of the fragment * @param byteLimit maximum number of bytes in the fragment * @param msgBody text of the SMS in UTF-16 encoding * @return the position to start the next fragment */ public static int findNextUnicodePosition( int currentPosition, int byteLimit, CharSequence msgBody) { int nextPos = Math.min(currentPosition + byteLimit / 2, msgBody.length()); // Check whether the fragment ends in a character boundary. Some characters take 4-bytes // in UTF-16 encoding. Many carriers cannot handle // a fragment correctly if it does not end at a character boundary. if (nextPos < msgBody.length()) { BreakIterator breakIterator = BreakIterator.getCharacterInstance(); breakIterator.setText(msgBody.toString()); if (!breakIterator.isBoundary(nextPos)) { nextPos = breakIterator.preceding(nextPos); } } return nextPos; } /** * Calculate the TextEncodingDetails of a message encoded in Unicode. */ public static TextEncodingDetails calcUnicodeEncodingDetails(CharSequence msgBody) { TextEncodingDetails ted = new TextEncodingDetails(); int octets = msgBody.length() * 2; ted.codeUnitSize = SmsConstants.ENCODING_16BIT; ted.codeUnitCount = msgBody.length(); if (octets > SmsConstants.MAX_USER_DATA_BYTES) { // If EMS is not supported, break down EMS into single segment SMS // and add page info " x/y". // In the case of UCS2 encoding type, we need 8 bytes for this // but we only have 6 bytes from UDH, so truncate the limit for // each segment by 2 bytes (1 char). int maxUserDataBytesWithHeader = SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER; if (!SmsMessage.hasEmsSupport()) { // make sure total number of segments is less than 10 if (octets <= 9 * (maxUserDataBytesWithHeader - 2)) { maxUserDataBytesWithHeader -= 2; } } int pos = 0; // Index in code units. int msgCount = 0; while (pos < msgBody.length()) { int nextPos = findNextUnicodePosition(pos, maxUserDataBytesWithHeader, msgBody); if (nextPos == msgBody.length()) { ted.codeUnitsRemaining = pos + maxUserDataBytesWithHeader / 2 - msgBody.length(); } pos = nextPos; msgCount++; } ted.msgCount = msgCount; } else { ted.msgCount = 1; ted.codeUnitsRemaining = (SmsConstants.MAX_USER_DATA_BYTES - octets) / 2; } return ted; } } Loading
src/java/android/telephony/SmsManager.java +2 −1 Original line number Diff line number Diff line Loading @@ -329,7 +329,8 @@ public final class SmsManager { try { ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms")); if (iccISms != null) { iccISms.injectSmsPdu(pdu, format, receivedIntent); iccISms.injectSmsPduForSubscriber( getSubscriptionId(), pdu, format, receivedIntent); } } catch (RemoteException ex) { // ignore it Loading
src/java/android/telephony/SmsMessage.java +13 −10 Original line number Diff line number Diff line Loading @@ -149,17 +149,18 @@ public class SmsMessage { } /** * Create an SmsMessage from a raw PDU. * * <p><b>This method will soon be deprecated</b> and all applications which handle * Create an SmsMessage from a raw PDU. Guess format based on Voice * technology first, if it fails use other format. * All applications which handle * incoming SMS messages by processing the {@code SMS_RECEIVED_ACTION} broadcast * intent <b>must</b> now pass the new {@code format} String extra from the intent * into the new method {@code createFromPdu(byte[], String)} which takes an * extra format parameter. This is required in order to correctly decode the PDU on * devices that require support for both 3GPP and 3GPP2 formats at the same time, * such as dual-mode GSM/CDMA and CDMA/LTE phones. Guess format based on Voice * technology first, if it fails use other format. * such as dual-mode GSM/CDMA and CDMA/LTE phones. * @deprecated Use {@link #createFromPdu(byte[], String)} instead. */ @Deprecated public static SmsMessage createFromPdu(byte[] pdu) { SmsMessage message = null; Loading @@ -181,13 +182,15 @@ public class SmsMessage { /** * Create an SmsMessage from a raw PDU with the specified message format. The * message format is passed in the {@code SMS_RECEIVED_ACTION} as the {@code format} * message format is passed in the * {@link android.provider.Telephony.Sms.Intents#SMS_RECEIVED_ACTION} as the {@code format} * String extra, and will be either "3gpp" for GSM/UMTS/LTE messages in 3GPP format * or "3gpp2" for CDMA/LTE messages in 3GPP2 format. * * @param pdu the message PDU from the SMS_RECEIVED_ACTION intent * @param format the format extra from the SMS_RECEIVED_ACTION intent * @hide pending API council approval * @param pdu the message PDU from the * {@link android.provider.Telephony.Sms.Intents#SMS_RECEIVED_ACTION} intent * @param format the format extra from the * {@link android.provider.Telephony.Sms.Intents#SMS_RECEIVED_ACTION} intent */ public static SmsMessage createFromPdu(byte[] pdu, String format) { SmsMessageBase wrappedMessage; Loading Loading @@ -388,7 +391,7 @@ public class SmsMessage { ted.languageTable, ted.languageShiftTable); } } else { // Assume unicode. nextPos = pos + Math.min(limit / 2, textLen - pos); nextPos = SmsMessageBase.findNextUnicodePosition(pos, limit, newMsgBody); } if ((nextPos <= pos) || (nextPos > textLen)) { Rlog.e(LOG_TAG, "fragmentText failed (" + pos + " >= " + nextPos + " or " + Loading
src/java/com/android/internal/telephony/Connection.java +13 −1 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ public abstract class Connection { public void onConferenceParticipantsChanged(List<ConferenceParticipant> participants); public void onCallSubstateChanged(int callSubstate); public void onMultipartyStateChanged(boolean isMultiParty); public void onConferenceMergedFailed(); } /** Loading @@ -77,6 +78,8 @@ public abstract class Connection { public void onCallSubstateChanged(int callSubstate) {} @Override public void onMultipartyStateChanged(boolean isMultiParty) {} @Override public void onConferenceMergedFailed() {} } public static final int AUDIO_QUALITY_STANDARD = 1; Loading Loading @@ -640,7 +643,7 @@ public abstract class Connection { } /** * Notifies listeners of a change to the multiparty state of the connection.. * Notifies listeners of a change to the multiparty state of the connection. * * @param isMultiparty The participant(s). */ Loading @@ -650,6 +653,15 @@ public abstract class Connection { } } /** * Notifies listeners of a failure in merging this connection with the background connection. */ public void onConferenceMergeFailed() { for (Listener l : mListeners) { l.onConferenceMergedFailed(); } } /** * Notifies this Connection of a request to disconnect a participant of the conference managed * by the connection. Loading
src/java/com/android/internal/telephony/SMSDispatcher.java +14 −3 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.internal.telephony; import android.annotation.Nullable; import android.app.Activity; import android.app.AlertDialog; import android.app.PendingIntent; Loading Loading @@ -354,6 +355,13 @@ public abstract class SMSDispatcher extends Handler { } } private static int getSendSmsFlag(@Nullable PendingIntent deliveryIntent) { if (deliveryIntent == null) { return 0; } return CarrierMessagingService.SEND_FLAG_REQUEST_DELIVERY_STATUS; } /** * Use the carrier messaging service to send a text SMS. */ Loading @@ -370,7 +378,8 @@ public abstract class SMSDispatcher extends Handler { if (text != null) { try { carrierMessagingService.sendTextSms(text, getSubId(), mTracker.mDestAddress, mSenderCallback); mTracker.mDestAddress, getSendSmsFlag(mTracker.mDeliveryIntent), mSenderCallback); } catch (RemoteException e) { Rlog.e(TAG, "Exception sending the SMS: " + e); mSenderCallback.onSendSmsComplete( Loading Loading @@ -402,7 +411,8 @@ public abstract class SMSDispatcher extends Handler { if (data != null) { try { carrierMessagingService.sendDataSms(data, getSubId(), mTracker.mDestAddress, destPort, mSenderCallback); mTracker.mDestAddress, destPort, getSendSmsFlag(mTracker.mDeliveryIntent), mSenderCallback); } catch (RemoteException e) { Rlog.e(TAG, "Exception sending the SMS: " + e); mSenderCallback.onSendSmsComplete( Loading Loading @@ -528,7 +538,8 @@ public abstract class SMSDispatcher extends Handler { protected void onServiceReady(ICarrierMessagingService carrierMessagingService) { try { carrierMessagingService.sendMultipartTextSms( mParts, getSubId(), mTrackers[0].mDestAddress, mSenderCallback); mParts, getSubId(), mTrackers[0].mDestAddress, getSendSmsFlag(mTrackers[0].mDeliveryIntent), mSenderCallback); } catch (RemoteException e) { Rlog.e(TAG, "Exception sending the SMS: " + e); mSenderCallback.onSendMultipartSmsComplete( Loading
src/java/com/android/internal/telephony/SmsMessageBase.java +69 −0 Original line number Diff line number Diff line Loading @@ -16,11 +16,14 @@ package com.android.internal.telephony; import com.android.internal.telephony.GsmAlphabet.TextEncodingDetails; import com.android.internal.telephony.SmsConstants; import com.android.internal.telephony.SmsHeader; import java.text.BreakIterator; import java.util.Arrays; import android.provider.Telephony; import android.telephony.SmsMessage; /** * Base class declaring the specific methods and members for SmsMessage. Loading Loading @@ -346,4 +349,70 @@ public abstract class SmsMessageBase { mIsEmail = Telephony.Mms.isEmailAddress(mEmailFrom); } /** * Find the next position to start a new fragment of a multipart SMS. * * @param currentPosition current start position of the fragment * @param byteLimit maximum number of bytes in the fragment * @param msgBody text of the SMS in UTF-16 encoding * @return the position to start the next fragment */ public static int findNextUnicodePosition( int currentPosition, int byteLimit, CharSequence msgBody) { int nextPos = Math.min(currentPosition + byteLimit / 2, msgBody.length()); // Check whether the fragment ends in a character boundary. Some characters take 4-bytes // in UTF-16 encoding. Many carriers cannot handle // a fragment correctly if it does not end at a character boundary. if (nextPos < msgBody.length()) { BreakIterator breakIterator = BreakIterator.getCharacterInstance(); breakIterator.setText(msgBody.toString()); if (!breakIterator.isBoundary(nextPos)) { nextPos = breakIterator.preceding(nextPos); } } return nextPos; } /** * Calculate the TextEncodingDetails of a message encoded in Unicode. */ public static TextEncodingDetails calcUnicodeEncodingDetails(CharSequence msgBody) { TextEncodingDetails ted = new TextEncodingDetails(); int octets = msgBody.length() * 2; ted.codeUnitSize = SmsConstants.ENCODING_16BIT; ted.codeUnitCount = msgBody.length(); if (octets > SmsConstants.MAX_USER_DATA_BYTES) { // If EMS is not supported, break down EMS into single segment SMS // and add page info " x/y". // In the case of UCS2 encoding type, we need 8 bytes for this // but we only have 6 bytes from UDH, so truncate the limit for // each segment by 2 bytes (1 char). int maxUserDataBytesWithHeader = SmsConstants.MAX_USER_DATA_BYTES_WITH_HEADER; if (!SmsMessage.hasEmsSupport()) { // make sure total number of segments is less than 10 if (octets <= 9 * (maxUserDataBytesWithHeader - 2)) { maxUserDataBytesWithHeader -= 2; } } int pos = 0; // Index in code units. int msgCount = 0; while (pos < msgBody.length()) { int nextPos = findNextUnicodePosition(pos, maxUserDataBytesWithHeader, msgBody); if (nextPos == msgBody.length()) { ted.codeUnitsRemaining = pos + maxUserDataBytesWithHeader / 2 - msgBody.length(); } pos = nextPos; msgCount++; } ted.msgCount = msgCount; } else { ted.msgCount = 1; ted.codeUnitsRemaining = (SmsConstants.MAX_USER_DATA_BYTES - octets) / 2; } return ted; } }