Commit a8f8c5a1 authored by Ji Yang's avatar Ji Yang
Browse files

Add API to let carrier app send SMS without auto persisting.

Bug: 22773702
Change-Id: Ib126e79b0d1e2f9a9a44afe2b3f1895c150bd86b
parent 37e4f9db
......@@ -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");
}
......@@ -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.
......@@ -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");
}
......@@ -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
}
......@@ -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.
*
......
......@@ -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);
}
/**
......@@ -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 */);
}
/**
......@@ -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=" +
......@@ -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);
}
/**
......@@ -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) {
......@@ -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);
}
......@@ -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,
......@@ -1000,7 +1013,8 @@ public class IccSmsInterfaceManager {
}
mDispatcher.sendText(textAndAddress[1], scAddress, singlePart,
singleSentIntent, singleDeliveryIntent, messageUri, callingPkg);
singleSentIntent, singleDeliveryIntent, messageUri, callingPkg,
true /* persistMessageForNonDefaultSmsApp */);
}
return;
}
......@@ -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) {
......
......@@ -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);
}
}
......@@ -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);
}
}
......
......@@ -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.
......@@ -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();
......@@ -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
......@@ -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);
}
/**
......@@ -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;
......@@ -1337,6 +1345,7 @@ public abstract class SMSDispatcher extends Handler {
mFullMessageText = fullMessageText;
mSubId = subId;
mIsText = isText;
mPersistMessage = persistMessage;
}
/**
......@@ -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;
}
......@@ -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());
......@@ -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,
......
......@@ -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);
......@@ -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);
......
......@@ -113,7 +113,7 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
HashMap map = getSmsTrackerMap(destAddr, scAddr, destPort, data, pdu);
SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/,
false /*isText*/);
false /*isText*/, true /*persistMessage*/);
String carrierPackage = getCarrierAppPackageName();
if (carrierPackage != null) {
......@@ -139,13 +139,14 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
/** {@inheritDoc} */
@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) {
SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
scAddr, destAddr, text, (deliveryIntent != null), null);
if (pdu != null) {
HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu);
SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
messageUri, false /*isExpectMore*/, text, true /*isText*/);
messageUri, false /*isExpectMore*/, text, true /*isText*/, persistMessage);
String carrierPackage = getCarrierAppPackageName();
if (carrierPackage != null) {
......@@ -209,7 +210,8 @@ public class CdmaSMSDispatcher extends SMSDispatcher {
message, submitPdu);
return getSmsTracker(map, sentIntent, deliveryIntent,
getFormat(), unsentPartCount, anyPartFailed, messageUri, smsHeader,
false /*isExpextMore*/, fullMessageText, true /*isText*/);
false /*isExpextMore*/, fullMessageText, true /*isText*/,
true /*persistMessage*/);
}
@Override
......
......@@ -157,7 +157,7 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
HashMap map = getSmsTrackerMap(destAddr, scAddr, destPort, data, pdu);
SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
null /*messageUri*/, false /*isExpectMore*/, null /*fullMessageText*/,
false /*isText*/);
false /*isText*/, true /*persistMessage*/);
String carrierPackage = getCarrierAppPackageName();
if (carrierPackage != null) {
......@@ -176,13 +176,15 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
/** {@inheritDoc} */
@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) {
SmsMessage.SubmitPdu pdu = SmsMessage.getSubmitPdu(
scAddr, destAddr, text, (deliveryIntent != null));
if (pdu != null) {
HashMap map = getSmsTrackerMap(destAddr, scAddr, text, pdu);
SmsTracker tracker = getSmsTracker(map, sentIntent, deliveryIntent, getFormat(),
messageUri, false /*isExpectMore*/, text /*fullMessageText*/, true /*isText*/);
messageUri, false /*isExpectMore*/, text /*fullMessageText*/, true /*isText*/,
persistMessage);
String carrierPackage = getCarrierAppPackageName();
if (carrierPackage != null) {
......@@ -226,7 +228,8 @@ public final class GsmSMSDispatcher extends SMSDispatcher {
message, pdu);
return getSmsTracker(map, sentIntent,
deliveryIntent, getFormat(), unsentPartCount, anyPartFailed, messageUri,
smsHeader, !lastPart, fullMessageText, true /*isText*/);
smsHeader, !lastPart, fullMessageText, true /*isText*/,
false /*persistMessage*/);
} else {
Rlog.e(TAG, "GsmSMSDispatcher.sendNewSubmitPdu(): getSubmitPdu() returned null");
return null;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment