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
This commit is contained in:
Felipe Leme
2022-07-21 14:48:22 -07:00
parent ef6654ea7c
commit 36e74d4db8
4 changed files with 32 additions and 0 deletions

View File

@@ -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);

View File

@@ -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);

View File

@@ -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>

View File

@@ -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();