Merge changes from topics "isCommunalProfileAPI", "isForegroundUserAnAdmin" into main
* changes:
isForegroundUserAdmin public API
Public isCommunalProfile() API
diff --git a/core/api/current.txt b/core/api/current.txt
index cce8329..18001e8 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -33455,7 +33455,9 @@
method @RequiresPermission(anyOf={"android.permission.MANAGE_USERS", "android.permission.INTERACT_ACROSS_USERS"}, conditional=true) public android.os.Bundle getUserRestrictions(android.os.UserHandle);
method public boolean hasUserRestriction(String);
method public boolean isAdminUser();
+ method @FlaggedApi("android.multiuser.support_communal_profile") public boolean isCommunalProfile();
method public boolean isDemoUser();
+ method @FlaggedApi("android.multiuser.support_communal_profile_nextgen") public boolean isForegroundUserAdmin();
method public static boolean isHeadlessSystemUserMode();
method public boolean isManagedProfile();
method public boolean isProfile();
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 83234a5..83b6880 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -2357,6 +2357,7 @@
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.content.pm.UserInfo createUser(@Nullable String, @NonNull String, int);
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public java.util.List<android.content.pm.UserInfo> getAliveUsers();
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public android.os.UserHandle getBootUser();
+ method @FlaggedApi("android.multiuser.support_communal_profile") @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS, android.Manifest.permission.QUERY_USERS}) public android.os.UserHandle getCommunalProfile();
method public int getMainDisplayIdAssignedToUser();
method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}) public java.util.Set<java.lang.String> getPreInstallableSystemPackages(@NonNull String);
method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS, android.Manifest.permission.QUERY_USERS}) public String getUserType();
diff --git a/core/java/android/content/pm/multiuser.aconfig b/core/java/android/content/pm/multiuser.aconfig
index 3ec239c..43cf97f 100644
--- a/core/java/android/content/pm/multiuser.aconfig
+++ b/core/java/android/content/pm/multiuser.aconfig
@@ -28,3 +28,10 @@
description: "Framework support for communal profile."
bug: "285426179"
}
+
+flag {
+ name: "support_communal_profile_nextgen"
+ namespace: "multiuser"
+ description: "Further framework support for communal profile, beyond the basics, for later releases."
+ bug: "285426179"
+}
diff --git a/core/java/android/os/IUserManager.aidl b/core/java/android/os/IUserManager.aidl
index 839c56f..330b992 100644
--- a/core/java/android/os/IUserManager.aidl
+++ b/core/java/android/os/IUserManager.aidl
@@ -137,6 +137,7 @@
boolean isUserVisible(int userId);
int[] getVisibleUsers();
int getMainDisplayIdAssignedToUser();
+ boolean isForegroundUserAdmin();
boolean isUserNameSet(int userId);
boolean hasRestrictedProfiles(int userId);
boolean requestQuietModeEnabled(String callingPackage, boolean enableQuietMode, int userId, in IntentSender target, int flags);
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index 72bc211..cc79ae3 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -2774,6 +2774,8 @@
* Returns the designated "communal profile" of the device, or {@code null} if there is none.
* @hide
*/
+ @FlaggedApi(android.multiuser.Flags.FLAG_SUPPORT_COMMUNAL_PROFILE)
+ @TestApi
@RequiresPermission(anyOf = {
Manifest.permission.MANAGE_USERS,
Manifest.permission.CREATE_USERS,
@@ -2791,16 +2793,33 @@
}
/**
+ * Checks if the context user is running in a communal profile.
+ *
+ * A communal profile is a {@link #isProfile() profile}, but instead of being associated with a
+ * particular parent user, it is communal to the device.
+ *
+ * @return whether the context user is a communal profile.
+ */
+ @FlaggedApi(android.multiuser.Flags.FLAG_SUPPORT_COMMUNAL_PROFILE)
+ @UserHandleAware(
+ requiresAnyOfPermissionsIfNotCallerProfileGroup = {
+ android.Manifest.permission.MANAGE_USERS,
+ android.Manifest.permission.QUERY_USERS,
+ android.Manifest.permission.INTERACT_ACROSS_USERS})
+ public boolean isCommunalProfile() {
+ return isCommunalProfile(mUserId);
+ }
+
+ /**
* Returns {@code true} if the given user is the designated "communal profile" of the device.
* @hide
*/
@RequiresPermission(anyOf = {
- Manifest.permission.MANAGE_USERS,
- Manifest.permission.CREATE_USERS,
- Manifest.permission.QUERY_USERS})
- public boolean isCommunalProfile(@UserIdInt int userId) {
- final UserInfo user = getUserInfo(userId);
- return user != null && user.isCommunalProfile();
+ android.Manifest.permission.MANAGE_USERS,
+ android.Manifest.permission.QUERY_USERS,
+ android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional = true)
+ private boolean isCommunalProfile(@UserIdInt int userId) {
+ return isUserTypeCommunalProfile(getProfileType(userId));
}
/**
@@ -2840,6 +2859,23 @@
}
/**
+ * Used to check if the user currently running in the <b>foreground</b> is an
+ * {@link #isAdminUser() admin} user.
+ *
+ * @return whether the foreground user is an admin user.
+ * @see #isAdminUser()
+ * @see #isUserForeground()
+ */
+ @FlaggedApi(android.multiuser.Flags.FLAG_SUPPORT_COMMUNAL_PROFILE_NEXTGEN)
+ public boolean isForegroundUserAdmin() {
+ try {
+ return mService.isForegroundUserAdmin();
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns whether the context user is of the given user type.
*
* @param userType the name of the user's user type, e.g.
@@ -2997,7 +3033,7 @@
}
/**
- * Checks if the calling context user can have a restricted profile.
+ * Checks if the context user can have a restricted profile.
* @return whether the context user can have a restricted profile.
* @hide
*/
@@ -3101,11 +3137,11 @@
}
/**
- * Checks if the calling context user is running in a profile. A profile is a user that
+ * Checks if the context user is running in a profile. A profile is a user that
* typically has its own separate data but shares its UI with some parent user. For example, a
* {@link #isManagedProfile() managed profile} is a type of profile.
*
- * @return whether the caller is in a profile.
+ * @return whether the context user is in a profile.
*/
@UserHandleAware(
requiresAnyOfPermissionsIfNotCallerProfileGroup = {
@@ -5247,7 +5283,7 @@
/**
* Returns the parent of the profile which this method is called from
- * or null if called from a user that is not a profile.
+ * or null if it has no parent (e.g. if it is not a profile).
*
* @hide
*/
@@ -5269,7 +5305,7 @@
*
* @param user the handle of the user profile
*
- * @return the parent of the user or {@code null} if the user is not profile
+ * @return the parent of the user or {@code null} if the user has no parent
*
* @hide
*/
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 978d8e4..3430bb4d 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -2138,6 +2138,19 @@
}
@Override
+ public boolean isForegroundUserAdmin() {
+ // No permission requirements for this API.
+ synchronized (mUsersLock) {
+ final int currentUserId = getCurrentUserId();
+ if (currentUserId != UserHandle.USER_NULL) {
+ final UserInfo userInfo = getUserInfoLU(currentUserId);
+ return userInfo != null && userInfo.isAdmin();
+ }
+ }
+ return false;
+ }
+
+ @Override
public @NonNull String getUserName() {
final int callingUid = Binder.getCallingUid();
if (!hasQueryOrCreateUsersPermission()