diff options
| author | 2024-07-01 15:03:54 -0700 | |
|---|---|---|
| committer | 2024-07-03 10:30:02 -0700 | |
| commit | ea240b07c8718f93c175a447a9ff7f9959babfcf (patch) | |
| tree | a9237e4e67001ce121aed79346d00c0b2e16845e | |
| parent | 123a3c5d0f439bf1e664444ead007494c0662e53 (diff) | |
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
6 files changed, 79 insertions, 11 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 36b7ed26158f..36f677770d50 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -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,12 +3478,20 @@ 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) { - try { - mStatusBarService.disableForUser(flags, mStatusBarDisableToken, - mContext.getPackageName(), - mSelectedUserInteractor.getSelectedUserId(true)); - } catch (RemoteException e) { - Log.d(TAG, "Failed to force clear flags", e); + 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(), + mSelectedUserInteractor.getSelectedUserId(true)); + } catch (RemoteException e) { + Log.d(TAG, "Failed to force clear flags", e); + } } } @@ -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(), diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java index 15dac0981117..a43bfd3a8fff 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java @@ -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, diff --git a/packages/SystemUI/src/com/android/systemui/log/SessionTracker.java b/packages/SystemUI/src/com/android/systemui/log/SessionTracker.java index d848b431bcc9..e8ded03e3b38 100644 --- a/packages/SystemUI/src/com/android/systemui/log/SessionTracker.java +++ b/packages/SystemUI/src/com/android/systemui/log/SessionTracker.java @@ -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=" diff --git a/packages/SystemUI/src/com/android/systemui/process/ProcessWrapper.java b/packages/SystemUI/src/com/android/systemui/process/ProcessWrapper.java index b4cc196b89ed..294d0c75167a 100644 --- a/packages/SystemUI/src/com/android/systemui/process/ProcessWrapper.java +++ b/packages/SystemUI/src/com/android/systemui/process/ProcessWrapper.java @@ -16,6 +16,7 @@ package com.android.systemui.process; +import android.app.ActivityManager; import android.os.Process; import android.os.UserHandle; @@ -37,6 +38,13 @@ public class ProcessWrapper { } /** + * 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()}. * * This should not be used to get the "current" user. This information only applies to the diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index 03afcb77d88f..e68a4a57de75 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -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, diff --git a/packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java index fbeb6d8d0a6f..732bef1f9803 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/log/SessionTrackerTest.java @@ -44,6 +44,7 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.systemui.SysuiTestCase; import com.android.systemui.biometrics.AuthController; +import com.android.systemui.process.ProcessWrapper; import com.android.systemui.statusbar.policy.KeyguardStateController; import org.junit.Before; @@ -68,6 +69,8 @@ public class SessionTrackerTest extends SysuiTestCase { private KeyguardStateController mKeyguardStateController; @Mock private UiEventLogger mUiEventLogger; + @Mock + private ProcessWrapper mProcessWrapper; @Captor ArgumentCaptor<KeyguardUpdateMonitorCallback> mKeyguardUpdateMonitorCallbackCaptor; @@ -86,13 +89,15 @@ public class SessionTrackerTest extends SysuiTestCase { @Before public void setup() throws RemoteException { MockitoAnnotations.initMocks(this); + when(mProcessWrapper.isSystemUser()).thenReturn(true); mSessionTracker = new SessionTracker( mStatusBarService, mAuthController, mKeyguardUpdateMonitor, mKeyguardStateController, - mUiEventLogger + mUiEventLogger, + mProcessWrapper ); } |