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

Commit f0f99f34 authored by Santos Cordon's avatar Santos Cordon
Browse files

Add *AsUser() calls where appropriate for multi-user support.

Although telecom always runs as system user, it binds to apps in the
user space and so needs to interact with apps with the current user
explicitly.  This change fixes areas that neglected to do that.

Bug: 27161171
Change-Id: I55a4f612c9b38d4e448c346173845a79a926c695
parent 8e131577
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1319,7 +1319,8 @@ public class Call implements CreateConnectionResponse {
        }
    }

    Bundle getIntentExtras() {
    @VisibleForTesting
    public Bundle getIntentExtras() {
        return mIntentExtras;
    }

+6 −3
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ public class CallScreening {
    private final Listener mListener;
    private final TelecomSystem.SyncRoot mLock;
    private final PhoneAccountRegistrar mPhoneAccountRegistrar;
    private final CallsManager mCallsManager;
    private final Handler mHandler = new Handler();
    private Call mCall;
    private ICallScreeningService mService;
@@ -62,12 +63,13 @@ public class CallScreening {

    public CallScreening(
            Context context,
            Listener listener,
            CallsManager callsManager,
            TelecomSystem.SyncRoot lock,
            PhoneAccountRegistrar phoneAccountRegistrar,
            Call call) {
        mContext = context;
        mListener = listener;
        mCallsManager = callsManager;
        mListener = callsManager;
        mLock = lock;
        mPhoneAccountRegistrar = phoneAccountRegistrar;
        mCall = call;
@@ -113,7 +115,8 @@ public class CallScreening {

        Intent intent = new Intent(CallScreeningService.SERVICE_INTERFACE)
            .setPackage(dialerPackage);
        List<ResolveInfo> entries = mContext.getPackageManager().queryIntentServices(intent, 0);
        List<ResolveInfo> entries = mContext.getPackageManager().queryIntentServicesAsUser(
                intent, 0, mCallsManager.getCurrentUserHandle().getIdentifier());
        if (entries.isEmpty()) {
            return false;
        }
+17 −4
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.telecom;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.UserInfo;
import android.content.Intent;
@@ -108,7 +109,8 @@ public class CallsManager extends Call.ListenerBase
            {CallState.CONNECTING, CallState.SELECT_PHONE_ACCOUNT, CallState.DIALING};

    private static final int[] LIVE_CALL_STATES =
            {CallState.CONNECTING, CallState.SELECT_PHONE_ACCOUNT, CallState.DIALING, CallState.ACTIVE};
            {CallState.CONNECTING, CallState.SELECT_PHONE_ACCOUNT, CallState.DIALING,
                CallState.ACTIVE};
    public static final String TELECOM_CALL_ID_PREFIX = "TC@";

    // Maps call technologies in PhoneConstants to those in Analytics.
@@ -141,6 +143,11 @@ public class CallsManager extends Call.ListenerBase
     */
    private int mCallId = 0;

    /**
     * Stores the current foreground user.
     */
    private UserHandle mCurrentUserHandle = UserHandle.of(ActivityManager.getCurrentUser());

    private final ConnectionServiceRepository mConnectionServiceRepository;
    private final DtmfLocalTonePlayer mDtmfLocalTonePlayer;
    private final InCallController mInCallController;
@@ -229,8 +236,9 @@ public class CallsManager extends Call.ListenerBase
        RingtoneFactory ringtoneFactory = new RingtoneFactory(context);
        SystemVibrator systemVibrator = new SystemVibrator(context);
        AsyncRingtonePlayer asyncRingtonePlayer = new AsyncRingtonePlayer();
        mInCallController = new InCallController(context, mLock, this, systemStateProvider);
        mRinger = new Ringer(playerFactory, context, systemSettingsUtil, asyncRingtonePlayer,
                ringtoneFactory, systemVibrator);
                ringtoneFactory, systemVibrator, mInCallController);

        mCallAudioManager = new CallAudioManager(callAudioRouteStateMachine,
                this,new CallAudioModeStateMachine((AudioManager)
@@ -242,7 +250,6 @@ public class CallsManager extends Call.ListenerBase
        mProximitySensorManager = proximitySensorManagerFactory.create(context, this);
        mPhoneStateBroadcaster = new PhoneStateBroadcaster(this);
        mCallLogManager = new CallLogManager(context, phoneAccountRegistrar);
        mInCallController = new InCallController(context, mLock, this, systemStateProvider);
        mConnectionServiceRepository =
                new ConnectionServiceRepository(mPhoneAccountRegistrar, mContext, mLock, this);
        mInCallWakeLockController = inCallWakeLockControllerFactory.create(context, this);
@@ -538,6 +545,10 @@ public class CallsManager extends Call.ListenerBase
        return mCallAudioManager.getForegroundCall();
    }

    public UserHandle getCurrentUserHandle() {
        return mCurrentUserHandle;
    }

    CallAudioManager getCallAudioManager() {
        return mCallAudioManager;
    }
@@ -546,7 +557,8 @@ public class CallsManager extends Call.ListenerBase
        return mInCallController;
    }

    boolean hasEmergencyCall() {
    @VisibleForTesting
    public boolean hasEmergencyCall() {
        for (Call call : mCalls) {
            if (call.isEmergencyCall()) {
                return true;
@@ -1841,6 +1853,7 @@ public class CallsManager extends Call.ListenerBase
     * including the user itself. There may be chances that profiles are not started yet.
     */
    void onUserSwitch(UserHandle userHandle) {
        mCurrentUserHandle = userHandle;
        mMissedCallNotifier.setCurrentUserHandle(userHandle);
        final UserManager userManager = UserManager.get(mContext);
        List<UserInfo> profiles = userManager.getEnabledProfiles(userHandle.getIdentifier());
+27 −11
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@ import android.telecom.TelecomManager;
import android.text.TextUtils;
import android.util.ArrayMap;

import com.android.internal.annotations.VisibleForTesting;
// TODO: Needed for move to system service: import com.android.internal.R;
import com.android.internal.telecom.IInCallService;
import com.android.internal.util.IndentingPrintWriter;
@@ -345,7 +346,8 @@ public final class InCallController extends CallsManagerListenerBase {
     *
     * @param call The newly added call that triggered the binding to the in-call services.
     */
    private void bindToServices(Call call) {
    @VisibleForTesting
    public void bindToServices(Call call) {
        ComponentName inCallUIService = null;
        ComponentName carModeInCallUIService = null;
        List<ComponentName> nonUIInCallServices = new LinkedList<>();
@@ -353,12 +355,16 @@ public final class InCallController extends CallsManagerListenerBase {
        // Loop through all the InCallService implementations that exist in the devices;
        PackageManager packageManager = mContext.getPackageManager();
        Intent serviceIntent = new Intent(InCallService.SERVICE_INTERFACE);
        for (ResolveInfo entry :
                packageManager.queryIntentServices(serviceIntent, PackageManager.GET_META_DATA)) {
        for (ResolveInfo entry : packageManager.queryIntentServicesAsUser(
                serviceIntent,
                PackageManager.GET_META_DATA,
                mCallsManager.getCurrentUserHandle().getIdentifier())) {
            ServiceInfo serviceInfo = entry.serviceInfo;

            if (serviceInfo != null) {
                ComponentName componentName =
                        new ComponentName(serviceInfo.packageName, serviceInfo.name);
                Log.v(this, "ICS: " + componentName + ", user: " + entry.targetUserId);

                switch (getInCallServiceType(entry.serviceInfo, packageManager)) {
                    case IN_CALL_SERVICE_TYPE_DIALER_UI:
@@ -500,7 +506,8 @@ public final class InCallController extends CallsManagerListenerBase {

        // Check to see that it is the default dialer package
        boolean isDefaultDialerPackage = Objects.equals(serviceInfo.packageName,
                DefaultDialerManager.getDefaultDialerApplication(mContext));
                DefaultDialerManager.getDefaultDialerApplication(
                    mContext, mCallsManager.getCurrentUserHandle().getIdentifier()));
        boolean isUIService = serviceInfo.metaData != null &&
                serviceInfo.metaData.getBoolean(
                        TelecomManager.METADATA_IN_CALL_SERVICE_UI, false);
@@ -706,17 +713,26 @@ public final class InCallController extends CallsManagerListenerBase {
        pw.decreaseIndent();
    }

    static boolean doesDefaultDialerSupportRinging(Context context) {
        String dialerPackage = DefaultDialerManager
                .getDefaultDialerApplication(context, UserHandle.USER_CURRENT);
        if (TextUtils.isEmpty(dialerPackage)) {
    public boolean doesConnectedDialerSupportRinging() {
        String ringingPackage =  null;
        if (mInCallUIComponentName != null) {
            ringingPackage = mInCallUIComponentName.getPackageName().trim();
        }

        if (TextUtils.isEmpty(ringingPackage)) {
            // The current in-call UI returned nothing, so lets use the default dialer.
            ringingPackage = DefaultDialerManager.getDefaultDialerApplication(
                    mContext, UserHandle.USER_CURRENT);
        }
        if (TextUtils.isEmpty(ringingPackage)) {
            return false;
        }

        Intent intent = new Intent(InCallService.SERVICE_INTERFACE)
            .setPackage(dialerPackage);
        List<ResolveInfo> entries = context.getPackageManager()
                .queryIntentServices(intent, PackageManager.GET_META_DATA);
            .setPackage(ringingPackage);
        List<ResolveInfo> entries = mContext.getPackageManager().queryIntentServicesAsUser(
                intent, PackageManager.GET_META_DATA,
                mCallsManager.getCurrentUserHandle().getIdentifier());
        if (entries.isEmpty()) {
            return false;
        }
+6 −3
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ public final class Ringer {
    private final AsyncRingtonePlayer mRingtonePlayer;
    private final Context mContext;
    private final Vibrator mVibrator;
    private final InCallController mInCallController;

    private InCallTonePlayer mCallWaitingPlayer;
    private RingtoneFactory mRingtoneFactory;
@@ -79,7 +80,8 @@ public final class Ringer {
            SystemSettingsUtil systemSettingsUtil,
            AsyncRingtonePlayer asyncRingtonePlayer,
            RingtoneFactory ringtoneFactory,
            Vibrator vibrator) {
            Vibrator vibrator,
            InCallController inCallController) {

        mSystemSettingsUtil = systemSettingsUtil;
        mPlayerFactory = playerFactory;
@@ -89,6 +91,7 @@ public final class Ringer {
        mVibrator = vibrator;
        mRingtonePlayer = asyncRingtonePlayer;
        mRingtoneFactory = ringtoneFactory;
        mInCallController = inCallController;
    }

    public void startRinging(Call foregroundCall) {
@@ -101,7 +104,7 @@ public final class Ringer {
            return;
        }

        if (InCallController.doesDefaultDialerSupportRinging(mContext)) {
        if (mInCallController.doesConnectedDialerSupportRinging()) {
            Log.event(foregroundCall, Log.Events.SKIP_RINGING);
            return;
        }
@@ -139,7 +142,7 @@ public final class Ringer {
            return;
        }

        if (InCallController.doesDefaultDialerSupportRinging(mContext)) {
        if (mInCallController.doesConnectedDialerSupportRinging()) {
            Log.event(call, Log.Events.SKIP_RINGING);
            return;
        }
Loading