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

Commit ea240b07 authored by Alex Stetson's avatar Alex Stetson
Browse files

Only call IStatusBarService from foreground user

Calling for visible background users will not be allowed going forward
and may cause security exceptions.

Bug: 332222893
Test: manual, presubmit
Flag: NONE bugfix
Change-Id: I16a89bb8bc62c781a82832f41159ab77096c001b
parent 123a3c5d
Loading
Loading
Loading
Loading
+28 −9
Original line number Diff line number Diff line
@@ -77,7 +77,6 @@ import android.os.Looper;
import android.os.Message;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
@@ -150,6 +149,7 @@ import com.android.systemui.keyguard.shared.model.TransitionStep;
import com.android.systemui.log.SessionTracker;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.process.ProcessWrapper;
import com.android.systemui.res.R;
import com.android.systemui.scene.shared.flag.SceneContainerFlag;
import com.android.systemui.settings.UserTracker;
@@ -359,6 +359,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
    private final SecureSettings mSecureSettings;
    private final SystemSettings mSystemSettings;
    private final SystemClock mSystemClock;
    private final ProcessWrapper mProcessWrapper;
    private final SystemPropertiesHelper mSystemPropertiesHelper;

    /**
@@ -1442,10 +1443,12 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
            Lazy<ActivityTransitionAnimator> activityTransitionAnimator,
            Lazy<ScrimController> scrimControllerLazy,
            IActivityTaskManager activityTaskManagerService,
            IStatusBarService statusBarService,
            FeatureFlags featureFlags,
            SecureSettings secureSettings,
            SystemSettings systemSettings,
            SystemClock systemClock,
            ProcessWrapper processWrapper,
            @Main CoroutineDispatcher mainDispatcher,
            Lazy<DreamViewModel> dreamViewModel,
            Lazy<CommunalTransitionViewModel> communalTransitionViewModel,
@@ -1470,9 +1473,9 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
        mSecureSettings = secureSettings;
        mSystemSettings = systemSettings;
        mSystemClock = systemClock;
        mProcessWrapper = processWrapper;
        mSystemPropertiesHelper = systemPropertiesHelper;
        mStatusBarService = IStatusBarService.Stub.asInterface(
                ServiceManager.getService(Context.STATUS_BAR_SERVICE));
        mStatusBarService = statusBarService;
        mKeyguardDisplayManager = keyguardDisplayManager;
        mShadeController = shadeControllerLazy;
        dumpManager.registerDumpable(this);
@@ -3475,6 +3478,13 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
            // TODO (b/155663717) After restart, status bar will not properly hide home button
            //  unless disable is called to show un-hide it once first
            if (forceClearFlags) {
                if (UserManager.isVisibleBackgroundUsersEnabled()
                        && !mProcessWrapper.isSystemUser() && !mProcessWrapper.isForegroundUser()) {
                    // TODO: b/341604160 - Support visible background users properly.
                    if (DEBUG) {
                        Log.d(TAG, "Status bar manager is disabled for visible background users");
                    }
                } else {
                    try {
                        mStatusBarService.disableForUser(flags, mStatusBarDisableToken,
                                mContext.getPackageName(),
@@ -3483,6 +3493,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
                        Log.d(TAG, "Failed to force clear flags", e);
                    }
                }
            }

            if (forceHideHomeRecentsButtons || isShowingAndNotOccluded()) {
                if (!mShowHomeOverLockscreen || !mInGestureNavigationMode) {
@@ -3504,6 +3515,14 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable,
            }

            if (!SceneContainerFlag.isEnabled()) {
                if (UserManager.isVisibleBackgroundUsersEnabled()
                        && !mProcessWrapper.isSystemUser() && !mProcessWrapper.isForegroundUser()) {
                    // TODO: b/341604160 - Support visible background users properly.
                    if (DEBUG) {
                        Log.d(TAG, "Status bar manager is disabled for visible background users");
                    }
                    return;
                }
                try {
                    mStatusBarService.disableForUser(flags, mStatusBarDisableToken,
                            mContext.getPackageName(),
+6 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.os.PowerManager;

import com.android.internal.jank.InteractionJankMonitor;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardDisplayManager;
import com.android.keyguard.KeyguardUpdateMonitor;
@@ -64,6 +65,7 @@ import com.android.systemui.keyguard.shared.quickaffordance.KeyguardQuickAfforda
import com.android.systemui.keyguard.ui.transitions.DeviceEntryIconTransitionModule;
import com.android.systemui.log.SessionTracker;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.process.ProcessWrapper;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.shade.ShadeController;
import com.android.systemui.statusbar.NotificationShadeDepthController;
@@ -158,10 +160,12 @@ public interface KeyguardModule {
            Lazy<ActivityTransitionAnimator> activityTransitionAnimator,
            Lazy<ScrimController> scrimControllerLazy,
            IActivityTaskManager activityTaskManagerService,
            IStatusBarService statusBarService,
            FeatureFlags featureFlags,
            SecureSettings secureSettings,
            SystemSettings systemSettings,
            SystemClock systemClock,
            ProcessWrapper processWrapper,
            @Main CoroutineDispatcher mainDispatcher,
            Lazy<DreamViewModel> dreamViewModel,
            Lazy<CommunalTransitionViewModel> communalTransitionViewModel,
@@ -206,10 +210,12 @@ public interface KeyguardModule {
                activityTransitionAnimator,
                scrimControllerLazy,
                activityTaskManagerService,
                statusBarService,
                featureFlags,
                secureSettings,
                systemSettings,
                systemClock,
                processWrapper,
                mainDispatcher,
                dreamViewModel,
                communalTransitionViewModel,
+24 −1
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.app.StatusBarManager.SESSION_KEYGUARD;

import android.annotation.Nullable;
import android.os.RemoteException;
import android.os.UserManager;
import android.util.Log;

import androidx.annotation.NonNull;
@@ -36,6 +37,7 @@ import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.CoreStartable;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.process.ProcessWrapper;
import com.android.systemui.statusbar.policy.KeyguardStateController;

import java.io.PrintWriter;
@@ -63,6 +65,7 @@ public class SessionTracker implements CoreStartable {
    private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
    private final KeyguardStateController mKeyguardStateController;
    private final UiEventLogger mUiEventLogger;
    private final ProcessWrapper mProcessWrapper;
    private final Map<Integer, InstanceId> mSessionToInstanceId = new HashMap<>();

    private boolean mKeyguardSessionStarted;
@@ -73,13 +76,15 @@ public class SessionTracker implements CoreStartable {
            AuthController authController,
            KeyguardUpdateMonitor keyguardUpdateMonitor,
            KeyguardStateController keyguardStateController,
            UiEventLogger uiEventLogger
            UiEventLogger uiEventLogger,
            ProcessWrapper processWrapper
    ) {
        mStatusBarManagerService = statusBarService;
        mAuthController = authController;
        mKeyguardUpdateMonitor = keyguardUpdateMonitor;
        mKeyguardStateController = keyguardStateController;
        mUiEventLogger = uiEventLogger;
        mProcessWrapper = processWrapper;
    }

    @Override
@@ -109,6 +114,16 @@ public class SessionTracker implements CoreStartable {

        final InstanceId instanceId = mInstanceIdGenerator.newInstanceId();
        mSessionToInstanceId.put(type, instanceId);

        if (UserManager.isVisibleBackgroundUsersEnabled() && !mProcessWrapper.isSystemUser()
                && !mProcessWrapper.isForegroundUser()) {
            // TODO: b/341604160 - Support visible background users properly.
            if (DEBUG) {
                Log.d(TAG, "Status bar manager is disabled for visible background users");
            }
            return;
        }

        try {
            if (DEBUG) {
                Log.d(TAG, "Session start for [" + getString(type) + "] id=" + instanceId);
@@ -139,6 +154,14 @@ public class SessionTracker implements CoreStartable {
            if (endSessionUiEvent != null) {
                mUiEventLogger.log(endSessionUiEvent, instanceId);
            }
            if (UserManager.isVisibleBackgroundUsersEnabled() && !mProcessWrapper.isSystemUser()
                    && !mProcessWrapper.isForegroundUser()) {
                // TODO: b/341604160 - Support visible background users properly.
                if (DEBUG) {
                    Log.d(TAG, "Status bar manager is disabled for visible background users");
                }
                return;
            }
            mStatusBarManagerService.onSessionEnded(type, instanceId);
        } catch (RemoteException e) {
            Log.e(TAG, "Unable to send onSessionEnded for session="
+8 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.process;

import android.app.ActivityManager;
import android.os.Process;
import android.os.UserHandle;

@@ -36,6 +37,13 @@ public class ProcessWrapper {
        return myUserHandle().isSystem();
    }

    /**
     * Returns {@code true} if the foreground user is running the current process.
     */
    public boolean isForegroundUser() {
        return ActivityManager.getCurrentUser() == myUserHandle().getIdentifier();
    }

    /**
     * Returns {@link UserHandle} as returned statically by {@link Process#myUserHandle()}.
     *
+7 −0
Original line number Diff line number Diff line
@@ -77,6 +77,7 @@ import androidx.test.filters.SmallTest;
import com.android.internal.foldables.FoldGracePeriodProvider;
import com.android.internal.logging.InstanceId;
import com.android.internal.logging.UiEventLogger;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardDisplayManager;
import com.android.keyguard.KeyguardSecurityView;
@@ -101,6 +102,7 @@ import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor;
import com.android.systemui.kosmos.KosmosJavaAdapter;
import com.android.systemui.log.SessionTracker;
import com.android.systemui.navigationbar.NavigationModeController;
import com.android.systemui.process.ProcessWrapper;
import com.android.systemui.scene.FakeWindowRootViewComponent;
import com.android.systemui.scene.ui.view.WindowRootView;
import com.android.systemui.settings.UserTracker;
@@ -188,6 +190,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
    private @Mock ActivityTransitionAnimator mActivityTransitionAnimator;
    private @Mock ScrimController mScrimController;
    private @Mock IActivityTaskManager mActivityTaskManagerService;
    private @Mock IStatusBarService mStatusBarService;
    private @Mock SysuiColorExtractor mColorExtractor;
    private @Mock AuthController mAuthController;
    private @Mock ShadeExpansionStateManager mShadeExpansionStateManager;
@@ -211,6 +214,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
    private @Mock SystemSettings mSystemSettings;
    private @Mock SecureSettings mSecureSettings;
    private @Mock AlarmManager mAlarmManager;
    private @Mock ProcessWrapper mProcessWrapper;
    private FakeSystemClock mSystemClock;
    private final FakeWallpaperRepository mWallpaperRepository = new FakeWallpaperRepository();

@@ -247,6 +251,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
                .thenReturn(mock(Flow.class));
        when(mSelectedUserInteractor.getSelectedUserId()).thenReturn(mDefaultUserId);
        when(mSelectedUserInteractor.getSelectedUserId(anyBoolean())).thenReturn(mDefaultUserId);
        when(mProcessWrapper.isSystemUser()).thenReturn(true);
        mNotificationShadeWindowController = new NotificationShadeWindowControllerImpl(
                mContext,
                new FakeWindowRootViewComponent.Factory(mock(WindowRootView.class)),
@@ -1225,10 +1230,12 @@ public class KeyguardViewMediatorTest extends SysuiTestCase {
                () -> mActivityTransitionAnimator,
                () -> mScrimController,
                mActivityTaskManagerService,
                mStatusBarService,
                mFeatureFlags,
                mSecureSettings,
                mSystemSettings,
                mSystemClock,
                mProcessWrapper,
                mDispatcher,
                () -> mDreamViewModel,
                () -> mCommunalTransitionViewModel,
Loading