From b4fe247823f1b251db2d6c190cc7063269e243ac Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Mon, 21 Jun 2021 10:43:00 +0100 Subject: [PATCH] DPM.isUsbDataSignalingEnabled() callable on unmanaged device Fix an issue in existing implementation where the API will throw exception when called on a device without DO or PO: a slight tweak of semantics such that when the API is called by a regular app, return the device-wide policy regardless which user the caller is from. Bug: 190024751 Test: manual with modifed TestDPC on unmanaged device. Change-Id: I227d01ec275bc0a074a3789bab194c76fc72b5b8 --- .../app/admin/DevicePolicyManager.java | 6 +++++- .../DevicePolicyManagerService.java | 21 +++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index cb2a45ddc6245..851ebac360847 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -13876,7 +13876,11 @@ public class DevicePolicyManager { } /** - * Returns whether USB data signaling is currently enabled by the admin. Callable by any app. + * Returns whether USB data signaling is currently enabled. + * + *

When called by a device owner or profile owner of an organization-owned managed profile, + * this API returns whether USB data signaling is currently enabled by that admin. When called + * by any other app, returns whether USB data signaling is currently enabled on the device. * * @return {@code true} if USB data signaling is enabled, {@code false} otherwise. */ diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 9a35738744710..69ace1b06e4fc 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -17462,10 +17462,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { @Override public boolean isUsbDataSignalingEnabled(String packageName) { + final CallerIdentity caller = getCallerIdentity(packageName); synchronized (getLockObject()) { - final ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked( - getCallerIdentity(packageName)); - return admin.mUsbDataSignalingEnabled; + // If the caller is an admin, return the policy set by itself. Otherwise + // return the device-wide policy. + if (isDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller)) { + return getProfileOwnerOrDeviceOwnerLocked(caller).mUsbDataSignalingEnabled; + } else { + return isUsbDataSignalingEnabledInternalLocked(); + } } } @@ -17475,12 +17480,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { Preconditions.checkCallAuthorization(isSystemUid(caller)); synchronized (getLockObject()) { - final ActiveAdmin admin = getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked( - UserHandle.USER_SYSTEM); - return admin == null || admin.mUsbDataSignalingEnabled; + return isUsbDataSignalingEnabledInternalLocked(); } } + private boolean isUsbDataSignalingEnabledInternalLocked() { + final ActiveAdmin admin = getDeviceOwnerOrProfileOwnerOfOrganizationOwnedDeviceLocked( + UserHandle.USER_SYSTEM); + return admin == null || admin.mUsbDataSignalingEnabled; + } + @Override public boolean canUsbDataSignalingBeDisabled() { return mInjector.binderWithCleanCallingIdentity(() ->