Allow the phone process to hide outbound text SMS
Bug: 29095322
Change-Id: Ibe91cc98c70e91563aae77d7f48f617a5fb65823
diff --git a/src/java/android/telephony/SmsManager.java b/src/java/android/telephony/SmsManager.java
index 189dc4b..4df3b40 100644
--- a/src/java/android/telephony/SmsManager.java
+++ b/src/java/android/telephony/SmsManager.java
@@ -31,9 +31,9 @@
import android.util.ArrayMap;
import android.util.Log;
+import com.android.internal.telephony.IMms;
import com.android.internal.telephony.ISms;
import com.android.internal.telephony.SmsRawData;
-import com.android.internal.telephony.IMms;
import com.android.internal.telephony.uicc.IccConstants;
import java.util.ArrayList;
@@ -335,11 +335,14 @@
* A variant of {@link SmsManager#sendTextMessage} that allows self to be the caller. This is
* for internal use only.
*
+ * @param persistMessage whether to persist the sent message in the SMS app. the caller must be
+ * the Phone process if set to false.
+ *
* @hide
*/
public void sendTextMessageWithSelfPermissions(
String destinationAddress, String scAddress, String text,
- PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ PendingIntent sentIntent, PendingIntent deliveryIntent, boolean persistMessage) {
if (TextUtils.isEmpty(destinationAddress)) {
throw new IllegalArgumentException("Invalid destinationAddress");
}
@@ -353,7 +356,7 @@
iccISms.sendTextForSubscriberWithSelfPermissions(getSubscriptionId(),
ActivityThread.currentPackageName(),
destinationAddress,
- scAddress, text, sentIntent, deliveryIntent);
+ scAddress, text, sentIntent, deliveryIntent, persistMessage);
} catch (RemoteException ex) {
// ignore it
}
diff --git a/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java b/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
index 24743d1..6b32498 100644
--- a/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
+++ b/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
@@ -16,6 +16,10 @@
package com.android.internal.telephony;
+import static android.telephony.SmsManager.STATUS_ON_ICC_FREE;
+import static android.telephony.SmsManager.STATUS_ON_ICC_READ;
+import static android.telephony.SmsManager.STATUS_ON_ICC_UNREAD;
+
import android.Manifest;
import android.app.AppOpsManager;
import android.app.PendingIntent;
@@ -28,15 +32,17 @@
import android.os.Binder;
import android.os.Handler;
import android.os.Message;
+import android.os.Process;
import android.os.UserManager;
import android.provider.Telephony;
import android.telephony.Rlog;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
+import android.telephony.TelephonyManager;
import android.util.Log;
-import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
import com.android.internal.telephony.cdma.CdmaSmsBroadcastConfigInfo;
+import com.android.internal.telephony.gsm.SmsBroadcastConfigInfo;
import com.android.internal.telephony.uicc.IccConstants;
import com.android.internal.telephony.uicc.IccFileHandler;
import com.android.internal.telephony.uicc.IccUtils;
@@ -47,12 +53,6 @@
import java.util.Arrays;
import java.util.List;
-import static android.telephony.SmsManager.STATUS_ON_ICC_FREE;
-import static android.telephony.SmsManager.STATUS_ON_ICC_READ;
-import static android.telephony.SmsManager.STATUS_ON_ICC_UNREAD;
-
-import android.telephony.TelephonyManager;
-
/**
* IccSmsInterfaceManager to provide an inter-process communication to
* access Sms in Icc.
@@ -399,12 +399,13 @@
* This method checks if the calling package or itself has the permission to send the sms.
*/
public void sendTextWithSelfPermissions(String callingPackage, String destAddr, String scAddr,
- String text, PendingIntent sentIntent, PendingIntent deliveryIntent) {
+ String text, PendingIntent sentIntent, PendingIntent deliveryIntent,
+ boolean persistMessage) {
mPhone.getContext().enforceCallingOrSelfPermission(
Manifest.permission.SEND_SMS,
"Sending SMS message");
sendTextInternal(callingPackage, destAddr, scAddr, text, sentIntent, deliveryIntent,
- true /* persistMessageForNonDefaultSmsApp */);
+ persistMessage);
}
/**
@@ -445,8 +446,8 @@
return;
}
if (!persistMessageForNonDefaultSmsApp) {
- // Only allow carrier app to skip auto message persistence.
- enforceCarrierPrivilege();
+ // Only allow carrier app or phone process to skip auto message persistence.
+ enforceCarrierOrPhonePrivilege();
}
destAddr = filterDestAddress(destAddr);
mDispatcher.sendText(destAddr, scAddr, text, sentIntent, deliveryIntent,
@@ -1114,6 +1115,13 @@
}
}
+ private void enforceCarrierOrPhonePrivilege() {
+ int callingUid = Binder.getCallingUid();
+ if (callingUid != Process.PHONE_UID) {
+ enforceCarrierPrivilege();
+ }
+ }
+
private String filterDestAddress(String destAddr) {
String result = null;
result = SmsNumberUtils.filterDestAddr(mPhone, destAddr);
diff --git a/src/java/com/android/internal/telephony/UiccSmsController.java b/src/java/com/android/internal/telephony/UiccSmsController.java
index 264a3d8..6844dd3 100755
--- a/src/java/com/android/internal/telephony/UiccSmsController.java
+++ b/src/java/com/android/internal/telephony/UiccSmsController.java
@@ -144,11 +144,11 @@
public void sendTextForSubscriberWithSelfPermissions(int subId, String callingPackage,
String destAddr, String scAddr, String text, PendingIntent sentIntent,
- PendingIntent deliveryIntent) {
+ PendingIntent deliveryIntent, boolean persistMessage) {
IccSmsInterfaceManager iccSmsIntMgr = getIccSmsInterfaceManager(subId);
if (iccSmsIntMgr != null) {
iccSmsIntMgr.sendTextWithSelfPermissions(callingPackage, destAddr, scAddr, text,
- sentIntent, deliveryIntent);
+ sentIntent, deliveryIntent, persistMessage);
} else {
Rlog.e(LOG_TAG,"sendText iccSmsIntMgr is null for" +
" Subscription: " + subId);