Merge "New @SystemApi: UserManager.getVisibleUsers()"

This commit is contained in:
Felipe Leme
2022-08-24 20:06:21 +00:00
committed by Android (Google) Code Review
4 changed files with 44 additions and 1 deletions

View File

@@ -32264,6 +32264,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();

View File

@@ -129,6 +129,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);

View File

@@ -2885,6 +2885,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>

View File

@@ -911,7 +911,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;
@@ -1766,6 +1766,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();