Loading src/java/com/android/internal/telephony/IccSmsInterfaceManager.java +29 −27 Original line number Diff line number Diff line Loading @@ -343,13 +343,14 @@ public class IccSmsInterfaceManager { * This method checks if the calling package or itself has the permission to send the data sms. */ public void sendDataWithSelfPermissions(String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) { if (!mSmsPermissions.checkCallingOrSelfCanSendSms(callingPackage, "Sending SMS message")) { returnUnspecifiedFailure(sentIntent); return; } sendDataInternal(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); deliveryIntent, isForVvm); } /** Loading @@ -364,7 +365,7 @@ public class IccSmsInterfaceManager { return; } sendDataInternal(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); deliveryIntent, false /* isForVvm */); } /** Loading Loading @@ -395,15 +396,16 @@ public class IccSmsInterfaceManager { */ private void sendDataInternal(String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) { if (Rlog.isLoggable("SMS", Log.VERBOSE)) { log("sendData: destAddr=" + destAddr + " scAddr=" + scAddr + " destPort=" + destPort + " data='"+ HexDump.toHexString(data) + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent); log("sendData: destAddr=" + destAddr + " scAddr=" + scAddr + " destPort=" + destPort + " data='" + HexDump.toHexString(data) + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent + " isForVVM=" + isForVvm); } destAddr = filterDestAddress(destAddr); mDispatchersController.sendData(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); sentIntent, deliveryIntent, isForVvm); } /** Loading @@ -416,7 +418,7 @@ public class IccSmsInterfaceManager { boolean persistMessageForNonDefaultSmsApp) { sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessageForNonDefaultSmsApp, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED, false /* isForVvm */); } /** Loading @@ -425,14 +427,14 @@ public class IccSmsInterfaceManager { */ public void sendTextWithSelfPermissions(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage) { boolean persistMessage, boolean isForVvm) { if (!mSmsPermissions.checkCallingOrSelfCanSendSms(callingPackage, "Sending SMS message")) { returnUnspecifiedFailure(sentIntent); return; } sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessage, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); SMS_MESSAGE_PERIOD_NOT_SPECIFIED, isForVvm); } /** Loading Loading @@ -484,18 +486,17 @@ public class IccSmsInterfaceManager { private void sendTextInternal(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp, int priority, boolean expectMore, int validityPeriod) { int validityPeriod, boolean isForVvm) { if (Rlog.isLoggable("SMS", Log.VERBOSE)) { log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr + " text='"+ text + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent + " priority=" + priority + " expectMore=" + expectMore + " validityPeriod=" + validityPeriod); log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr + " text='" + text + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent + " priority=" + priority + " expectMore=" + expectMore + " validityPeriod=" + validityPeriod + " isForVVM=" + isForVvm); } destAddr = filterDestAddress(destAddr); mDispatchersController.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod); priority, expectMore, validityPeriod, isForVvm); } /** Loading Loading @@ -553,7 +554,8 @@ public class IccSmsInterfaceManager { return; } sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod); persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod, false /* isForVvm */); } /** Loading Loading @@ -714,11 +716,10 @@ public class IccSmsInterfaceManager { singleDeliveryIntent = deliveryIntents.get(i); } mDispatchersController.sendText(destAddr, scAddr, singlePart, singleSentIntent, singleDeliveryIntent, null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod); mDispatchersController.sendText(destAddr, scAddr, singlePart, singleSentIntent, singleDeliveryIntent, null /* messageUri */, callingPackage, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod, false /* isForVvm */); } return; } Loading Loading @@ -1151,7 +1152,7 @@ public class IccSmsInterfaceManager { mDispatchersController.sendText(textAndAddress[1], scAddress, textAndAddress[0], sentIntent, deliveryIntent, messageUri, callingPkg, true /* persistMessageForNonDefaultSmsApp */, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED, false /* isForVvm */); } @UnsupportedAppUsage Loading Loading @@ -1208,7 +1209,8 @@ public class IccSmsInterfaceManager { singleSentIntent, singleDeliveryIntent, messageUri, callingPkg, true /* persistMessageForNonDefaultSmsApp */, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED, false /* isForVvm */); } return; } Loading src/java/com/android/internal/telephony/PhoneFactory.java +12 −0 Original line number Diff line number Diff line Loading @@ -461,6 +461,18 @@ public class PhoneFactory { sSubInfoRecordUpdater.requestEmbeddedSubscriptionInfoListRefresh(cardId, callback); } /** * Get a the SmsController. */ public static SmsController getSmsController() { synchronized (sLockProxyPhones) { if (!sMadeDefaults) { throw new IllegalStateException("Default phones haven't been made yet!"); } return sProxyController.getSmsController(); } } /** * Adds a local log category. * Loading src/java/com/android/internal/telephony/ProxyController.java +8 −0 Original line number Diff line number Diff line Loading @@ -246,6 +246,14 @@ public class ProxyController { return doSetRadioCapabilities(rafs); } /** * Get the SmsController. * @return the SmsController object. */ public SmsController getSmsController() { return mSmsController; } private boolean doSetRadioCapabilities(RadioAccessFamily[] rafs) { // A new sessionId for this transaction mRadioCapabilitySessionId = mUniqueIdGenerator.getAndIncrement(); Loading src/java/com/android/internal/telephony/SMSDispatcher.java +19 −14 Original line number Diff line number Diff line Loading @@ -792,7 +792,7 @@ public abstract class SMSDispatcher extends Handler { * raw pdu of the status report is in the extended data ("pdu"). */ protected void sendData(String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) { SmsMessageBase.SubmitPduBase pdu = getSubmitPdu( scAddr, destAddr, destPort, data, (deliveryIntent != null)); if (pdu != null) { Loading @@ -800,7 +800,7 @@ public abstract class SMSDispatcher extends Handler { SmsTracker tracker = getSmsTracker(callingPackage, map, sentIntent, deliveryIntent, getFormat(), null /*messageUri*/, false /*expectMore*/, null /*fullMessageText*/, false /*isText*/, true /*persistMessage*/); true /*persistMessage*/, isForVvm); if (!sendSmsByCarrierApp(true /* isDataSms */, tracker)) { sendSubmitPdu(tracker); Loading Loading @@ -859,7 +859,7 @@ public abstract class SMSDispatcher extends Handler { public void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, Uri messageUri, String callingPkg, boolean persistMessage, int priority, boolean expectMore, int validityPeriod) { boolean expectMore, int validityPeriod, boolean isForVvm) { Rlog.d(TAG, "sendText"); SmsMessageBase.SubmitPduBase pdu = getSubmitPdu( scAddr, destAddr, text, (deliveryIntent != null), null, priority, validityPeriod); Loading @@ -867,7 +867,7 @@ public abstract class SMSDispatcher extends Handler { HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu); SmsTracker tracker = getSmsTracker(callingPkg, map, sentIntent, deliveryIntent, getFormat(), messageUri, expectMore, text, true /*isText*/, persistMessage, priority, validityPeriod); persistMessage, priority, validityPeriod, isForVvm); if (!sendSmsByCarrierApp(false /* isDataSms */, tracker)) { sendSubmitPdu(tracker); Loading Loading @@ -1103,7 +1103,7 @@ public abstract class SMSDispatcher extends Handler { return getSmsTracker(callingPackage, map, sentIntent, deliveryIntent, getFormat(), unsentPartCount, anyPartFailed, messageUri, smsHeader, (!lastPart || expectMore), fullMessageText, true /*isText*/, true /*persistMessage*/, priority, validityPeriod); true /*persistMessage*/, priority, validityPeriod, false /* isForVvm */); } else { Rlog.e(TAG, "CdmaSMSDispatcher.getNewSubmitPduTracker(): getSubmitPdu() returned " + "null"); Loading @@ -1121,7 +1121,7 @@ public abstract class SMSDispatcher extends Handler { return getSmsTracker(callingPackage, map, sentIntent, deliveryIntent, getFormat(), unsentPartCount, anyPartFailed, messageUri, smsHeader, (!lastPart || expectMore), fullMessageText, true /*isText*/, false /*persistMessage*/, priority, validityPeriod); false /*persistMessage*/, priority, validityPeriod, false /* isForVvm */); } else { Rlog.e(TAG, "GsmSMSDispatcher.getNewSubmitPduTracker(): getSubmitPdu() returned " + "null"); Loading Loading @@ -1211,7 +1211,7 @@ public abstract class SMSDispatcher extends Handler { */ boolean checkDestination(SmsTracker tracker) { if (mContext.checkCallingOrSelfPermission(SEND_SMS_NO_CONFIRMATION) == PackageManager.PERMISSION_GRANTED) { == PackageManager.PERMISSION_GRANTED || tracker.mIsForVvm) { return true; // app is pre-approved to send to short codes } else { int rule = mPremiumSmsRule.get(); Loading Loading @@ -1532,12 +1532,14 @@ public abstract class SMSDispatcher extends Handler { // User who sends the SMS. private final @UserIdInt int mUserId; private final boolean mIsForVvm; 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 expectMore, String fullMessageText, int subId, boolean isText, boolean persistMessage, int userId, int priority, int validityPeriod) { int validityPeriod, boolean isForVvm) { mData = data; mSentIntent = sentIntent; mDeliveryIntent = deliveryIntent; Loading @@ -1560,6 +1562,7 @@ public abstract class SMSDispatcher extends Handler { mUserId = userId; mPriority = priority; mValidityPeriod = validityPeriod; mIsForVvm = isForVvm; } /** Loading Loading @@ -1780,7 +1783,7 @@ public abstract class SMSDispatcher extends Handler { PendingIntent sentIntent, PendingIntent deliveryIntent, String format, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader, boolean expectMore, String fullMessageText, boolean isText, boolean persistMessage, int priority, int validityPeriod) { boolean persistMessage, int priority, int validityPeriod, boolean isForVvm) { // Get calling app package name via UID from Binder call PackageManager pm = mContext.getPackageManager(); Loading @@ -1799,25 +1802,27 @@ public abstract class SMSDispatcher extends Handler { return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format, unsentPartCount, anyPartFailed, messageUri, smsHeader, expectMore, fullMessageText, getSubId(), isText, persistMessage, userId, priority, validityPeriod); validityPeriod, isForVvm); } protected SmsTracker getSmsTracker(String callingPackage, HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, String format, Uri messageUri, boolean expectMore, String fullMessageText, boolean isText, boolean persistMessage) { boolean expectMore, String fullMessageText, boolean isText, boolean persistMessage, boolean isForVvm) { return getSmsTracker(callingPackage, data, sentIntent, deliveryIntent, format, null/*unsentPartCount*/, null/*anyPartFailed*/, messageUri, null/*smsHeader*/, expectMore, fullMessageText, isText, persistMessage, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, SMS_MESSAGE_PERIOD_NOT_SPECIFIED, isForVvm); } protected SmsTracker getSmsTracker(String callingPackage, HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, String format, Uri messageUri, boolean expectMore, String fullMessageText, boolean isText, boolean persistMessage, int priority, int validityPeriod) { int priority, int validityPeriod, boolean isForVvm) { return getSmsTracker(callingPackage, data, sentIntent, deliveryIntent, format, null/*unsentPartCount*/, null/*anyPartFailed*/, messageUri, null/*smsHeader*/, expectMore, fullMessageText, isText, persistMessage, priority, validityPeriod); expectMore, fullMessageText, isText, persistMessage, priority, validityPeriod, isForVvm); } protected HashMap<String, Object> getSmsTrackerMap(String destAddr, String scAddr, Loading src/java/com/android/internal/telephony/SmsController.java +33 −3 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import com.android.internal.util.IndentingPrintWriter; import java.io.FileDescriptor; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.List; /** Loading Loading @@ -134,11 +135,17 @@ public class SmsController extends ISmsImplBase { public void sendDataForSubscriberWithSelfPermissions(int subId, String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendDataForSubscriberWithSelfPermissionsInternal(subId, callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent, false /* isForVvm */); } private void sendDataForSubscriberWithSelfPermissionsInternal(int subId, String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendDataWithSelfPermissions(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); data, sentIntent, deliveryIntent, isForVvm); } else { Rlog.e(LOG_TAG, "sendText iccSmsIntMgr is null for" + " Subscription: " + subId); Loading Loading @@ -200,10 +207,17 @@ public class SmsController extends ISmsImplBase { public void sendTextForSubscriberWithSelfPermissions(int subId, String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage) { sendTextForSubscriberWithSelfPermissionsInternal(subId, callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessage, false /* isForVvm */); } private void sendTextForSubscriberWithSelfPermissionsInternal(int subId, String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage, boolean isForVvm) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendTextWithSelfPermissions(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessage); sentIntent, deliveryIntent, persistMessage, isForVvm); } else { Rlog.e(LOG_TAG, "sendText iccSmsIntMgr is null for" + " Subscription: " + subId); Loading Loading @@ -460,6 +474,22 @@ public class SmsController extends ISmsImplBase { return getPhone(subId).getAppSmsManager().createAppSpecificSmsToken(callingPkg, intent); } /** * Internal API to send visual voicemail related SMS. This is not exposed outside the phone * process, and should be called only after verifying that the caller is the default VVM app. */ public void sendVisualVoicemailSmsForSubscriber(String callingPackage, int subId, String number, int port, String text, PendingIntent sentIntent) { if (port == 0) { sendTextForSubscriberWithSelfPermissionsInternal(subId, callingPackage, number, null, text, sentIntent, null, false, true /* isForVvm */); } else { byte[] data = text.getBytes(StandardCharsets.UTF_8); sendDataForSubscriberWithSelfPermissionsInternal(subId, callingPackage, number, null, (short) port, data, sentIntent, null, true /* isForVvm */); } } @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!checkDumpPermission(mContext, LOG_TAG, pw)) { Loading Loading
src/java/com/android/internal/telephony/IccSmsInterfaceManager.java +29 −27 Original line number Diff line number Diff line Loading @@ -343,13 +343,14 @@ public class IccSmsInterfaceManager { * This method checks if the calling package or itself has the permission to send the data sms. */ public void sendDataWithSelfPermissions(String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) { if (!mSmsPermissions.checkCallingOrSelfCanSendSms(callingPackage, "Sending SMS message")) { returnUnspecifiedFailure(sentIntent); return; } sendDataInternal(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); deliveryIntent, isForVvm); } /** Loading @@ -364,7 +365,7 @@ public class IccSmsInterfaceManager { return; } sendDataInternal(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); deliveryIntent, false /* isForVvm */); } /** Loading Loading @@ -395,15 +396,16 @@ public class IccSmsInterfaceManager { */ private void sendDataInternal(String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) { if (Rlog.isLoggable("SMS", Log.VERBOSE)) { log("sendData: destAddr=" + destAddr + " scAddr=" + scAddr + " destPort=" + destPort + " data='"+ HexDump.toHexString(data) + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent); log("sendData: destAddr=" + destAddr + " scAddr=" + scAddr + " destPort=" + destPort + " data='" + HexDump.toHexString(data) + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent + " isForVVM=" + isForVvm); } destAddr = filterDestAddress(destAddr); mDispatchersController.sendData(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); sentIntent, deliveryIntent, isForVvm); } /** Loading @@ -416,7 +418,7 @@ public class IccSmsInterfaceManager { boolean persistMessageForNonDefaultSmsApp) { sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessageForNonDefaultSmsApp, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED, false /* isForVvm */); } /** Loading @@ -425,14 +427,14 @@ public class IccSmsInterfaceManager { */ public void sendTextWithSelfPermissions(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage) { boolean persistMessage, boolean isForVvm) { if (!mSmsPermissions.checkCallingOrSelfCanSendSms(callingPackage, "Sending SMS message")) { returnUnspecifiedFailure(sentIntent); return; } sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessage, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); SMS_MESSAGE_PERIOD_NOT_SPECIFIED, isForVvm); } /** Loading Loading @@ -484,18 +486,17 @@ public class IccSmsInterfaceManager { private void sendTextInternal(String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessageForNonDefaultSmsApp, int priority, boolean expectMore, int validityPeriod) { int validityPeriod, boolean isForVvm) { if (Rlog.isLoggable("SMS", Log.VERBOSE)) { log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr + " text='"+ text + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent + " priority=" + priority + " expectMore=" + expectMore + " validityPeriod=" + validityPeriod); log("sendText: destAddr=" + destAddr + " scAddr=" + scAddr + " text='" + text + "' sentIntent=" + sentIntent + " deliveryIntent=" + deliveryIntent + " priority=" + priority + " expectMore=" + expectMore + " validityPeriod=" + validityPeriod + " isForVVM=" + isForVvm); } destAddr = filterDestAddress(destAddr); mDispatchersController.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent, null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod); priority, expectMore, validityPeriod, isForVvm); } /** Loading Loading @@ -553,7 +554,8 @@ public class IccSmsInterfaceManager { return; } sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod); persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod, false /* isForVvm */); } /** Loading Loading @@ -714,11 +716,10 @@ public class IccSmsInterfaceManager { singleDeliveryIntent = deliveryIntents.get(i); } mDispatchersController.sendText(destAddr, scAddr, singlePart, singleSentIntent, singleDeliveryIntent, null/*messageUri*/, callingPackage, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod); mDispatchersController.sendText(destAddr, scAddr, singlePart, singleSentIntent, singleDeliveryIntent, null /* messageUri */, callingPackage, persistMessageForNonDefaultSmsApp, priority, expectMore, validityPeriod, false /* isForVvm */); } return; } Loading Loading @@ -1151,7 +1152,7 @@ public class IccSmsInterfaceManager { mDispatchersController.sendText(textAndAddress[1], scAddress, textAndAddress[0], sentIntent, deliveryIntent, messageUri, callingPkg, true /* persistMessageForNonDefaultSmsApp */, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED, false /* isForVvm */); } @UnsupportedAppUsage Loading Loading @@ -1208,7 +1209,8 @@ public class IccSmsInterfaceManager { singleSentIntent, singleDeliveryIntent, messageUri, callingPkg, true /* persistMessageForNonDefaultSmsApp */, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); false /* expectMore */, SMS_MESSAGE_PERIOD_NOT_SPECIFIED, false /* isForVvm */); } return; } Loading
src/java/com/android/internal/telephony/PhoneFactory.java +12 −0 Original line number Diff line number Diff line Loading @@ -461,6 +461,18 @@ public class PhoneFactory { sSubInfoRecordUpdater.requestEmbeddedSubscriptionInfoListRefresh(cardId, callback); } /** * Get a the SmsController. */ public static SmsController getSmsController() { synchronized (sLockProxyPhones) { if (!sMadeDefaults) { throw new IllegalStateException("Default phones haven't been made yet!"); } return sProxyController.getSmsController(); } } /** * Adds a local log category. * Loading
src/java/com/android/internal/telephony/ProxyController.java +8 −0 Original line number Diff line number Diff line Loading @@ -246,6 +246,14 @@ public class ProxyController { return doSetRadioCapabilities(rafs); } /** * Get the SmsController. * @return the SmsController object. */ public SmsController getSmsController() { return mSmsController; } private boolean doSetRadioCapabilities(RadioAccessFamily[] rafs) { // A new sessionId for this transaction mRadioCapabilitySessionId = mUniqueIdGenerator.getAndIncrement(); Loading
src/java/com/android/internal/telephony/SMSDispatcher.java +19 −14 Original line number Diff line number Diff line Loading @@ -792,7 +792,7 @@ public abstract class SMSDispatcher extends Handler { * raw pdu of the status report is in the extended data ("pdu"). */ protected void sendData(String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) { SmsMessageBase.SubmitPduBase pdu = getSubmitPdu( scAddr, destAddr, destPort, data, (deliveryIntent != null)); if (pdu != null) { Loading @@ -800,7 +800,7 @@ public abstract class SMSDispatcher extends Handler { SmsTracker tracker = getSmsTracker(callingPackage, map, sentIntent, deliveryIntent, getFormat(), null /*messageUri*/, false /*expectMore*/, null /*fullMessageText*/, false /*isText*/, true /*persistMessage*/); true /*persistMessage*/, isForVvm); if (!sendSmsByCarrierApp(true /* isDataSms */, tracker)) { sendSubmitPdu(tracker); Loading Loading @@ -859,7 +859,7 @@ public abstract class SMSDispatcher extends Handler { public void sendText(String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, Uri messageUri, String callingPkg, boolean persistMessage, int priority, boolean expectMore, int validityPeriod) { boolean expectMore, int validityPeriod, boolean isForVvm) { Rlog.d(TAG, "sendText"); SmsMessageBase.SubmitPduBase pdu = getSubmitPdu( scAddr, destAddr, text, (deliveryIntent != null), null, priority, validityPeriod); Loading @@ -867,7 +867,7 @@ public abstract class SMSDispatcher extends Handler { HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu); SmsTracker tracker = getSmsTracker(callingPkg, map, sentIntent, deliveryIntent, getFormat(), messageUri, expectMore, text, true /*isText*/, persistMessage, priority, validityPeriod); persistMessage, priority, validityPeriod, isForVvm); if (!sendSmsByCarrierApp(false /* isDataSms */, tracker)) { sendSubmitPdu(tracker); Loading Loading @@ -1103,7 +1103,7 @@ public abstract class SMSDispatcher extends Handler { return getSmsTracker(callingPackage, map, sentIntent, deliveryIntent, getFormat(), unsentPartCount, anyPartFailed, messageUri, smsHeader, (!lastPart || expectMore), fullMessageText, true /*isText*/, true /*persistMessage*/, priority, validityPeriod); true /*persistMessage*/, priority, validityPeriod, false /* isForVvm */); } else { Rlog.e(TAG, "CdmaSMSDispatcher.getNewSubmitPduTracker(): getSubmitPdu() returned " + "null"); Loading @@ -1121,7 +1121,7 @@ public abstract class SMSDispatcher extends Handler { return getSmsTracker(callingPackage, map, sentIntent, deliveryIntent, getFormat(), unsentPartCount, anyPartFailed, messageUri, smsHeader, (!lastPart || expectMore), fullMessageText, true /*isText*/, false /*persistMessage*/, priority, validityPeriod); false /*persistMessage*/, priority, validityPeriod, false /* isForVvm */); } else { Rlog.e(TAG, "GsmSMSDispatcher.getNewSubmitPduTracker(): getSubmitPdu() returned " + "null"); Loading Loading @@ -1211,7 +1211,7 @@ public abstract class SMSDispatcher extends Handler { */ boolean checkDestination(SmsTracker tracker) { if (mContext.checkCallingOrSelfPermission(SEND_SMS_NO_CONFIRMATION) == PackageManager.PERMISSION_GRANTED) { == PackageManager.PERMISSION_GRANTED || tracker.mIsForVvm) { return true; // app is pre-approved to send to short codes } else { int rule = mPremiumSmsRule.get(); Loading Loading @@ -1532,12 +1532,14 @@ public abstract class SMSDispatcher extends Handler { // User who sends the SMS. private final @UserIdInt int mUserId; private final boolean mIsForVvm; 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 expectMore, String fullMessageText, int subId, boolean isText, boolean persistMessage, int userId, int priority, int validityPeriod) { int validityPeriod, boolean isForVvm) { mData = data; mSentIntent = sentIntent; mDeliveryIntent = deliveryIntent; Loading @@ -1560,6 +1562,7 @@ public abstract class SMSDispatcher extends Handler { mUserId = userId; mPriority = priority; mValidityPeriod = validityPeriod; mIsForVvm = isForVvm; } /** Loading Loading @@ -1780,7 +1783,7 @@ public abstract class SMSDispatcher extends Handler { PendingIntent sentIntent, PendingIntent deliveryIntent, String format, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader, boolean expectMore, String fullMessageText, boolean isText, boolean persistMessage, int priority, int validityPeriod) { boolean persistMessage, int priority, int validityPeriod, boolean isForVvm) { // Get calling app package name via UID from Binder call PackageManager pm = mContext.getPackageManager(); Loading @@ -1799,25 +1802,27 @@ public abstract class SMSDispatcher extends Handler { return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format, unsentPartCount, anyPartFailed, messageUri, smsHeader, expectMore, fullMessageText, getSubId(), isText, persistMessage, userId, priority, validityPeriod); validityPeriod, isForVvm); } protected SmsTracker getSmsTracker(String callingPackage, HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, String format, Uri messageUri, boolean expectMore, String fullMessageText, boolean isText, boolean persistMessage) { boolean expectMore, String fullMessageText, boolean isText, boolean persistMessage, boolean isForVvm) { return getSmsTracker(callingPackage, data, sentIntent, deliveryIntent, format, null/*unsentPartCount*/, null/*anyPartFailed*/, messageUri, null/*smsHeader*/, expectMore, fullMessageText, isText, persistMessage, SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, SMS_MESSAGE_PERIOD_NOT_SPECIFIED); SMS_MESSAGE_PRIORITY_NOT_SPECIFIED, SMS_MESSAGE_PERIOD_NOT_SPECIFIED, isForVvm); } protected SmsTracker getSmsTracker(String callingPackage, HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, String format, Uri messageUri, boolean expectMore, String fullMessageText, boolean isText, boolean persistMessage, int priority, int validityPeriod) { int priority, int validityPeriod, boolean isForVvm) { return getSmsTracker(callingPackage, data, sentIntent, deliveryIntent, format, null/*unsentPartCount*/, null/*anyPartFailed*/, messageUri, null/*smsHeader*/, expectMore, fullMessageText, isText, persistMessage, priority, validityPeriod); expectMore, fullMessageText, isText, persistMessage, priority, validityPeriod, isForVvm); } protected HashMap<String, Object> getSmsTrackerMap(String destAddr, String scAddr, Loading
src/java/com/android/internal/telephony/SmsController.java +33 −3 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import com.android.internal.util.IndentingPrintWriter; import java.io.FileDescriptor; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; import java.util.List; /** Loading Loading @@ -134,11 +135,17 @@ public class SmsController extends ISmsImplBase { public void sendDataForSubscriberWithSelfPermissions(int subId, String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent) { sendDataForSubscriberWithSelfPermissionsInternal(subId, callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent, false /* isForVvm */); } private void sendDataForSubscriberWithSelfPermissionsInternal(int subId, String callingPackage, String destAddr, String scAddr, int destPort, byte[] data, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean isForVvm) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendDataWithSelfPermissions(callingPackage, destAddr, scAddr, destPort, data, sentIntent, deliveryIntent); data, sentIntent, deliveryIntent, isForVvm); } else { Rlog.e(LOG_TAG, "sendText iccSmsIntMgr is null for" + " Subscription: " + subId); Loading Loading @@ -200,10 +207,17 @@ public class SmsController extends ISmsImplBase { public void sendTextForSubscriberWithSelfPermissions(int subId, String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage) { sendTextForSubscriberWithSelfPermissionsInternal(subId, callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessage, false /* isForVvm */); } private void sendTextForSubscriberWithSelfPermissionsInternal(int subId, String callingPackage, String destAddr, String scAddr, String text, PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage, boolean isForVvm) { IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId); if (iccSmsIntMgr != null) { iccSmsIntMgr.sendTextWithSelfPermissions(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent, persistMessage); sentIntent, deliveryIntent, persistMessage, isForVvm); } else { Rlog.e(LOG_TAG, "sendText iccSmsIntMgr is null for" + " Subscription: " + subId); Loading Loading @@ -460,6 +474,22 @@ public class SmsController extends ISmsImplBase { return getPhone(subId).getAppSmsManager().createAppSpecificSmsToken(callingPkg, intent); } /** * Internal API to send visual voicemail related SMS. This is not exposed outside the phone * process, and should be called only after verifying that the caller is the default VVM app. */ public void sendVisualVoicemailSmsForSubscriber(String callingPackage, int subId, String number, int port, String text, PendingIntent sentIntent) { if (port == 0) { sendTextForSubscriberWithSelfPermissionsInternal(subId, callingPackage, number, null, text, sentIntent, null, false, true /* isForVvm */); } else { byte[] data = text.getBytes(StandardCharsets.UTF_8); sendDataForSubscriberWithSelfPermissionsInternal(subId, callingPackage, number, null, (short) port, data, sentIntent, null, true /* isForVvm */); } } @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!checkDumpPermission(mContext, LOG_TAG, pw)) { Loading