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

Commit 4ab0f4fe authored by Felipe Leme's avatar Felipe Leme Committed by Yuncheol Heo
Browse files

Temporary fix on isUserVisibleOnDisplay(userId, displayId).

WM will use this API, but the current implementation would break
the behavior on non-passenger displays (like cluster, display, or
virtual displays).

So, this CL is (temporarily) changing the API to always return true
for the current user (and its profiles), regardless of the display;
the long-term solution would require integrating UserManagerService
with DisplayManagerService for displays management.

Also added a UserManagerInternal.isUserVisible(userId) method (which
will be used by WM during Activity transition).

Test: adb shell am start-user --display 42 13 && \
      adb shell cmd user is-user-visible --display 42 0
Bug: 244644281

Change-Id: I5330016e0123e85c0f2ab3fc24a4f683994fdfe8
parent 7a1bfdd0
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -329,6 +329,12 @@ public abstract class UserManagerInternal {
     */
    public abstract void unassignUserFromDisplay(@UserIdInt int userId);

    /**
     * Returns {@code true} if the user is visible (as defined by
     * {@link UserManager#isUserVisible()}.
     */
    public abstract boolean isUserVisible(@UserIdInt int userId);

    /**
     * Returns {@code true} if the user is visible (as defined by
     * {@link UserManager#isUserVisible()} in the given display.
+12 −0
Original line number Diff line number Diff line
@@ -1770,6 +1770,13 @@ public class UserManagerService extends IUserManager.Stub {

    // TODO(b/239982558): try to merge with isUserVisibleUnchecked() (once both are unit tested)
    boolean isUserVisibleOnDisplay(@UserIdInt int userId, int displayId) {
        // TODO(b/244644281): temporary workaround to let WM use this API without breaking current
        // behavior (otherwise current user / profiles wouldn't be able to launch activities on
        // other non-passenger displays, like cluster, display, or virtual displays)
        if (isCurrentUserOrRunningProfileOfCurrentUser(userId)) {
            return true;
        }

        if (displayId == Display.DEFAULT_DISPLAY) {
            return isCurrentUserOrRunningProfileOfCurrentUser(userId);
        }
@@ -6727,6 +6734,11 @@ public class UserManagerService extends IUserManager.Stub {
            }
        }

        @Override
        public boolean isUserVisible(int userId) {
            return isUserVisibleUnchecked(userId);
        }

        @Override
        public boolean isUserVisible(int userId, int displayId) {
            return isUserVisibleOnDisplay(userId, displayId);