Merge "Improved error code for Remove Result" into tm-dev

This commit is contained in:
Mayank Garg
2022-03-15 02:08:04 +00:00
committed by Android (Google) Code Review
5 changed files with 66 additions and 13 deletions

View File

@@ -9791,6 +9791,7 @@ package android.os {
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isManagedProfile(int);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS}, conditional=true) public boolean isMediaSharedWithParent();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS, android.Manifest.permission.QUERY_USERS}) public boolean isPrimaryUser();
method public static boolean isRemoveResultSuccessful(int);
method public boolean isRestrictedProfile();
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.CREATE_USERS}, conditional=true) public boolean isRestrictedProfile(@NonNull android.os.UserHandle);
method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.QUERY_USERS}) public boolean isSameProfileGroup(@NonNull android.os.UserHandle, @NonNull android.os.UserHandle);
@@ -9808,7 +9809,10 @@ package android.os {
field public static final String DISALLOW_RUN_IN_BACKGROUND = "no_run_in_background";
field public static final int REMOVE_RESULT_ALREADY_BEING_REMOVED = 2; // 0x2
field public static final int REMOVE_RESULT_DEFERRED = 1; // 0x1
field public static final int REMOVE_RESULT_ERROR = 3; // 0x3
field public static final int REMOVE_RESULT_ERROR_SYSTEM_USER = -4; // 0xfffffffc
field public static final int REMOVE_RESULT_ERROR_UNKNOWN = -1; // 0xffffffff
field public static final int REMOVE_RESULT_ERROR_USER_NOT_FOUND = -3; // 0xfffffffd
field public static final int REMOVE_RESULT_ERROR_USER_RESTRICTION = -2; // 0xfffffffe
field public static final int REMOVE_RESULT_REMOVED = 0; // 0x0
field public static final int RESTRICTION_NOT_SET = 0; // 0x0
field public static final int RESTRICTION_SOURCE_DEVICE_OWNER = 2; // 0x2

View File

@@ -1703,12 +1703,40 @@ public class UserManager {
/**
* A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
* an error occurred that prevented the user from being removed or set as ephemeral.
* an unknown error occurred that prevented the user from being removed or set as ephemeral.
*
* @hide
*/
@SystemApi
public static final int REMOVE_RESULT_ERROR = 3;
public static final int REMOVE_RESULT_ERROR_UNKNOWN = -1;
/**
* A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
* the user could not be removed due to a {@link #DISALLOW_REMOVE_MANAGED_PROFILE} or
* {@link #DISALLOW_REMOVE_USER} user restriction.
*
* @hide
*/
@SystemApi
public static final int REMOVE_RESULT_ERROR_USER_RESTRICTION = -2;
/**
* A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
* user being removed does not exist.
*
* @hide
*/
@SystemApi
public static final int REMOVE_RESULT_ERROR_USER_NOT_FOUND = -3;
/**
* A response code from {@link #removeUserWhenPossible(UserHandle, boolean)} indicating that
* user being removed is a {@link UserHandle#SYSTEM} user which can't be removed.
*
* @hide
*/
@SystemApi
public static final int REMOVE_RESULT_ERROR_SYSTEM_USER = -4;
/**
* Possible response codes from {@link #removeUserWhenPossible(UserHandle, boolean)}.
@@ -1719,7 +1747,10 @@ public class UserManager {
REMOVE_RESULT_REMOVED,
REMOVE_RESULT_DEFERRED,
REMOVE_RESULT_ALREADY_BEING_REMOVED,
REMOVE_RESULT_ERROR,
REMOVE_RESULT_ERROR_USER_RESTRICTION,
REMOVE_RESULT_ERROR_USER_NOT_FOUND,
REMOVE_RESULT_ERROR_SYSTEM_USER,
REMOVE_RESULT_ERROR_UNKNOWN,
})
@Retention(RetentionPolicy.SOURCE)
public @interface RemoveResult {}
@@ -4846,8 +4877,10 @@ public class UserManager {
* the {@link #DISALLOW_REMOVE_USER} or {@link #DISALLOW_REMOVE_MANAGED_PROFILE} restriction
*
* @return the {@link RemoveResult} code: {@link #REMOVE_RESULT_REMOVED},
* {@link #REMOVE_RESULT_DEFERRED}, {@link #REMOVE_RESULT_ALREADY_BEING_REMOVED}, or
* {@link #REMOVE_RESULT_ERROR}.
* {@link #REMOVE_RESULT_DEFERRED}, {@link #REMOVE_RESULT_ALREADY_BEING_REMOVED},
* {@link #REMOVE_RESULT_ERROR_USER_RESTRICTION}, {@link #REMOVE_RESULT_ERROR_USER_NOT_FOUND},
* {@link #REMOVE_RESULT_ERROR_SYSTEM_USER}, or {@link #REMOVE_RESULT_ERROR_UNKNOWN}. All error
* codes have negative values.
*
* @hide
*/
@@ -4863,6 +4896,19 @@ public class UserManager {
}
}
/**
* Check if {@link #removeUserWhenPossible} returned a success code which means that the user
* has been removed or is slated for removal.
*
* @param result is {@link #RemoveResult} code return by {@link #removeUserWhenPossible}.
* @return {@code true} if it is a success code.
* @hide
*/
@SystemApi
public static boolean isRemoveResultSuccessful(@RemoveResult int result) {
return result >= 0;
}
/**
* Updates the user's name.
*

View File

@@ -131,7 +131,7 @@ public class MasterClearReceiver extends BroadcastReceiver {
final UserManager userManager = context.getSystemService(UserManager.class);
final int result = userManager.removeUserWhenPossible(
UserHandle.of(userId), /* overrideDevicePolicy= */ false);
if (result == UserManager.REMOVE_RESULT_ERROR) {
if (!UserManager.isRemoveResultSuccessful(result)) {
Slogf.e(TAG, "Can't remove user %d", userId);
return false;
}

View File

@@ -4638,12 +4638,12 @@ public class UserManagerService extends IUserManager.Stub {
final String restriction = getUserRemovalRestriction(userId);
if (getUserRestrictions(UserHandle.getCallingUserId()).getBoolean(restriction, false)) {
Slog.w(LOG_TAG, "Cannot remove user. " + restriction + " is enabled.");
return UserManager.REMOVE_RESULT_ERROR;
return UserManager.REMOVE_RESULT_ERROR_USER_RESTRICTION;
}
}
if (userId == UserHandle.USER_SYSTEM) {
Slog.e(LOG_TAG, "System user cannot be removed.");
return UserManager.REMOVE_RESULT_ERROR;
return UserManager.REMOVE_RESULT_ERROR_SYSTEM_USER;
}
final long ident = Binder.clearCallingIdentity();
@@ -4655,7 +4655,7 @@ public class UserManagerService extends IUserManager.Stub {
if (userData == null) {
Slog.e(LOG_TAG,
"Cannot remove user " + userId + ", invalid user id provided.");
return UserManager.REMOVE_RESULT_ERROR;
return UserManager.REMOVE_RESULT_ERROR_USER_NOT_FOUND;
}
if (mRemovingUserIds.get(userId)) {

View File

@@ -316,7 +316,8 @@ public final class UserManagerTest {
asHandle(currentUser));
try {
assertThat(mUserManager.removeUserWhenPossible(user1.getUserHandle(),
/* overrideDevicePolicy= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR);
/* overrideDevicePolicy= */ false))
.isEqualTo(UserManager.REMOVE_RESULT_ERROR_USER_RESTRICTION);
} finally {
mUserManager.setUserRestriction(UserManager.DISALLOW_REMOVE_USER, /* value= */ false,
asHandle(currentUser));
@@ -353,7 +354,8 @@ public final class UserManagerTest {
@Test
public void testRemoveUserWhenPossible_systemUserReturnsError() throws Exception {
assertThat(mUserManager.removeUserWhenPossible(UserHandle.SYSTEM,
/* overrideDevicePolicy= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR);
/* overrideDevicePolicy= */ false))
.isEqualTo(UserManager.REMOVE_RESULT_ERROR_SYSTEM_USER);
assertThat(hasUser(UserHandle.USER_SYSTEM)).isTrue();
}
@@ -363,7 +365,8 @@ public final class UserManagerTest {
public void testRemoveUserWhenPossible_invalidUserReturnsError() throws Exception {
assertThat(hasUser(Integer.MAX_VALUE)).isFalse();
assertThat(mUserManager.removeUserWhenPossible(UserHandle.of(Integer.MAX_VALUE),
/* overrideDevicePolicy= */ false)).isEqualTo(UserManager.REMOVE_RESULT_ERROR);
/* overrideDevicePolicy= */ false))
.isEqualTo(UserManager.REMOVE_RESULT_ERROR_USER_NOT_FOUND);
}
@MediumTest