diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/DisplayContent.java | 4 | ||||
| -rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java | 37 |
2 files changed, 41 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 95ec75ca172c..eb5e0fc85921 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -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); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 7356b4376e8a..cd8924a2848e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -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, |