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

Commit 7a18b553 authored by ankiit's avatar ankiit
Browse files

Allow visibleBgUsers to use OverviewProxyService

 - Allows foreground-users to initialize OverviewProxyService when UserManager#isVisibleBackgroundUsersSupported is true.
 - Updated and Added new tests.

Bug: 347785484
Test: atest SystemUITests
Flag: EXEMPT bugfix

Change-Id: I2dee8035324b319b36a48c23dddbfbe6c522c097
parent d1b8291e
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Log;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
@@ -177,7 +178,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
    private boolean mBound;
    private boolean mIsEnabled;

    private boolean mIsNonPrimaryUser;
    private boolean mIsSystemOrVisibleBgUser;
    private int mCurrentBoundedUserId = -1;
    private boolean mInputFocusTransferStarted;
    private float mInputFocusTransferStartY;
@@ -629,6 +630,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
            SysUiState sysUiState,
            Provider<SceneInteractor> sceneInteractor,
            UserTracker userTracker,
            UserManager userManager,
            WakefulnessLifecycle wakefulnessLifecycle,
            UiEventLogger uiEventLogger,
            DisplayTracker displayTracker,
@@ -639,10 +641,18 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
            Optional<UnfoldTransitionProgressForwarder> unfoldTransitionProgressForwarder,
            BroadcastDispatcher broadcastDispatcher
    ) {
        // b/241601880: This component shouldn't be running for a non-primary user
        mIsNonPrimaryUser = !Process.myUserHandle().equals(UserHandle.SYSTEM);
        if (mIsNonPrimaryUser) {
            Log.wtf(TAG_OPS, "Unexpected initialization for non-primary user", new Throwable());
        // b/241601880: This component should only be running for primary users or
        // secondaryUsers when visibleBackgroundUsers are supported.
        boolean isSystemUser = Process.myUserHandle().equals(UserHandle.SYSTEM);
        boolean isVisibleBackgroundUser =
                userManager.isVisibleBackgroundUsersSupported() && !userManager.isUserForeground();
        if (!isSystemUser && isVisibleBackgroundUser) {
            Log.d(TAG_OPS, "Initialization for visibleBackgroundUser");
        }
        mIsSystemOrVisibleBgUser = isSystemUser || isVisibleBackgroundUser;
        if (!mIsSystemOrVisibleBgUser) {
            Log.wtf(TAG_OPS, "Unexpected initialization for non-system foreground user",
                    new Throwable());
        }

        mContext = context;
@@ -833,10 +843,11 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
    }

    private void internalConnectToCurrentUser(String reason) {
        if (mIsNonPrimaryUser) {
        if (!mIsSystemOrVisibleBgUser) {
            // This should not happen, but if any per-user SysUI component has a dependency on OPS,
            // then this could get triggered
            Log.w(TAG_OPS, "Skipping connection to overview service due to non-primary user "
            Log.w(TAG_OPS,
                    "Skipping connection to overview service due to non-system foreground user "
                            + "caller");
            return;
        }
+41 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.content.pm.ResolveInfo
import android.os.PowerManager
import android.os.Process
import android.os.UserHandle
import android.os.UserManager
import android.testing.TestableContext
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -108,6 +109,7 @@ class OverviewProxyServiceTest : SysuiTestCase() {
    @Mock private lateinit var navModeController: NavigationModeController
    @Mock private lateinit var statusBarWinController: NotificationShadeWindowController
    @Mock private lateinit var userTracker: UserTracker
    @Mock private lateinit var userManager: UserManager
    @Mock private lateinit var uiEventLogger: UiEventLogger
    @Mock private lateinit var sysuiUnlockAnimationController: KeyguardUnlockAnimationController
    @Mock
@@ -199,11 +201,12 @@ class OverviewProxyServiceTest : SysuiTestCase() {
    }

    @Test
    fun connectToOverviewService_primaryUser_expectBindService() {
    fun connectToOverviewService_primaryUserNoVisibleBgUsersSupported_expectBindService() {
        val mockitoSession =
            ExtendedMockito.mockitoSession().spyStatic(Process::class.java).startMocking()
        try {
            `when`(Process.myUserHandle()).thenReturn(UserHandle.SYSTEM)
            `when`(userManager.isVisibleBackgroundUsersSupported()).thenReturn(false)
            val spyContext = spy(context)
            val ops = createOverviewProxyService(spyContext)
            ops.startConnectionToCurrentUser()
@@ -214,11 +217,46 @@ class OverviewProxyServiceTest : SysuiTestCase() {
    }

    @Test
    fun connectToOverviewService_nonPrimaryUser_expectNoBindService() {
    fun connectToOverviewService_nonPrimaryUserNoVisibleBgUsersSupported_expectNoBindService() {
        val mockitoSession =
            ExtendedMockito.mockitoSession().spyStatic(Process::class.java).startMocking()
        try {
            `when`(Process.myUserHandle()).thenReturn(UserHandle.of(12345))
            `when`(userManager.isVisibleBackgroundUsersSupported()).thenReturn(false)
            val spyContext = spy(context)
            val ops = createOverviewProxyService(spyContext)
            ops.startConnectionToCurrentUser()
            verify(spyContext, times(0)).bindServiceAsUser(any(), any(), anyInt(), any())
        } finally {
            mockitoSession.finishMocking()
        }
    }

    @Test
    fun connectToOverviewService_nonPrimaryBgUserVisibleBgUsersSupported_expectBindService() {
        val mockitoSession =
            ExtendedMockito.mockitoSession().spyStatic(Process::class.java).startMocking()
        try {
            `when`(Process.myUserHandle()).thenReturn(UserHandle.of(12345))
            `when`(userManager.isVisibleBackgroundUsersSupported()).thenReturn(true)
            `when`(userManager.isUserForeground()).thenReturn(false)
            val spyContext = spy(context)
            val ops = createOverviewProxyService(spyContext)
            ops.startConnectionToCurrentUser()
            verify(spyContext, atLeast(1)).bindServiceAsUser(any(), any(), anyInt(), any())
        } finally {
            mockitoSession.finishMocking()
        }
    }

    @Test
    fun connectToOverviewService_nonPrimaryFgUserVisibleBgUsersSupported_expectNoBindService() {
        val mockitoSession =
            ExtendedMockito.mockitoSession().spyStatic(Process::class.java).startMocking()
        try {
            `when`(Process.myUserHandle()).thenReturn(UserHandle.of(12345))
            `when`(userManager.isVisibleBackgroundUsersSupported()).thenReturn(true)
            `when`(userManager.isUserForeground()).thenReturn(true)
            val spyContext = spy(context)
            val ops = createOverviewProxyService(spyContext)
            ops.startConnectionToCurrentUser()
@@ -242,6 +280,7 @@ class OverviewProxyServiceTest : SysuiTestCase() {
            sysUiState,
            mock(),
            userTracker,
            userManager,
            wakefulnessLifecycle,
            uiEventLogger,
            displayTracker,