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

Commit 4fcb05c5 authored by Felipe Leme's avatar Felipe Leme
Browse files

New @SystemApi: UserManager.getVisibleUsers()

Test: atest CtsMultiUserTestCases:android.multiuser.cts.UserManagerTest
Test: m update-api

Fixes: 242801948

Change-Id: I5ca52e6705662b7e3939101890bb81345a5a831e
parent de47d504
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -32267,6 +32267,7 @@ package android.os {
    method @NonNull @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.QUERY_USERS", "android.permission.INTERACT_ACROSS_USERS"}, conditional=true) public android.content.pm.UserProperties getUserProperties(@NonNull android.os.UserHandle);
    method public android.os.Bundle getUserRestrictions();
    method @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.INTERACT_ACROSS_USERS"}, conditional=true) public android.os.Bundle getUserRestrictions(android.os.UserHandle);
    method @NonNull @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.INTERACT_ACROSS_USERS"}) public java.util.List<android.os.UserHandle> getVisibleUsers();
    method public boolean hasUserRestriction(String);
    method public boolean isDemoUser();
    method public static boolean isHeadlessSystemUserMode();
+1 −0
Original line number Diff line number Diff line
@@ -128,6 +128,7 @@ interface IUserManager {
    boolean isUserRunning(int userId);
    boolean isUserForeground(int userId);
    boolean isUserVisible(int userId);
    List<UserHandle> getVisibleUsers();
    boolean isUserNameSet(int userId);
    boolean hasRestrictedProfiles(int userId);
    boolean requestQuietModeEnabled(String callingPackage, boolean enableQuietMode, int userId, in IntentSender target, int flags);
+15 −0
Original line number Diff line number Diff line
@@ -2884,6 +2884,21 @@ public class UserManager {
        }
    }

    /**
     * Gets the visible users (as defined by {@link #isUserVisible()}.
     *
     * @return visible users at the moment.
     */
    @RequiresPermission(anyOf = {Manifest.permission.MANAGE_USERS,
            Manifest.permission.INTERACT_ACROSS_USERS})
    public @NonNull List<UserHandle> getVisibleUsers() {
        try {
            return mService.getVisibleUsers();
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
    }

    /**
     * Return whether the context user is running in an "unlocked" state.
     * <p>
+27 −1
Original line number Diff line number Diff line
@@ -910,7 +910,7 @@ public class UserManagerService extends IUserManager.Stub {
    private @NonNull List<UserInfo> getUsersInternal(boolean excludePartial, boolean excludeDying,
            boolean excludePreCreated) {
        synchronized (mUsersLock) {
            ArrayList<UserInfo> users = new ArrayList<UserInfo>(mUsers.size());
            ArrayList<UserInfo> users = new ArrayList<>(mUsers.size());
            final int userSize = mUsers.size();
            for (int i = 0; i < userSize; i++) {
                UserInfo ui = mUsers.valueAt(i).info;
@@ -1765,6 +1765,32 @@ public class UserManagerService extends IUserManager.Stub {
        }
    }

    @Override
    public List<UserHandle> getVisibleUsers() {
        if (!hasManageUsersOrPermission(android.Manifest.permission.INTERACT_ACROSS_USERS)) {
            throw new SecurityException("Caller needs MANAGE_USERS or INTERACT_ACROSS_USERS "
                    + "permission to get list of visible users");
        }
        final long ident = Binder.clearCallingIdentity();
        try {
            // TODO(b/2399825580): refactor into UserDisplayAssigner
            synchronized (mUsersLock) {
                int usersSize = mUsers.size();
                ArrayList<UserHandle> visibleUsers = new ArrayList<>(usersSize);
                for (int i = 0; i < usersSize; i++) {
                    UserInfo ui = mUsers.valueAt(i).info;
                    if (!ui.partial && !ui.preCreated && !mRemovingUserIds.get(ui.id)
                            && isUserVisibleUnchecked(ui.id)) {
                        visibleUsers.add(UserHandle.of(ui.id));
                    }
                }
                return visibleUsers;
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }

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