Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18c94495 authored by Hall Liu's avatar Hall Liu
Browse files

Allow incoming calls while in secondary user

For consistency with behavior on the lockscreen, allow incoming calls
even if DISALLOW_OUTGOING_CALLS is set on the secondary user.

Change-Id: Ia3977604b270e43db359aa050e41682dba302592
Fixes: 77808826
Test: manual
parent b0398e4a
Loading
Loading
Loading
Loading
+16 −14
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.telecom;

import android.app.ActivityManager;
import android.app.KeyguardManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.pm.UserInfo;
@@ -516,20 +517,6 @@ public class CallsManager extends Call.ListenerBase
            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(),
@@ -3170,6 +3157,21 @@ public class CallsManager extends Call.ListenerBase
        }
    }

    public boolean isReplyWithSmsAllowed(int uid) {
        UserHandle callingUser = UserHandle.of(UserHandle.getUserId(uid));
        UserManager userManager = mContext.getSystemService(UserManager.class);
        KeyguardManager keyguardManager = mContext.getSystemService(KeyguardManager.class);

        boolean isUserRestricted = userManager != null
                && userManager.hasUserRestriction(UserManager.DISALLOW_SMS, callingUser);
        boolean isLockscreenRestricted = keyguardManager != null
                && keyguardManager.isDeviceLocked();
        Log.d(this, "isReplyWithSmsAllowed: isUserRestricted: %s, isLockscreenRestricted: %s",
                isUserRestricted, isLockscreenRestricted);

        // TODO(hallliu): actually check the lockscreen once b/77731473 is fixed
        return !isUserRestricted;
    }
    /**
     * Blocks execution until all Telecom handlers have completed their current work.
     */
+3 −13
Original line number Diff line number Diff line
@@ -16,12 +16,9 @@

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;

@@ -35,16 +32,14 @@ import java.util.List;
 * 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(Context context, CallsManager callsManager, CallIdMapper callIdMapper,
    public InCallAdapter(CallsManager callsManager, CallIdMapper callIdMapper,
            TelecomSystem.SyncRoot lock, String ownerComponentName) {
        mContext = context;
        mCallsManager = callsManager;
        mCallIdMapper = callIdMapper;
        mLock = lock;
@@ -101,17 +96,12 @@ class InCallAdapter extends IInCallAdapter.Stub {
    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)) {
            // silently drop the outgoing message. Also drop message if the screen is locked.
            if (!mCallsManager.isReplyWithSmsAllowed(Binder.getCallingUid())) {
                rejectWithMessage = false;
                textMessage = null;
            }

            long token = Binder.clearCallingIdentity();
            try {
                synchronized (mLock) {
+0 −1
Original line number Diff line number Diff line
@@ -1309,7 +1309,6 @@ public class InCallController extends CallsManagerListenerBase {
        try {
            inCallService.setInCallAdapter(
                    new InCallAdapter(
                            mContext,
                            mCallsManager,
                            mCallIdMapper,
                            mLock,