diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 1dfd4f9fa4840..26c66314056b9 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -540,6 +540,7 @@ package android.app.admin { field public static final String PERMITTED_INPUT_METHODS_POLICY = "permittedInputMethods"; field public static final String PERSONAL_APPS_SUSPENDED_POLICY = "personalAppsSuspended"; field public static final String SCREEN_CAPTURE_DISABLED_POLICY = "screenCaptureDisabled"; + field public static final String USB_DATA_SIGNALING_POLICY = "usbDataSignaling"; } public class DevicePolicyManager { diff --git a/core/java/android/app/admin/DevicePolicyIdentifiers.java b/core/java/android/app/admin/DevicePolicyIdentifiers.java index aeac59b12a2e9..ad0af72c72b44 100644 --- a/core/java/android/app/admin/DevicePolicyIdentifiers.java +++ b/core/java/android/app/admin/DevicePolicyIdentifiers.java @@ -159,6 +159,14 @@ public final class DevicePolicyIdentifiers { */ public static final String CROSS_PROFILE_WIDGET_PROVIDER_POLICY = "crossProfileWidgetProvider"; + /** + * String identifier for {@link DevicePolicyManager#setUsbDataSignalingEnabled}. + * + * @hide + */ + @TestApi + public static final String USB_DATA_SIGNALING_POLICY = "usbDataSignaling"; + /** * @hide */ diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index da5e40aedbd21..f01dee5c758ad 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -16585,10 +16585,28 @@ public class DevicePolicyManager { * {@link #canUsbDataSignalingBeDisabled()} to check whether enabling or disabling USB data * signaling is supported on the device. * + * Starting from {@link Build.VERSION_CODES#VANILLA_ICE_CREAM}, after the USB data signaling + * policy has been set, {@link PolicyUpdateReceiver#onPolicySetResult(Context, String, + * Bundle, TargetUser, PolicyUpdateResult)} will notify the admin on whether the policy was + * successfully set or not. This callback will contain: + * + * If there has been a change to the policy, + * {@link PolicyUpdateReceiver#onPolicyChanged(Context, String, Bundle, TargetUser, + * PolicyUpdateResult)} will notify the admin of this change. This callback will contain the + * same parameters as PolicyUpdateReceiver#onPolicySetResult and the {@link PolicyUpdateResult} + * will contain the reason why the policy changed. + * * @param enabled whether USB data signaling should be enabled or not. * @throws SecurityException if the caller is not permitted to set this policy * @throws IllegalStateException if disabling USB data signaling is not supported or - * if USB data signaling fails to be enabled/disabled. + * if USB data signaling fails to be enabled/disabled. */ @RequiresPermission(value = MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING, conditional = true) public void setUsbDataSignalingEnabled(boolean enabled) { @@ -16623,25 +16641,6 @@ public class DevicePolicyManager { return true; } - /** - * Called by the system to check whether USB data signaling is currently enabled for this user. - * - * @param userId which user to check for. - * @return {@code true} if USB data signaling is enabled, {@code false} otherwise. - * @hide - */ - public boolean isUsbDataSignalingEnabledForUser(@UserIdInt int userId) { - throwIfParentInstance("isUsbDataSignalingEnabledForUser"); - if (mService != null) { - try { - return mService.isUsbDataSignalingEnabledForUser(userId); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - return true; - } - /** * Returns whether enabling or disabling USB data signaling is supported on the device. * diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 003e804831a48..95ec89e5f444d 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -565,7 +565,6 @@ interface IDevicePolicyManager { void setUsbDataSignalingEnabled(String callerPackage, boolean enabled); boolean isUsbDataSignalingEnabled(String callerPackage); - boolean isUsbDataSignalingEnabledForUser(int userId); boolean canUsbDataSignalingBeDisabled(); void setMinimumRequiredWifiSecurityLevel(String callerPackageName, int level); diff --git a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java index 00ccea1f93f17..ff960f3184db2 100644 --- a/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java +++ b/packages/SettingsLib/src/com/android/settingslib/RestrictedLockUtilsInternal.java @@ -409,7 +409,7 @@ public class RestrictedLockUtilsInternal extends RestrictedLockUtils { */ public static EnforcedAdmin checkIfUsbDataSignalingIsDisabled(Context context, int userId) { DevicePolicyManager dpm = context.getSystemService(DevicePolicyManager.class); - if (dpm == null || dpm.isUsbDataSignalingEnabledForUser(userId)) { + if (dpm == null || dpm.isUsbDataSignalingEnabled()) { return null; } else { EnforcedAdmin admin = getProfileOrDeviceOwner(context, getUserHandleOf(userId)); diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java index 5f53a92c131e0..35223c28613f2 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/development/EnableAdbPreferenceControllerTest.java @@ -140,8 +140,8 @@ public class EnableAdbPreferenceControllerTest { public void updateState_settingsOn_shouldCheck() { when(mUserManager.isAdminUser()).thenReturn(true); when(mDevicePolicyManager.getProfileOwner()).thenReturn(TEST_COMPONENT_NAME); - when(mDevicePolicyManager.isUsbDataSignalingEnabledForUser( - UserHandle.myUserId())).thenReturn(true); + when(mDevicePolicyManager.isUsbDataSignalingEnabled( + )).thenReturn(true); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ADB_ENABLED, 1); mPreference.setChecked(false); @@ -156,8 +156,8 @@ public class EnableAdbPreferenceControllerTest { public void updateState_settingsOff_shouldUncheck() { when(mUserManager.isAdminUser()).thenReturn(true); when(mDevicePolicyManager.getProfileOwner()).thenReturn(TEST_COMPONENT_NAME); - when(mDevicePolicyManager.isUsbDataSignalingEnabledForUser( - UserHandle.myUserId())).thenReturn(true); + when(mDevicePolicyManager.isUsbDataSignalingEnabled( + )).thenReturn(true); Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.ADB_ENABLED, 0); mPreference.setChecked(true); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 6ea71e382a716..775a65acb04fe 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -3469,8 +3469,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } revertTransferOwnershipIfNecessaryLocked(); + if (!isPolicyEngineForFinanceFlagEnabled()) { + updateUsbDataSignal(mContext, isUsbDataSignalingEnabledInternalLocked()); + } } - updateUsbDataSignal(); // In case flag value has changed, we apply it during boot to avoid doing it concurrently // with user toggling quiet mode. @@ -22355,7 +22357,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { public void setUsbDataSignalingEnabled(String packageName, boolean enabled) { Objects.requireNonNull(packageName, "Admin package name must be provided"); final CallerIdentity caller = getCallerIdentity(packageName); - if (!isPermissionCheckFlagEnabled()) { + if (!isPolicyEngineForFinanceFlagEnabled()) { Preconditions.checkCallAuthorization( isDefaultDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller), "USB data signaling can only be controlled by a device owner or " @@ -22364,22 +22366,25 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { "USB data signaling cannot be disabled."); } - synchronized (getLockObject()) { - ActiveAdmin admin; - if (isPermissionCheckFlagEnabled()) { - admin = enforcePermissionAndGetEnforcingAdmin( + if (isPolicyEngineForFinanceFlagEnabled()) { + EnforcingAdmin enforcingAdmin = enforcePermissionAndGetEnforcingAdmin( /* admin= */ null, MANAGE_DEVICE_POLICY_USB_DATA_SIGNALLING, caller.getPackageName(), - caller.getUserId()).getActiveAdmin(); + caller.getUserId()); + Preconditions.checkState(canUsbDataSignalingBeDisabled(), + "USB data signaling cannot be disabled."); + mDevicePolicyEngine.setGlobalPolicy( + PolicyDefinition.USB_DATA_SIGNALING, + enforcingAdmin, + new BooleanPolicyValue(enabled)); } else { - admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()); - } - - if (admin.mUsbDataSignalingEnabled != enabled) { - admin.mUsbDataSignalingEnabled = enabled; - saveSettingsLocked(caller.getUserId()); - updateUsbDataSignal(); + ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()); + if (admin.mUsbDataSignalingEnabled != enabled) { + admin.mUsbDataSignalingEnabled = enabled; + saveSettingsLocked(caller.getUserId()); + updateUsbDataSignal(mContext, isUsbDataSignalingEnabledInternalLocked()); + } } } DevicePolicyEventLogger @@ -22389,16 +22394,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { .write(); } - private void updateUsbDataSignal() { - if (!canUsbDataSignalingBeDisabled()) { + static void updateUsbDataSignal(Context context, boolean value) { + if (!canUsbDataSignalingBeDisabledInternal(context)) { return; } - final boolean usbEnabled; - synchronized (getLockObject()) { - usbEnabled = isUsbDataSignalingEnabledInternalLocked(); - } - if (!mInjector.binderWithCleanCallingIdentity( - () -> mInjector.getUsbManager().enableUsbDataSignal(usbEnabled))) { + if (!Binder.withCleanCallingIdentity( + () -> context.getSystemService(UsbManager.class).enableUsbDataSignal(value))) { Slogf.w(LOG_TAG, "Failed to set usb data signaling state"); } } @@ -22406,28 +22407,26 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public boolean isUsbDataSignalingEnabled(String packageName) { final CallerIdentity caller = getCallerIdentity(packageName); - synchronized (getLockObject()) { - // If the caller is an admin, return the policy set by itself. Otherwise - // return the device-wide policy. - if (isDefaultDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice(caller)) { - return getProfileOwnerOrDeviceOwnerLocked( - caller.getUserId()).mUsbDataSignalingEnabled; - } else { - return isUsbDataSignalingEnabledInternalLocked(); + if (isPolicyEngineForFinanceFlagEnabled()) { + Boolean enabled = mDevicePolicyEngine.getResolvedPolicy( + PolicyDefinition.USB_DATA_SIGNALING, + caller.getUserId()); + return enabled == null || enabled; + } else { + synchronized (getLockObject()) { + // If the caller is an admin, return the policy set by itself. Otherwise + // return the device-wide policy. + if (isDefaultDeviceOwner(caller) || isProfileOwnerOfOrganizationOwnedDevice( + caller)) { + return getProfileOwnerOrDeviceOwnerLocked( + caller.getUserId()).mUsbDataSignalingEnabled; + } else { + return isUsbDataSignalingEnabledInternalLocked(); + } } } } - @Override - public boolean isUsbDataSignalingEnabledForUser(int userId) { - final CallerIdentity caller = getCallerIdentity(); - Preconditions.checkCallAuthorization(isSystemUid(caller)); - - synchronized (getLockObject()) { - return isUsbDataSignalingEnabledInternalLocked(); - } - } - private boolean isUsbDataSignalingEnabledInternalLocked() { // TODO(b/261999445): remove ActiveAdmin admin; @@ -22442,9 +22441,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { @Override public boolean canUsbDataSignalingBeDisabled() { - return mInjector.binderWithCleanCallingIdentity(() -> - mInjector.getUsbManager() != null - && mInjector.getUsbManager().getUsbHalVersion() >= UsbManager.USB_HAL_V1_3 + return canUsbDataSignalingBeDisabledInternal(mContext); + } + + private static boolean canUsbDataSignalingBeDisabledInternal(Context context) { + return Binder.withCleanCallingIdentity(() -> + context.getSystemService(UsbManager.class) != null + && context.getSystemService(UsbManager.class).getUsbHalVersion() + >= UsbManager.USB_HAL_V1_3 ); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java index 7e48407fc9117..7a877b9afdad3 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyDefinition.java @@ -332,6 +332,14 @@ final class PolicyDefinition { PolicyEnforcerCallbacks::setPersonalAppsSuspended, new BooleanPolicySerializer()); + static PolicyDefinition USB_DATA_SIGNALING = new PolicyDefinition<>( + new NoArgsPolicyKey(DevicePolicyIdentifiers.USB_DATA_SIGNALING_POLICY), + // usb data signaling is enabled by default, hence disabling it is more restrictive. + FALSE_MORE_RESTRICTIVE, + POLICY_FLAG_GLOBAL_ONLY_POLICY, + (Boolean value, Context context, Integer userId, PolicyKey policyKey) -> + PolicyEnforcerCallbacks.setUsbDataSignalingEnabled(value, context), + new BooleanPolicySerializer()); private static final Map> POLICY_DEFINITIONS = new HashMap<>(); private static Map USER_RESTRICTION_FLAGS = new HashMap<>(); @@ -364,6 +372,8 @@ final class PolicyDefinition { SCREEN_CAPTURE_DISABLED); POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.PERSONAL_APPS_SUSPENDED_POLICY, PERSONAL_APPS_SUSPENDED); + POLICY_DEFINITIONS.put(DevicePolicyIdentifiers.USB_DATA_SIGNALING_POLICY, + USB_DATA_SIGNALING); // User Restriction Policies USER_RESTRICTION_FLAGS.put(UserManager.DISALLOW_MODIFY_ACCOUNTS, /* flags= */ 0); diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java index 3b048b2500756..6570ce1cd500c 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java @@ -302,4 +302,14 @@ final class PolicyEnforcerCallbacks { Slogf.wtf(LOG_TAG, "Failed to suspend apps: " + String.join(",", failedApps)); } } + + static boolean setUsbDataSignalingEnabled(@Nullable Boolean value, @NonNull Context context) { + return Binder.withCleanCallingIdentity(() -> { + Objects.requireNonNull(context); + + boolean enabled = value == null || value; + DevicePolicyManagerService.updateUsbDataSignal(context, enabled); + return true; + }); + } } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 99a3b808e082a..ad1c60e2cc8a2 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -8125,14 +8125,13 @@ public class DevicePolicyManagerTest extends DpmTestBase { } @Test - public void testIsUsbDataSignalingEnabledForUser_systemUser() throws Exception { + public void testIsUsbDataSignalingEnabledForUser() throws Exception { when(getServices().usbManager.enableUsbDataSignal(false)).thenReturn(true); when(getServices().usbManager.getUsbHalVersion()).thenReturn(UsbManager.USB_HAL_V1_3); setDeviceOwner(); dpm.setUsbDataSignalingEnabled(false); - mContext.binder.callingUid = DpmMockContext.SYSTEM_UID; - assertThat(dpm.isUsbDataSignalingEnabledForUser(UserHandle.myUserId())).isFalse(); + assertThat(dpm.isUsbDataSignalingEnabled()).isFalse(); } @Test diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java index 9ff600a6d0f86..e5fac7ac5e0c5 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java @@ -251,6 +251,8 @@ public class DpmMockContext extends MockContext { return mMockSystemServices.roleManager; case Context.TELEPHONY_SUBSCRIPTION_SERVICE: return mMockSystemServices.subscriptionManager; + case Context.USB_SERVICE: + return mMockSystemServices.usbManager; } throw new UnsupportedOperationException(); }