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

Commit b51b1114 authored by Yuncheol Heo's avatar Yuncheol Heo
Browse files

Skip the user visibility check for private displays

UserManager doesn't track the user visibility for private displays and
it's enough to check if the given uid has the access.

Fix: 338139109
Bug: 312321592
Test: atest CtsCarBuiltinApiTestCases in cf_x86_64_only_auto_md
Test: atest WmTests:DisplayContentTests
Change-Id: I0568a413ada1511543d859649fc0d9e2a370d726
parent 8102e165
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -2713,6 +2713,10 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
        if (!mVisibleBackgroundUserEnabled) {
            return true;
        }
        if (isPrivate()) {
            // UserManager doesn't track the user visibility for private displays.
            return true;
        }
        final int userId = UserHandle.getUserId(uid);
        return userId == UserHandle.USER_SYSTEM
                || mWmService.mUmInternal.isUserVisible(userId, mDisplayId);
+37 −0
Original line number Diff line number Diff line
@@ -114,6 +114,8 @@ import android.metrics.LogMaker;
import android.os.Binder;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.flag.junit.CheckFlagsRule;
@@ -2813,6 +2815,41 @@ public class DisplayContentTests extends WindowTestsBase {
                mDisplayContent.getKeepClearAreas());
    }

    @Test
    public void testHasAccessConsidersUserVisibilityForBackgroundVisibleUsers() {
        doReturn(true).when(() -> UserManager.isVisibleBackgroundUsersEnabled());
        final int appId = 1234;
        final int userId1 = 11;
        final int userId2 = 12;
        final int uid1 = UserHandle.getUid(userId1, appId);
        final int uid2 = UserHandle.getUid(userId2, appId);
        final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo);
        final DisplayContent dc = createNewDisplay(displayInfo);
        int displayId = dc.getDisplayId();
        doReturn(true).when(mWm.mUmInternal).isUserVisible(userId1, displayId);
        doReturn(false).when(mWm.mUmInternal).isUserVisible(userId2, displayId);

        assertTrue(dc.hasAccess(uid1));
        assertFalse(dc.hasAccess(uid2));
    }

    @Test
    public void testHasAccessIgnoresUserVisibilityForPrivateDisplay() {
        doReturn(true).when(() -> UserManager.isVisibleBackgroundUsersEnabled());
        final int appId = 1234;
        final int userId2 = 12;
        final int uid2 = UserHandle.getUid(userId2, appId);
        final DisplayInfo displayInfo = new DisplayInfo(mDisplayInfo);
        displayInfo.flags = FLAG_PRIVATE;
        displayInfo.ownerUid = uid2;
        final DisplayContent dc = createNewDisplay(displayInfo);
        int displayId = dc.getDisplayId();

        assertTrue(dc.hasAccess(uid2));

        verify(mWm.mUmInternal, never()).isUserVisible(userId2, displayId);
    }

    private void removeRootTaskTests(Runnable runnable) {
        final TaskDisplayArea taskDisplayArea = mRootWindowContainer.getDefaultTaskDisplayArea();
        final Task rootTask1 = taskDisplayArea.createRootTask(WINDOWING_MODE_FULLSCREEN,