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

Commit 36e74d4d authored by Felipe Leme's avatar Felipe Leme
Browse files

Initial implementation of UserManager.isUserVisible().

This API will be used to determine if the user is interacting with
the device and hence is able to do stuff like launching activities.

This initial version only returns true for the current foreground
user, but it will be expanded to also return true for:

- Background users associated with secondary displays
- (Running) profile of other visible users

Test: atest CtsMultiUserTestCases:android.multiuser.cts.UserManagerTest#testIsUserVisible_currentUser
Test: manual verification with Automotive's KitchenSink
Test: m update-api
Bug: 239824814

Change-Id: Ie8da07f69898d2b376bcf60d1da4221aed03ee3b
parent ef6654ea
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -32263,6 +32263,7 @@ package android.os {
    method @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.INTERACT_ACROSS_USERS"}, conditional=true) public boolean isUserRunningOrStopping(android.os.UserHandle);
    method public boolean isUserUnlocked();
    method @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.INTERACT_ACROSS_USERS"}, conditional=true) public boolean isUserUnlocked(android.os.UserHandle);
    method public boolean isUserVisible();
    method @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.MODIFY_QUIET_MODE"}, conditional=true) public boolean requestQuietModeEnabled(boolean, @NonNull android.os.UserHandle);
    method public boolean requestQuietModeEnabled(boolean, @NonNull android.os.UserHandle, int);
    method @Deprecated public boolean setRestrictionsChallenge(String);
+1 −0
Original line number Diff line number Diff line
@@ -125,6 +125,7 @@ interface IUserManager {
    boolean isUserUnlocked(int userId);
    boolean isUserRunning(int userId);
    boolean isUserForeground(int userId);
    boolean isUserVisible(int userId);
    boolean isUserNameSet(int userId);
    boolean hasRestrictedProfiles(int userId);
    boolean requestQuietModeEnabled(String callingPackage, boolean enableQuietMode, int userId, in IntentSender target, int flags);
+24 −0
Original line number Diff line number Diff line
@@ -2857,6 +2857,30 @@ public class UserManager {
        return isUsersOnSecondaryDisplaysEnabled();
    }

    /**
     * Checks if the user is visible at the moment.
     *
     * <p>Roughly speaking, a "visible user" is a user that can present UI on at least one display.
     * It includes:
     *
     * <ol>
     *   <li>The current foreground user in the main display.
     *   <li>Current background users in secondary displays (for example, passenger users on
     *   automotive, using the display associated with their seats).
     *   <li>Profile users (in the running / started state) of other visible users.
     * </ol>
     *
     * @return whether the user is visible at the moment, as defined above.
     */
    @UserHandleAware
    public boolean isUserVisible() {
        try {
            return mService.isUserVisible(mUserId);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
    }

    /**
     * Return whether the context user is running in an "unlocked" state.
     * <p>
+6 −0
Original line number Diff line number Diff line
@@ -1654,6 +1654,12 @@ public class UserManagerService extends IUserManager.Stub {
        return currentUser == userId;
    }

    @Override
    public boolean isUserVisible(@UserIdInt int userId) {
        // TODO(b/239824814): implement other cases like bg user, profile, user on secondary display
        return isUserForeground(userId);
    }

    @Override
    public @NonNull String getUserName() {
        final int callingUid = Binder.getCallingUid();