diff options
author | 2021-02-17 21:12:16 +0000 | |
---|---|---|
committer | 2021-02-17 21:12:16 +0000 | |
commit | cf25028c7cdd25718e6c447e82d59fc3edb4bbfb (patch) | |
tree | da0a7e91a58442b8aefbf993dd34b6f3267e7331 | |
parent | 643b5784e9b67dd96d0e68a769e59cdfa10043bf (diff) | |
parent | 002e214afdb55b6d46b79d98e3d15be702638c65 (diff) |
Merge "New API: DevicePolicyManager.listForegroundAffiliatedUsers()" into sc-dev
4 files changed, 51 insertions, 5 deletions
diff --git a/core/api/current.txt b/core/api/current.txt index 376bab815b2d..5f9743aa5e73 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -7104,6 +7104,7 @@ package android.app.admin { method public boolean isUniqueDeviceAttestationSupported(); method public boolean isUsbDataSignalingEnabled(); method public boolean isUsingUnifiedPassword(@NonNull android.content.ComponentName); + method @NonNull public java.util.List<android.os.UserHandle> listForegroundAffiliatedUsers(); method public void lockNow(); method public void lockNow(int); method public int logoutUser(@NonNull android.content.ComponentName); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index 28242b08ca65..305c22446e90 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -13357,6 +13357,7 @@ public class DevicePolicyManager { } } } + /** * Returns true if the caller is running on a device where the admin can grant * permissions related to device sensors. @@ -13459,4 +13460,22 @@ public class DevicePolicyManager { } return false; } + + /** + * Gets the list of {@link #isAffiliatedUser() affiliated} users running on foreground. + * + * @return list of {@link #isAffiliatedUser() affiliated} users running on foreground. + * + * @throws SecurityException if the calling application is not a device owner + */ + @NonNull + public List<UserHandle> listForegroundAffiliatedUsers() { + if (mService == null) return Collections.emptyList(); + + try { + return mService.listForegroundAffiliatedUsers(); + } catch (RemoteException re) { + throw re.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 94388cfd41b9..91a9f3cff582 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -507,4 +507,6 @@ interface IDevicePolicyManager { boolean isUsbDataSignalingEnabled(String callerPackage); boolean isUsbDataSignalingEnabledForUser(int userId); boolean canUsbDataSignalingBeDisabled(); + + List<UserHandle> listForegroundAffiliatedUsers(); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 59ce30ac12a9..9250894d38a3 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -6453,7 +6453,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private void forceWipeUser(int userId, String wipeReasonForUser, boolean wipeSilently) { boolean success = false; try { - if (getCurrentForegroundUser() == userId) { + if (getCurrentForegroundUserId() == userId) { mInjector.getIActivityManager().switchUser(UserHandle.USER_SYSTEM); } @@ -7921,7 +7921,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Slog.i(LOG_TAG, "Device owner set: " + admin + " on user " + userId); if (mInjector.userManagerIsHeadlessSystemUserMode()) { - int currentForegroundUser = getCurrentForegroundUser(); + int currentForegroundUser = getCurrentForegroundUserId(); Slog.i(LOG_TAG, "setDeviceOwner(): setting " + admin + " as profile owner on user " + currentForegroundUser); // Sets profile owner on current foreground user since @@ -9052,7 +9052,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return UserHandle.isSameApp(caller.getUid(), Process.SHELL_UID); } - private @UserIdInt int getCurrentForegroundUser() { + private @UserIdInt int getCurrentForegroundUserId() { try { return mInjector.getIActivityManager().getCurrentUser().id; } catch (RemoteException e) { @@ -9061,6 +9061,25 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return UserHandle.USER_NULL; } + @Override + public List<UserHandle> listForegroundAffiliatedUsers() { + checkIsDeviceOwner(getCallerIdentity()); + + int userId = mInjector.binderWithCleanCallingIdentity(() -> getCurrentForegroundUserId()); + + boolean isAffiliated; + synchronized (getLockObject()) { + isAffiliated = isUserAffiliatedWithDeviceLocked(userId); + } + + if (!isAffiliated) return Collections.emptyList(); + + List<UserHandle> users = new ArrayList<>(1); + users.add(UserHandle.of(userId)); + + return users; + } + protected int getProfileParentId(int userHandle) { return mInjector.binderWithCleanCallingIdentity(() -> { UserInfo parentUser = mUserManager.getProfileParent(userHandle); @@ -12875,7 +12894,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return CODE_NONSYSTEM_USER_EXISTS; } - int currentForegroundUser = getCurrentForegroundUser(); + int currentForegroundUser = getCurrentForegroundUserId(); if (callingUserId != currentForegroundUser && mInjector.userManagerIsHeadlessSystemUserMode() && currentForegroundUser == UserHandle.USER_SYSTEM) { @@ -12971,6 +12990,11 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return CODE_OK; } + private void checkIsDeviceOwner(CallerIdentity caller) { + Preconditions.checkCallAuthorization(isDeviceOwner(caller), caller.getUid() + + " is not device owner"); + } + private ComponentName getOwnerComponent(String packageName, int userId) { if (isDeviceOwnerPackage(packageName, userId)) { return mOwners.getDeviceOwnerComponent(); @@ -15467,7 +15491,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { private boolean isLockTaskFeatureEnabled(int lockTaskFeature) throws RemoteException { //TODO(b/175285301): Explicitly get the user's identity to check. int lockTaskFeatures = - getUserData(getCurrentForegroundUser()).mLockTaskFeatures; + getUserData(getCurrentForegroundUserId()).mLockTaskFeatures; return (lockTaskFeatures & lockTaskFeature) == lockTaskFeature; } |