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

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

Check the user visibility only when visible background user is enabled

In phone, it allows to add a window while a user is stopping, the new
visibility check could break this behavior, so we'd like to keep the
behavior in the device where visibile background user is disabled.

Bug: 332890402
Test: atest WmTests:WindowManagerServiceTests
Change-Id: I0b1d9460cfbab57ab06659238d97510112fff390
parent ea404728
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.WorkSource;
import android.provider.Settings;
import android.util.ArrayMap;
@@ -289,6 +290,9 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp

    static final float INVALID_DPI = 0.0f;

    private final boolean mVisibleBackgroundUserEnabled =
            UserManager.isVisibleBackgroundUsersEnabled();

    @IntDef(prefix = { "FORCE_SCALING_MODE_" }, value = {
            FORCE_SCALING_MODE_AUTO,
            FORCE_SCALING_MODE_DISABLED
@@ -2698,11 +2702,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
     * Returns true if the specified UID has access to this display.
     */
    boolean hasAccess(int uid) {
        int userId = UserHandle.getUserId(uid);
        boolean isUserVisibleOnDisplay = mWmService.mUmInternal.isUserVisible(
                userId, mDisplayId);
        return mDisplay.hasAccess(uid)
                && (userId == UserHandle.USER_SYSTEM || isUserVisibleOnDisplay);
        if (!mDisplay.hasAccess(uid)) {
            return false;
        }
        if (!mVisibleBackgroundUserEnabled) {
            return true;
        }
        final int userId = UserHandle.getUserId(uid);
        return userId == UserHandle.USER_SYSTEM
                || mWmService.mUmInternal.isUserVisible(userId, mDisplayId);
    }

    boolean isPrivate() {
+2 −0
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
import android.os.StrictMode;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.util.Log;
import android.view.DisplayInfo;
@@ -194,6 +195,7 @@ public class SystemServicesTestRule implements TestRule {
        mMockitoSession = mockitoSession()
                .mockStatic(LocalServices.class, spyStubOnly)
                .mockStatic(DeviceConfig.class, spyStubOnly)
                .mockStatic(UserManager.class, spyStubOnly)
                .mockStatic(SurfaceControl.class, mockStubOnly)
                .mockStatic(DisplayControl.class, mockStubOnly)
                .mockStatic(LockGuard.class, mockStubOnly)
+4 −2
Original line number Diff line number Diff line
@@ -25,7 +25,6 @@ import static android.permission.flags.Flags.FLAG_SENSITIVE_NOTIFICATION_APP_PRO
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.Display.FLAG_OWN_FOCUS;
import static android.view.Display.INVALID_DISPLAY;
import static android.view.flags.Flags.FLAG_SENSITIVE_CONTENT_APP_PROTECTION;
import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
import static android.view.WindowManager.LayoutParams.INPUT_FEATURE_SENSITIVE_FOR_TRACING;
@@ -38,6 +37,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
import static android.view.flags.Flags.FLAG_SENSITIVE_CONTENT_APP_PROTECTION;
import static android.window.DisplayAreaOrganizer.FEATURE_VENDOR_FIRST;

import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer;
@@ -82,6 +82,7 @@ import android.os.InputConfig;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
import android.platform.test.annotations.RequiresFlagsDisabled;
import android.platform.test.annotations.RequiresFlagsEnabled;
@@ -1302,7 +1303,8 @@ public class WindowManagerServiceTests extends WindowTestsBase {
    }

    @Test
    public void testAddOverlayWindowToUnassignedDisplay_notAllowed() {
    public void testAddOverlayWindowToUnassignedDisplay_notAllowed_ForVisibleBackgroundUsers() {
        doReturn(true).when(() -> UserManager.isVisibleBackgroundUsersEnabled());
        int uid = 100000; // uid for non-system user
        Session session = createTestSession(mAtm, 1234 /* pid */, uid);
        DisplayContent dc = createNewDisplay();