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
diff --git a/services/core/java/com/android/server/pm/UserManagerInternal.java b/services/core/java/com/android/server/pm/UserManagerInternal.java
index abc0ee4..a1d5054 100644
--- a/services/core/java/com/android/server/pm/UserManagerInternal.java
+++ b/services/core/java/com/android/server/pm/UserManagerInternal.java
@@ -331,6 +331,12 @@
 
     /**
      * 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.
      */
     public abstract boolean isUserVisible(@UserIdInt int userId, int displayId);
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index ab40a4f..a3bca4c 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1770,6 +1770,13 @@
 
     // 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);
         }
@@ -6728,6 +6735,11 @@
         }
 
         @Override
+        public boolean isUserVisible(int userId) {
+            return isUserVisibleUnchecked(userId);
+        }
+
+        @Override
         public boolean isUserVisible(int userId, int displayId) {
             return isUserVisibleOnDisplay(userId, displayId);
         }