Merge "Check user restrictions during incoming calls." into pi-dev
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index f7953b1..099e6d3 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -516,6 +516,20 @@
             return;
         }
 
+        // Check DISALLOW_OUTGOING_CALLS restriction.
+        // Only ecbm calls are allowed through when users with the DISALLOW_OUTGOING_CALLS
+        // restriction are the current user.
+        final UserManager userManager = (UserManager) mContext.getSystemService(
+                Context.USER_SERVICE);
+        if (userManager.hasUserRestriction(UserManager.DISALLOW_OUTGOING_CALLS,
+                mCurrentUserHandle)) {
+            Log.w(this, "Rejecting non-ecbm phone call due to DISALLOW_INCOMING_CALLS "
+                    + "restriction");
+            incomingCall.reject(false, null);
+            mCallLogManager.logCall(incomingCall, Calls.MISSED_TYPE, false /* showNotification */);
+            return;
+        }
+
         List<IncomingCallFilter.CallFilter> filters = new ArrayList<>();
         filters.add(new DirectToVoicemailCallFilter(mCallerInfoLookupHelper));
         filters.add(new AsyncBlockCheckFilter(mContext, new BlockCheckerAdapter(),
diff --git a/src/com/android/server/telecom/InCallAdapter.java b/src/com/android/server/telecom/InCallAdapter.java
index 3357d9b..02692c5 100644
--- a/src/com/android/server/telecom/InCallAdapter.java
+++ b/src/com/android/server/telecom/InCallAdapter.java
@@ -16,9 +16,12 @@
 
 package com.android.server.telecom;
 
+import android.content.Context;
 import android.net.Uri;
 import android.os.Binder;
 import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.telecom.Log;
 import android.telecom.PhoneAccountHandle;
 
@@ -32,14 +35,16 @@
  * binding to it. This adapter can receive commands and updates until the in-call app is unbound.
  */
 class InCallAdapter extends IInCallAdapter.Stub {
+    private final Context mContext;
     private final CallsManager mCallsManager;
     private final CallIdMapper mCallIdMapper;
     private final TelecomSystem.SyncRoot mLock;
     private final String mOwnerComponentName;
 
     /** Persists the specified parameters. */
-    public InCallAdapter(CallsManager callsManager, CallIdMapper callIdMapper,
+    public InCallAdapter(Context context, CallsManager callsManager, CallIdMapper callIdMapper,
             TelecomSystem.SyncRoot lock, String ownerComponentName) {
+        mContext = context;
         mCallsManager = callsManager;
         mCallIdMapper = callIdMapper;
         mLock = lock;
@@ -96,6 +101,17 @@
     public void rejectCall(String callId, boolean rejectWithMessage, String textMessage) {
         try {
             Log.startSession(LogUtils.Sessions.ICA_REJECT_CALL, mOwnerComponentName);
+            UserHandle callingUser = UserHandle.of(UserHandle.getUserId(Binder.getCallingUid()));
+            UserManager userManager = mContext.getSystemService(UserManager.class);
+
+            // Check to make sure the in-call app's user isn't restricted from sending SMS. If so,
+            // silently drop the outgoing message.
+            if (rejectWithMessage && userManager.hasUserRestriction(
+                    UserManager.DISALLOW_SMS, callingUser)) {
+                rejectWithMessage = false;
+                textMessage = null;
+            }
+
             long token = Binder.clearCallingIdentity();
             try {
                 synchronized (mLock) {
diff --git a/src/com/android/server/telecom/InCallController.java b/src/com/android/server/telecom/InCallController.java
index 9d20d4a..7aaa770 100644
--- a/src/com/android/server/telecom/InCallController.java
+++ b/src/com/android/server/telecom/InCallController.java
@@ -1309,6 +1309,7 @@
         try {
             inCallService.setInCallAdapter(
                     new InCallAdapter(
+                            mContext,
                             mCallsManager,
                             mCallIdMapper,
                             mLock,