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);