diff options
6 files changed, 125 insertions, 1 deletions
diff --git a/api/current.txt b/api/current.txt index b61917dc55a3..2c1b066f9a76 100644 --- a/api/current.txt +++ b/api/current.txt @@ -6732,6 +6732,7 @@ package android.app.admin { method @Deprecated @Nullable public String getApplicationRestrictionsManagingPackage(@NonNull android.content.ComponentName); method public boolean getAutoTime(@NonNull android.content.ComponentName); method @Deprecated public boolean getAutoTimeRequired(); + method public boolean getAutoTimeZone(@NonNull android.content.ComponentName); method @NonNull public java.util.List<android.os.UserHandle> getBindDeviceAdminTargetUsers(@NonNull android.content.ComponentName); method public boolean getBluetoothContactSharingDisabled(@NonNull android.content.ComponentName); method public boolean getCameraDisabled(@Nullable android.content.ComponentName); @@ -6850,6 +6851,7 @@ package android.app.admin { method @Deprecated public void setApplicationRestrictionsManagingPackage(@NonNull android.content.ComponentName, @Nullable String) throws android.content.pm.PackageManager.NameNotFoundException; method public void setAutoTime(@NonNull android.content.ComponentName, boolean); method @Deprecated public void setAutoTimeRequired(@NonNull android.content.ComponentName, boolean); + method public void setAutoTimeZone(@NonNull android.content.ComponentName, boolean); method public void setBackupServiceEnabled(@NonNull android.content.ComponentName, boolean); method public void setBluetoothContactSharingDisabled(@NonNull android.content.ComponentName, boolean); method public void setCameraDisabled(@NonNull android.content.ComponentName, boolean); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index ec981b29cd70..6e7ead1a4b60 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -5810,6 +5810,49 @@ public class DevicePolicyManager { } /** + * Called by a device owner, a profile owner for the primary user or a profile + * owner of an organization-owned managed profile to turn auto time zone on and off. + * Callers are recommended to use {@link UserManager#DISALLOW_CONFIG_DATE_TIME} + * to prevent the user from changing this setting. + * <p> + * If user restriction {@link UserManager#DISALLOW_CONFIG_DATE_TIME} is used, + * no user will be able set the date and time zone. Instead, the network date + * and time zone will be used. + * + * @param admin Which {@link DeviceAdminReceiver} this request is associated with. + * @param enabled Whether time zone should be obtained automatically from the network or not. + * @throws SecurityException if caller is not a device owner, a profile owner for the + * primary user, or a profile owner of an organization-owned managed profile. + */ + public void setAutoTimeZone(@NonNull ComponentName admin, boolean enabled) { + throwIfParentInstance("setAutoTimeZone"); + if (mService != null) { + try { + mService.setAutoTimeZone(admin, enabled); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * @return true if auto time zone is enabled on the device. + * @throws SecurityException if caller is not a device owner, a profile owner for the + * primary user, or a profile owner of an organization-owned managed profile. + */ + public boolean getAutoTimeZone(@NonNull ComponentName admin) { + throwIfParentInstance("getAutoTimeZone"); + if (mService != null) { + try { + return mService.getAutoTimeZone(admin); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + return false; + } + + /** * Called by a device owner to set whether all users created on the device should be ephemeral. * <p> * The system user is exempt from this policy - it is never ephemeral. diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index ff1ecd558400..949e8ab165bd 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -298,6 +298,9 @@ interface IDevicePolicyManager { void setAutoTime(in ComponentName who, boolean enabled); boolean getAutoTime(in ComponentName who); + void setAutoTimeZone(in ComponentName who, boolean enabled); + boolean getAutoTimeZone(in ComponentName who); + void setForceEphemeralUsers(in ComponentName who, boolean forceEpehemeralUsers); boolean getForceEphemeralUsers(in ComponentName who); diff --git a/core/proto/android/stats/devicepolicy/device_policy_enums.proto b/core/proto/android/stats/devicepolicy/device_policy_enums.proto index f8c304c72f53..ee5144c0f91a 100644 --- a/core/proto/android/stats/devicepolicy/device_policy_enums.proto +++ b/core/proto/android/stats/devicepolicy/device_policy_enums.proto @@ -152,4 +152,5 @@ enum EventId { CROSS_PROFILE_APPS_GET_TARGET_USER_PROFILES = 125; CROSS_PROFILE_APPS_START_ACTIVITY_AS_USER = 126; SET_AUTO_TIME = 127; + SET_AUTO_TIME_ZONE = 128; } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index eb1753bdbee7..078bab429719 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -7440,7 +7440,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { } /** - * Returns whether or auto time is used on the device or not. + * Returns whether auto time is used on the device or not. */ @Override public boolean getAutoTime(ComponentName who) { @@ -7453,6 +7453,42 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return mInjector.settingsGlobalGetInt(Global.AUTO_TIME, 0) > 0; } + /** + * Set whether auto time zone is enabled on the device. + */ + @Override + public void setAutoTimeZone(ComponentName who, boolean enabled) { + if (!mHasFeature) { + return; + } + Preconditions.checkNotNull(who, "ComponentName is null"); + // TODO (b/145286957) Refactor security checks + enforceDeviceOwnerOrProfileOwnerOnUser0OrProfileOwnerOrganizationOwned(); + + mInjector.binderWithCleanCallingIdentity(() -> + mInjector.settingsGlobalPutInt(Global.AUTO_TIME_ZONE, enabled ? 1 : 0)); + + DevicePolicyEventLogger + .createEvent(DevicePolicyEnums.SET_AUTO_TIME_ZONE) + .setAdmin(who) + .setBoolean(enabled) + .write(); + } + + /** + * Returns whether auto time zone is used on the device or not. + */ + @Override + public boolean getAutoTimeZone(ComponentName who) { + if (!mHasFeature) { + return false; + } + Preconditions.checkNotNull(who, "ComponentName is null"); + enforceDeviceOwnerOrProfileOwnerOnUser0OrProfileOwnerOrganizationOwned(); + + return mInjector.settingsGlobalGetInt(Global.AUTO_TIME_ZONE, 0) > 0; + } + @Override public void setForceEphemeralUsers(ComponentName who, boolean forceEphemeralUsers) { if (!mHasFeature) { 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 3f09f579369e..f54f88553751 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -3673,6 +3673,45 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME, 0); } + public void testSetAutoTimeZoneModifiesSetting() throws Exception { + mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; + setupDeviceOwner(); + dpm.setAutoTimeZone(admin1, true); + verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 1); + + dpm.setAutoTimeZone(admin1, false); + verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 0); + } + + public void testSetAutoTimeZoneWithPOOnUser0() throws Exception { + mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; + setupProfileOwnerOnUser0(); + dpm.setAutoTimeZone(admin1, true); + verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 1); + + dpm.setAutoTimeZone(admin1, false); + verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 0); + } + + public void testSetAutoTimeZoneFailWithPONotOnUser0() throws Exception { + setupProfileOwner(); + assertExpectException(SecurityException.class, null, + () -> dpm.setAutoTimeZone(admin1, false)); + verify(getServices().settings, never()).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, + 0); + } + + public void testSetAutoTimeZoneWithPOOfOrganizationOwnedDevice() throws Exception { + setupProfileOwner(); + configureProfileOwnerOfOrgOwnedDevice(admin1, DpmMockContext.CALLER_USER_HANDLE); + + dpm.setAutoTimeZone(admin1, true); + verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 1); + + dpm.setAutoTimeZone(admin1, false); + verify(getServices().settings).settingsGlobalPutInt(Settings.Global.AUTO_TIME_ZONE, 0); + } + public void testSetTime() throws Exception { mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; setupDeviceOwner(); |