Loading src/java/android/telephony/SmsManager.java +48 −2 Original line number Diff line number Diff line Loading @@ -290,6 +290,13 @@ public final class SmsManager { public void sendTextMessage( String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent, true /* persistMessageForCarrierApp*/); } private void sendTextMessageInternal(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForCarrierApp) { if (TextUtils.isEmpty(destinationAddress)) { throw new IllegalArgumentException("Invalid destinationAddress"); } Loading @@ -302,12 +309,28 @@ public final class SmsManager { ISms iccISms = getISmsServiceOrThrow(); iccISms.sendTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(), destinationAddress, scAddress, text, sentIntent, deliveryIntent); scAddress, text, sentIntent, deliveryIntent, persistMessageForCarrierApp); } catch (RemoteException ex) { // ignore it } } /** * Send a text based SMS without writing it into the SMS Provider. * * <p>Only the carrier app can call this method.</p> * * @see #sendTextMessage(String, String, String, PendingIntent, PendingIntent) * @hide */ public void sendTextMessageWithoutPersisting( String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent, false /* persistMessageForCarrierApp*/); } /** * A variant of {@link SmsManager#sendTextMessage} that allows self to be the caller. This is * for internal use only. Loading Loading @@ -431,6 +454,14 @@ public final class SmsManager { public void sendMultipartTextMessage( String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) { sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, deliveryIntents, true /* persistMessageForCarrierApp*/); } private void sendMultipartTextMessageInternal( String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, boolean persistMessageForCarrierApp) { if (TextUtils.isEmpty(destinationAddress)) { throw new IllegalArgumentException("Invalid destinationAddress"); } Loading @@ -444,7 +475,7 @@ public final class SmsManager { iccISms.sendMultipartTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(), destinationAddress, scAddress, parts, sentIntents, deliveryIntents); sentIntents, deliveryIntents, persistMessageForCarrierApp); } catch (RemoteException ex) { // ignore it } Loading @@ -462,6 +493,21 @@ public final class SmsManager { } } /** * Send a multi-part text based SMS without writing it into the SMS Provider. * * <p>Only the carrier app can call this method.</p> * * @see #sendMultipartTextMessage(String, String, ArrayList, ArrayList, ArrayList) * @hide **/ public void sendMultipartTextMessageWithoutPersisting( String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) { sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, deliveryIntents, false /* persistMessageForCarrierApp*/); } /** * Send a data based SMS to a specific application port. * Loading src/java/com/android/internal/telephony/IccSmsInterfaceManager.java +27 −12 Original line number Diff line number Diff line Loading @@ -388,11 +388,13 @@ public class IccSmsInterfaceManager { * This method checks only if the calling package has the permission to send the sms. */ public void sendText(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp) { mPhone.getContext().enforceCallingPermission( Manifest.permission.SEND_SMS, "Sending SMS message"); sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessageForNonDefaultSmsApp); } /** Loading @@ -404,7 +406,8 @@ public class IccSmsInterfaceManager { mPhone.getContext().enforceCallingOrSelfPermission( Manifest.permission.SEND_SMS, "Sending SMS message"); sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, true /* persistMessageForNonDefaultSmsApp */); } /** Loading Loading @@ -433,8 +436,8 @@ public class IccSmsInterfaceManager { */ private void sendTextInternal(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp) { if (Rlog.isLoggable("SMS", Log.VERBOSE)) { log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr + " text='"+ text + "' sentIntent=" + Loading @@ -444,9 +447,13 @@ public class IccSmsInterfaceManager { callingPackage) != AppOpsManager.MODE_ALLOWED) { return; } if (!persistMessageForNonDefaultSmsApp) { // Only allow carrier app to skip auto message persistence. enforceCarrierPrivilege(); } destAddr = filterDestAddress(destAddr); mDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, null/*messageUri*/, callingPackage); null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp); } /** Loading Loading @@ -497,10 +504,14 @@ public class IccSmsInterfaceManager { public void sendMultipartText(String callingPackage, String destAddr, String scAddr, List<String> parts, List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) { List<PendingIntent> deliveryIntents, boolean persistMessageForNonDefaultSmsApp) { mPhone.getContext().enforceCallingPermission( Manifest.permission.SEND_SMS, "Sending SMS message"); if (!persistMessageForNonDefaultSmsApp) { // Only allow carrier app to skip auto message persistence. enforceCarrierPrivilege(); } if (Rlog.isLoggable("SMS", Log.VERBOSE)) { int i = 0; for (String part : parts) { Loading Loading @@ -538,14 +549,15 @@ public class IccSmsInterfaceManager { mDispatcher.sendText(destAddr, scAddr, singlePart, singleSentIntent, singleDeliveryIntent, null/*messageUri*/, callingPackage); null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp); } return; } mDispatcher.sendMultipartText(destAddr, scAddr, (ArrayList<String>) parts, (ArrayList<PendingIntent>) sentIntents, (ArrayList<PendingIntent>) deliveryIntents, null/*messageUri*/, callingPackage); null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp); } Loading Loading @@ -945,7 +957,8 @@ public class IccSmsInterfaceManager { } textAndAddress[1] = filterDestAddress(textAndAddress[1]); mDispatcher.sendText(textAndAddress[1], scAddress, textAndAddress[0], sentIntent, deliveryIntent, messageUri, callingPkg); sentIntent, deliveryIntent, messageUri, callingPkg, true /* persistMessageForNonDefaultSmsApp */); } public void sendStoredMultipartText(String callingPkg, Uri messageUri, String scAddress, Loading Loading @@ -1000,7 +1013,8 @@ public class IccSmsInterfaceManager { } mDispatcher.sendText(textAndAddress[1], scAddress, singlePart, singleSentIntent, singleDeliveryIntent, messageUri, callingPkg); singleSentIntent, singleDeliveryIntent, messageUri, callingPkg, true /* persistMessageForNonDefaultSmsApp */); } return; } Loading @@ -1012,7 +1026,8 @@ public class IccSmsInterfaceManager { (ArrayList<PendingIntent>) sentIntents, (ArrayList<PendingIntent>) deliveryIntents, messageUri, callingPkg); callingPkg, true /* persistMessageForNonDefaultSmsApp */); } private boolean isFailedOrDraft(ContentResolver resolver, Uri messageUri) { Loading src/java/com/android/internal/telephony/ImsSMSDispatcher.java +8 −6 Original line number Diff line number Diff line Loading @@ -172,13 +172,14 @@ public final class ImsSMSDispatcher extends SMSDispatcher { @Override protected void sendMultipartText(String destAddr, String scAddr, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg) { ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg, boolean persistMessage) { if (isCdmaMo()) { mCdmaDispatcher.sendMultipartText(destAddr, scAddr, parts, sentIntents, deliveryIntents, messageUri, callingPkg); parts, sentIntents, deliveryIntents, messageUri, callingPkg, persistMessage); } else { mGsmDispatcher.sendMultipartText(destAddr, scAddr, parts, sentIntents, deliveryIntents, messageUri, callingPkg); parts, sentIntents, deliveryIntents, messageUri, callingPkg, persistMessage); } } Loading @@ -197,14 +198,15 @@ public final class ImsSMSDispatcher extends SMSDispatcher { @Override protected void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, Uri messageUri, String callingPkg) { PendingIntent deliveryIntent, Uri messageUri, String callingPkg, boolean persistMessage) { Rlog.d(TAG, "sendText"); if (isCdmaMo()) { mCdmaDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, messageUri, callingPkg); text, sentIntent, deliveryIntent, messageUri, callingPkg, persistMessage); } else { mGsmDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, messageUri, callingPkg); text, sentIntent, deliveryIntent, messageUri, callingPkg, persistMessage); } } Loading src/java/com/android/internal/telephony/SMSDispatcher.java +18 −9 Original line number Diff line number Diff line Loading @@ -776,10 +776,12 @@ public abstract class SMSDispatcher extends Handler { * broadcast when the message is delivered to the recipient. The * @param messageUri optional URI of the message if it is already stored in the system * @param callingPkg the calling package name * @param persistMessage whether to save the sent message into SMS DB for a * non-default SMS app. */ protected abstract void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, Uri messageUri, String callingPkg); String callingPkg, boolean persistMessage); /** * Inject an SMS PDU into the android platform. Loading Loading @@ -829,10 +831,13 @@ public abstract class SMSDispatcher extends Handler { * to the recipient. The raw pdu of the status report is in the * @param messageUri optional URI of the message if it is already stored in the system * @param callingPkg the calling package name * @param persistMessage whether to save the sent message into SMS DB for a * non-default SMS app. */ protected void sendMultipartText(String destAddr, String scAddr, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg) { ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg, boolean persistMessage) { final String fullMessageText = getMultipartMessageText(parts); int refNumber = getNextConcatenatedRef() & 0x00FF; int msgCount = parts.size(); Loading Loading @@ -890,6 +895,7 @@ public abstract class SMSDispatcher extends Handler { getNewSubmitPduTracker(destAddr, scAddr, parts.get(i), smsHeader, encoding, sentIntent, deliveryIntent, (i == (msgCount - 1)), unsentPartCount, anyPartFailed, messageUri, fullMessageText); trackers[i].mPersistMessage = persistMessage; } if (parts == null || trackers == null || trackers.length == 0 Loading Loading @@ -1276,7 +1282,7 @@ public abstract class SMSDispatcher extends Handler { } sendMultipartText(destinationAddress, scAddress, parts, sentIntents, deliveryIntents, null/*messageUri*/, null/*callingPkg*/); null/*messageUri*/, null/*callingPkg*/, tracker.mPersistMessage); } /** Loading Loading @@ -1315,11 +1321,13 @@ public abstract class SMSDispatcher extends Handler { // If this is a text message (instead of data message) private boolean mIsText; private boolean mPersistMessage; private SmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, PackageInfo appInfo, String destAddr, String format, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, int subId, boolean isText) { boolean isText, boolean persistMessage) { mData = data; mSentIntent = sentIntent; mDeliveryIntent = deliveryIntent; Loading @@ -1337,6 +1345,7 @@ public abstract class SMSDispatcher extends Handler { mFullMessageText = fullMessageText; mSubId = subId; mIsText = isText; mPersistMessage = persistMessage; } /** Loading Loading @@ -1397,7 +1406,7 @@ public abstract class SMSDispatcher extends Handler { * @return The telephony provider URI if stored */ private Uri persistSentMessageIfRequired(Context context, int messageType, int errorCode) { if (!mIsText || if (!mIsText || !mPersistMessage || !SmsApplication.shouldWriteMessageForPackage(mAppInfo.packageName, context)) { return null; } Loading Loading @@ -1540,7 +1549,7 @@ public abstract class SMSDispatcher extends Handler { protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, String format, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, boolean isText) { boolean isExpectMore, String fullMessageText, boolean isText, boolean persistMessage) { // Get calling app package name via UID from Binder call PackageManager pm = mContext.getPackageManager(); String[] packageNames = pm.getPackagesForUid(Binder.getCallingUid()); Loading @@ -1560,15 +1569,15 @@ public abstract class SMSDispatcher extends Handler { String destAddr = PhoneNumberUtils.extractNetworkPortion((String) data.get("destAddr")); return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format, unsentPartCount, anyPartFailed, messageUri, smsHeader, isExpectMore, fullMessageText, getSubId(), isText); fullMessageText, getSubId(), isText, persistMessage); } protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, String format, Uri messageUri, boolean isExpectMore, String fullMessageText, boolean isText) { String fullMessageText, boolean isText, boolean persistMessage) { return getSmsTracker(data, sentIntent, deliveryIntent, format, null/*unsentPartCount*/, null/*anyPartFailed*/, messageUri, null/*smsHeader*/, isExpectMore, fullMessageText, isText); fullMessageText, isText, persistMessage); } protected HashMap<String, Object> getSmsTrackerMap(String destAddr, String scAddr, Loading src/java/com/android/internal/telephony/UiccSmsController.java +8 −6 Original line number Diff line number Diff line Loading @@ -124,16 +124,17 @@ public class UiccSmsController extends ISms.Stub { public void sendText(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendTextForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); text, sentIntent, deliveryIntent, true /* persistMessageForNonDefaultSmsApp*/); } @Override public void sendTextForSubscriber(int subId, String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendText(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); deliveryIntent, persistMessageForNonDefaultSmsApp); } else { Rlog.e(LOG_TAG,"sendTextForSubscriber iccSmsIntMgr is null for" + " Subscription: " + subId); Loading @@ -158,18 +159,19 @@ public class UiccSmsController extends ISms.Stub { List<String> parts, List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) throws android.os.RemoteException { sendMultipartTextForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr, parts, sentIntents, deliveryIntents); scAddr, parts, sentIntents, deliveryIntents, true /* persistMessageForNonDefaultSmsApp */); } @Override public void sendMultipartTextForSubscriber(int subId, String callingPackage, String destAddr, String scAddr, List<String> parts, List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) List<PendingIntent> deliveryIntents, boolean persistMessageForNonDefaultSmsApp) throws android.os.RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { iccSmsIntMgr.sendMultipartText(callingPackage, destAddr, scAddr, parts, sentIntents, deliveryIntents); deliveryIntents, persistMessageForNonDefaultSmsApp); } else { Rlog.e(LOG_TAG,"sendMultipartTextForSubscriber iccSmsIntMgr is null for" + " Subscription: " + subId); Loading Loading
src/java/android/telephony/SmsManager.java +48 −2 Original line number Diff line number Diff line Loading @@ -290,6 +290,13 @@ public final class SmsManager { public void sendTextMessage( String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent, true /* persistMessageForCarrierApp*/); } private void sendTextMessageInternal(String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForCarrierApp) { if (TextUtils.isEmpty(destinationAddress)) { throw new IllegalArgumentException("Invalid destinationAddress"); } Loading @@ -302,12 +309,28 @@ public final class SmsManager { ISms iccISms = getISmsServiceOrThrow(); iccISms.sendTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(), destinationAddress, scAddress, text, sentIntent, deliveryIntent); scAddress, text, sentIntent, deliveryIntent, persistMessageForCarrierApp); } catch (RemoteException ex) { // ignore it } } /** * Send a text based SMS without writing it into the SMS Provider. * * <p>Only the carrier app can call this method.</p> * * @see #sendTextMessage(String, String, String, PendingIntent, PendingIntent) * @hide */ public void sendTextMessageWithoutPersisting( String destinationAddress, String scAddress, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendTextMessageInternal(destinationAddress, scAddress, text, sentIntent, deliveryIntent, false /* persistMessageForCarrierApp*/); } /** * A variant of {@link SmsManager#sendTextMessage} that allows self to be the caller. This is * for internal use only. Loading Loading @@ -431,6 +454,14 @@ public final class SmsManager { public void sendMultipartTextMessage( String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) { sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, deliveryIntents, true /* persistMessageForCarrierApp*/); } private void sendMultipartTextMessageInternal( String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, boolean persistMessageForCarrierApp) { if (TextUtils.isEmpty(destinationAddress)) { throw new IllegalArgumentException("Invalid destinationAddress"); } Loading @@ -444,7 +475,7 @@ public final class SmsManager { iccISms.sendMultipartTextForSubscriber(getSubscriptionId(), ActivityThread.currentPackageName(), destinationAddress, scAddress, parts, sentIntents, deliveryIntents); sentIntents, deliveryIntents, persistMessageForCarrierApp); } catch (RemoteException ex) { // ignore it } Loading @@ -462,6 +493,21 @@ public final class SmsManager { } } /** * Send a multi-part text based SMS without writing it into the SMS Provider. * * <p>Only the carrier app can call this method.</p> * * @see #sendMultipartTextMessage(String, String, ArrayList, ArrayList, ArrayList) * @hide **/ public void sendMultipartTextMessageWithoutPersisting( String destinationAddress, String scAddress, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) { sendMultipartTextMessageInternal(destinationAddress, scAddress, parts, sentIntents, deliveryIntents, false /* persistMessageForCarrierApp*/); } /** * Send a data based SMS to a specific application port. * Loading
src/java/com/android/internal/telephony/IccSmsInterfaceManager.java +27 −12 Original line number Diff line number Diff line Loading @@ -388,11 +388,13 @@ public class IccSmsInterfaceManager { * This method checks only if the calling package has the permission to send the sms. */ public void sendText(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp) { mPhone.getContext().enforceCallingPermission( Manifest.permission.SEND_SMS, "Sending SMS message"); sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessageForNonDefaultSmsApp); } /** Loading @@ -404,7 +406,8 @@ public class IccSmsInterfaceManager { mPhone.getContext().enforceCallingOrSelfPermission( Manifest.permission.SEND_SMS, "Sending SMS message"); sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, true /* persistMessageForNonDefaultSmsApp */); } /** Loading Loading @@ -433,8 +436,8 @@ public class IccSmsInterfaceManager { */ private void sendTextInternal(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp) { if (Rlog.isLoggable("SMS", Log.VERBOSE)) { log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr + " text='"+ text + "' sentIntent=" + Loading @@ -444,9 +447,13 @@ public class IccSmsInterfaceManager { callingPackage) != AppOpsManager.MODE_ALLOWED) { return; } if (!persistMessageForNonDefaultSmsApp) { // Only allow carrier app to skip auto message persistence. enforceCarrierPrivilege(); } destAddr = filterDestAddress(destAddr); mDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, null/*messageUri*/, callingPackage); null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp); } /** Loading Loading @@ -497,10 +504,14 @@ public class IccSmsInterfaceManager { public void sendMultipartText(String callingPackage, String destAddr, String scAddr, List<String> parts, List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) { List<PendingIntent> deliveryIntents, boolean persistMessageForNonDefaultSmsApp) { mPhone.getContext().enforceCallingPermission( Manifest.permission.SEND_SMS, "Sending SMS message"); if (!persistMessageForNonDefaultSmsApp) { // Only allow carrier app to skip auto message persistence. enforceCarrierPrivilege(); } if (Rlog.isLoggable("SMS", Log.VERBOSE)) { int i = 0; for (String part : parts) { Loading Loading @@ -538,14 +549,15 @@ public class IccSmsInterfaceManager { mDispatcher.sendText(destAddr, scAddr, singlePart, singleSentIntent, singleDeliveryIntent, null/*messageUri*/, callingPackage); null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp); } return; } mDispatcher.sendMultipartText(destAddr, scAddr, (ArrayList<String>) parts, (ArrayList<PendingIntent>) sentIntents, (ArrayList<PendingIntent>) deliveryIntents, null/*messageUri*/, callingPackage); null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp); } Loading Loading @@ -945,7 +957,8 @@ public class IccSmsInterfaceManager { } textAndAddress[1] = filterDestAddress(textAndAddress[1]); mDispatcher.sendText(textAndAddress[1], scAddress, textAndAddress[0], sentIntent, deliveryIntent, messageUri, callingPkg); sentIntent, deliveryIntent, messageUri, callingPkg, true /* persistMessageForNonDefaultSmsApp */); } public void sendStoredMultipartText(String callingPkg, Uri messageUri, String scAddress, Loading Loading @@ -1000,7 +1013,8 @@ public class IccSmsInterfaceManager { } mDispatcher.sendText(textAndAddress[1], scAddress, singlePart, singleSentIntent, singleDeliveryIntent, messageUri, callingPkg); singleSentIntent, singleDeliveryIntent, messageUri, callingPkg, true /* persistMessageForNonDefaultSmsApp */); } return; } Loading @@ -1012,7 +1026,8 @@ public class IccSmsInterfaceManager { (ArrayList<PendingIntent>) sentIntents, (ArrayList<PendingIntent>) deliveryIntents, messageUri, callingPkg); callingPkg, true /* persistMessageForNonDefaultSmsApp */); } private boolean isFailedOrDraft(ContentResolver resolver, Uri messageUri) { Loading
src/java/com/android/internal/telephony/ImsSMSDispatcher.java +8 −6 Original line number Diff line number Diff line Loading @@ -172,13 +172,14 @@ public final class ImsSMSDispatcher extends SMSDispatcher { @Override protected void sendMultipartText(String destAddr, String scAddr, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg) { ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg, boolean persistMessage) { if (isCdmaMo()) { mCdmaDispatcher.sendMultipartText(destAddr, scAddr, parts, sentIntents, deliveryIntents, messageUri, callingPkg); parts, sentIntents, deliveryIntents, messageUri, callingPkg, persistMessage); } else { mGsmDispatcher.sendMultipartText(destAddr, scAddr, parts, sentIntents, deliveryIntents, messageUri, callingPkg); parts, sentIntents, deliveryIntents, messageUri, callingPkg, persistMessage); } } Loading @@ -197,14 +198,15 @@ public final class ImsSMSDispatcher extends SMSDispatcher { @Override protected void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, Uri messageUri, String callingPkg) { PendingIntent deliveryIntent, Uri messageUri, String callingPkg, boolean persistMessage) { Rlog.d(TAG, "sendText"); if (isCdmaMo()) { mCdmaDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, messageUri, callingPkg); text, sentIntent, deliveryIntent, messageUri, callingPkg, persistMessage); } else { mGsmDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, messageUri, callingPkg); text, sentIntent, deliveryIntent, messageUri, callingPkg, persistMessage); } } Loading
src/java/com/android/internal/telephony/SMSDispatcher.java +18 −9 Original line number Diff line number Diff line Loading @@ -776,10 +776,12 @@ public abstract class SMSDispatcher extends Handler { * broadcast when the message is delivered to the recipient. The * @param messageUri optional URI of the message if it is already stored in the system * @param callingPkg the calling package name * @param persistMessage whether to save the sent message into SMS DB for a * non-default SMS app. */ protected abstract void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, Uri messageUri, String callingPkg); String callingPkg, boolean persistMessage); /** * Inject an SMS PDU into the android platform. Loading Loading @@ -829,10 +831,13 @@ public abstract class SMSDispatcher extends Handler { * to the recipient. The raw pdu of the status report is in the * @param messageUri optional URI of the message if it is already stored in the system * @param callingPkg the calling package name * @param persistMessage whether to save the sent message into SMS DB for a * non-default SMS app. */ protected void sendMultipartText(String destAddr, String scAddr, ArrayList<String> parts, ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg) { ArrayList<PendingIntent> deliveryIntents, Uri messageUri, String callingPkg, boolean persistMessage) { final String fullMessageText = getMultipartMessageText(parts); int refNumber = getNextConcatenatedRef() & 0x00FF; int msgCount = parts.size(); Loading Loading @@ -890,6 +895,7 @@ public abstract class SMSDispatcher extends Handler { getNewSubmitPduTracker(destAddr, scAddr, parts.get(i), smsHeader, encoding, sentIntent, deliveryIntent, (i == (msgCount - 1)), unsentPartCount, anyPartFailed, messageUri, fullMessageText); trackers[i].mPersistMessage = persistMessage; } if (parts == null || trackers == null || trackers.length == 0 Loading Loading @@ -1276,7 +1282,7 @@ public abstract class SMSDispatcher extends Handler { } sendMultipartText(destinationAddress, scAddress, parts, sentIntents, deliveryIntents, null/*messageUri*/, null/*callingPkg*/); null/*messageUri*/, null/*callingPkg*/, tracker.mPersistMessage); } /** Loading Loading @@ -1315,11 +1321,13 @@ public abstract class SMSDispatcher extends Handler { // If this is a text message (instead of data message) private boolean mIsText; private boolean mPersistMessage; private SmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, PackageInfo appInfo, String destAddr, String format, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, int subId, boolean isText) { boolean isText, boolean persistMessage) { mData = data; mSentIntent = sentIntent; mDeliveryIntent = deliveryIntent; Loading @@ -1337,6 +1345,7 @@ public abstract class SMSDispatcher extends Handler { mFullMessageText = fullMessageText; mSubId = subId; mIsText = isText; mPersistMessage = persistMessage; } /** Loading Loading @@ -1397,7 +1406,7 @@ public abstract class SMSDispatcher extends Handler { * @return The telephony provider URI if stored */ private Uri persistSentMessageIfRequired(Context context, int messageType, int errorCode) { if (!mIsText || if (!mIsText || !mPersistMessage || !SmsApplication.shouldWriteMessageForPackage(mAppInfo.packageName, context)) { return null; } Loading Loading @@ -1540,7 +1549,7 @@ public abstract class SMSDispatcher extends Handler { protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, String format, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, boolean isText) { boolean isExpectMore, String fullMessageText, boolean isText, boolean persistMessage) { // Get calling app package name via UID from Binder call PackageManager pm = mContext.getPackageManager(); String[] packageNames = pm.getPackagesForUid(Binder.getCallingUid()); Loading @@ -1560,15 +1569,15 @@ public abstract class SMSDispatcher extends Handler { String destAddr = PhoneNumberUtils.extractNetworkPortion((String) data.get("destAddr")); return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format, unsentPartCount, anyPartFailed, messageUri, smsHeader, isExpectMore, fullMessageText, getSubId(), isText); fullMessageText, getSubId(), isText, persistMessage); } protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, String format, Uri messageUri, boolean isExpectMore, String fullMessageText, boolean isText) { String fullMessageText, boolean isText, boolean persistMessage) { return getSmsTracker(data, sentIntent, deliveryIntent, format, null/*unsentPartCount*/, null/*anyPartFailed*/, messageUri, null/*smsHeader*/, isExpectMore, fullMessageText, isText); fullMessageText, isText, persistMessage); } protected HashMap<String, Object> getSmsTrackerMap(String destAddr, String scAddr, Loading
src/java/com/android/internal/telephony/UiccSmsController.java +8 −6 Original line number Diff line number Diff line Loading @@ -124,16 +124,17 @@ public class UiccSmsController extends ISms.Stub { public void sendText(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendTextForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); text, sentIntent, deliveryIntent, true /* persistMessageForNonDefaultSmsApp*/); } @Override public void sendTextForSubscriber(int subId, String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent) { String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendText(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent); deliveryIntent, persistMessageForNonDefaultSmsApp); } else { Rlog.e(LOG_TAG,"sendTextForSubscriber iccSmsIntMgr is null for" + " Subscription: " + subId); Loading @@ -158,18 +159,19 @@ public class UiccSmsController extends ISms.Stub { List<String> parts, List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) throws android.os.RemoteException { sendMultipartTextForSubscriber(getPreferredSmsSubscription(), callingPackage, destAddr, scAddr, parts, sentIntents, deliveryIntents); scAddr, parts, sentIntents, deliveryIntents, true /* persistMessageForNonDefaultSmsApp */); } @Override public void sendMultipartTextForSubscriber(int subId, String callingPackage, String destAddr, String scAddr, List<String> parts, List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) List<PendingIntent> deliveryIntents, boolean persistMessageForNonDefaultSmsApp) throws android.os.RemoteException { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null ) { iccSmsIntMgr.sendMultipartText(callingPackage, destAddr, scAddr, parts, sentIntents, deliveryIntents); deliveryIntents, persistMessageForNonDefaultSmsApp); } else { Rlog.e(LOG_TAG,"sendMultipartTextForSubscriber iccSmsIntMgr is null for" + " Subscription: " + subId); Loading