Loading services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +23 −18 Original line number Diff line number Diff line Loading @@ -1214,7 +1214,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_STOPPED, userHandle); if (isManagedProfile(userHandle)) { Slogf.d(LOG_TAG, "Managed profile was stopped"); updatePersonalAppsSuspension(userHandle, false /* unlocked */); updatePersonalAppsSuspension(userHandle); } } else if (Intent.ACTION_USER_SWITCHED.equals(action)) { sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_SWITCHED, userHandle); Loading @@ -1224,8 +1224,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } if (isManagedProfile(userHandle)) { Slogf.d(LOG_TAG, "Managed profile became unlocked"); final boolean suspended = updatePersonalAppsSuspension(userHandle, true /* unlocked */); final boolean suspended = updatePersonalAppsSuspension(userHandle); triggerPolicyComplianceCheckIfNeeded(userHandle, suspended); } } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { Loading @@ -1252,13 +1251,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { updateSystemUpdateFreezePeriodsRecord(/* saveIfChanged */ true); final int userId = getManagedUserId(getMainUserId()); if (userId >= 0) { updatePersonalAppsSuspension(userId, mUserManager.isUserUnlocked(userId)); updatePersonalAppsSuspension(userId); } } else if (ACTION_PROFILE_OFF_DEADLINE.equals(action)) { Slogf.i(LOG_TAG, "Profile off deadline alarm was triggered"); final int userId = getManagedUserId(getMainUserId()); if (userId >= 0) { updatePersonalAppsSuspension(userId, mUserManager.isUserUnlocked(userId)); updatePersonalAppsSuspension(userId); } else { Slogf.wtf(LOG_TAG, "Got deadline alarm for nonexistent profile"); } Loading @@ -1268,9 +1267,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } else if (ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { notifyIfManagedSubscriptionsAreUnavailable( UserHandle.of(userHandle), /* managedProfileAvailable= */ false); updatePersonalAppsSuspension(userHandle); } else if (ACTION_MANAGED_PROFILE_AVAILABLE.equals(action)) { notifyIfManagedSubscriptionsAreUnavailable( UserHandle.of(userHandle), /* managedProfileAvailable= */ true); final boolean suspended = updatePersonalAppsSuspension(userHandle); triggerPolicyComplianceCheckIfNeeded(userHandle, suspended); } else if (LOGIN_ACCOUNTS_CHANGED_ACTION.equals(action)) { calculateHasIncompatibleAccounts(); } Loading Loading @@ -3433,7 +3435,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final int profileUserHandle = getManagedUserId(userHandle); if (profileUserHandle >= 0) { // Given that the parent user has just started, profile should be locked. updatePersonalAppsSuspension(profileUserHandle, false /* unlocked */); updatePersonalAppsSuspension(profileUserHandle); } else { suspendPersonalAppsInternal(userHandle, profileUserHandle, false); } Loading Loading @@ -20786,7 +20788,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } mInjector.binderWithCleanCallingIdentity(() -> updatePersonalAppsSuspension( callingUserId, mUserManager.isUserUnlocked(callingUserId))); callingUserId)); DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_PERSONAL_APPS_SUSPENDED) Loading Loading @@ -20820,16 +20822,19 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { /** * Checks whether personal apps should be suspended according to the policy and applies the * change if needed. * * @param unlocked whether the profile is currently running unlocked. */ private boolean updatePersonalAppsSuspension(int profileUserId, boolean unlocked) { private boolean updatePersonalAppsSuspension(int profileUserId) { final boolean shouldSuspend; synchronized (getLockObject()) { final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(profileUserId); if (profileOwner != null) { final int notificationState = updateProfileOffDeadlineLocked(profileUserId, profileOwner, unlocked); // Profile is considered "off" when it is either not running or is running locked // or is in quiet mode, i.e. when the admin cannot sync policies or show UI. boolean profileUserOff = !mUserManagerInternal.isUserUnlockingOrUnlocked(profileUserId) || mUserManager.isQuietModeEnabled(UserHandle.of(profileUserId)); final int notificationState = updateProfileOffDeadlineLocked( profileUserId, profileOwner, profileUserOff); final boolean suspendedExplicitly = profileOwner.mSuspendPersonalApps; final boolean suspendedByTimeout = profileOwner.mProfileOffDeadline == -1; Slogf.d(LOG_TAG, Loading @@ -20854,16 +20859,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * @return notification state */ private int updateProfileOffDeadlineLocked( int profileUserId, ActiveAdmin profileOwner, boolean unlocked) { int profileUserId, ActiveAdmin profileOwner, boolean off) { final long now = mInjector.systemCurrentTimeMillis(); if (profileOwner.mProfileOffDeadline != 0 && now > profileOwner.mProfileOffDeadline) { Slogf.i(LOG_TAG, "Profile off deadline has been reached, unlocked: " + unlocked); Slogf.i(LOG_TAG, "Profile off deadline has been reached, off: " + off); if (profileOwner.mProfileOffDeadline != -1) { // Move the deadline far to the past so that it cannot be rolled back by TZ change. profileOwner.mProfileOffDeadline = -1; saveSettingsLocked(profileUserId); } return unlocked ? PROFILE_OFF_NOTIFICATION_NONE : PROFILE_OFF_NOTIFICATION_SUSPENDED; return off ? PROFILE_OFF_NOTIFICATION_SUSPENDED : PROFILE_OFF_NOTIFICATION_NONE; } boolean shouldSaveSettings = false; if (profileOwner.mSuspendPersonalApps) { Loading @@ -20880,7 +20885,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { profileOwner.mProfileOffDeadline = 0; shouldSaveSettings = true; } else if (profileOwner.mProfileOffDeadline == 0 && (profileOwner.mProfileMaximumTimeOffMillis != 0 && !unlocked)) { && (profileOwner.mProfileMaximumTimeOffMillis != 0 && off)) { // There profile is locked and there is a policy, but the deadline is not set -> set the // deadline. Slogf.i(LOG_TAG, "Profile off deadline is set."); Loading @@ -20894,7 +20899,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final long alarmTime; final int notificationState; if (unlocked || profileOwner.mProfileOffDeadline == 0) { if (!off || profileOwner.mProfileOffDeadline == 0) { alarmTime = 0; notificationState = PROFILE_OFF_NOTIFICATION_NONE; } else if (profileOwner.mProfileOffDeadline - now < MANAGED_PROFILE_OFF_WARNING_PERIOD) { Loading Loading @@ -21168,7 +21173,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } mInjector.binderWithCleanCallingIdentity( () -> updatePersonalAppsSuspension(userId, mUserManager.isUserUnlocked())); () -> updatePersonalAppsSuspension(userId)); DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_MANAGED_PROFILE_MAXIMUM_TIME_OFF) services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -8600,6 +8600,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { private void setUserUnlocked(int userHandle, boolean unlocked) { when(getServices().userManager.isUserUnlocked(eq(userHandle))).thenReturn(unlocked); when(getServices().userManagerInternal.isUserUnlockingOrUnlocked(eq(userHandle))) .thenReturn(unlocked); } private void prepareMocksForSetMaximumProfileTimeOff() throws Exception { Loading Loading
services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +23 −18 Original line number Diff line number Diff line Loading @@ -1214,7 +1214,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_STOPPED, userHandle); if (isManagedProfile(userHandle)) { Slogf.d(LOG_TAG, "Managed profile was stopped"); updatePersonalAppsSuspension(userHandle, false /* unlocked */); updatePersonalAppsSuspension(userHandle); } } else if (Intent.ACTION_USER_SWITCHED.equals(action)) { sendDeviceOwnerUserCommand(DeviceAdminReceiver.ACTION_USER_SWITCHED, userHandle); Loading @@ -1224,8 +1224,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } if (isManagedProfile(userHandle)) { Slogf.d(LOG_TAG, "Managed profile became unlocked"); final boolean suspended = updatePersonalAppsSuspension(userHandle, true /* unlocked */); final boolean suspended = updatePersonalAppsSuspension(userHandle); triggerPolicyComplianceCheckIfNeeded(userHandle, suspended); } } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { Loading @@ -1252,13 +1251,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { updateSystemUpdateFreezePeriodsRecord(/* saveIfChanged */ true); final int userId = getManagedUserId(getMainUserId()); if (userId >= 0) { updatePersonalAppsSuspension(userId, mUserManager.isUserUnlocked(userId)); updatePersonalAppsSuspension(userId); } } else if (ACTION_PROFILE_OFF_DEADLINE.equals(action)) { Slogf.i(LOG_TAG, "Profile off deadline alarm was triggered"); final int userId = getManagedUserId(getMainUserId()); if (userId >= 0) { updatePersonalAppsSuspension(userId, mUserManager.isUserUnlocked(userId)); updatePersonalAppsSuspension(userId); } else { Slogf.wtf(LOG_TAG, "Got deadline alarm for nonexistent profile"); } Loading @@ -1268,9 +1267,12 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } else if (ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { notifyIfManagedSubscriptionsAreUnavailable( UserHandle.of(userHandle), /* managedProfileAvailable= */ false); updatePersonalAppsSuspension(userHandle); } else if (ACTION_MANAGED_PROFILE_AVAILABLE.equals(action)) { notifyIfManagedSubscriptionsAreUnavailable( UserHandle.of(userHandle), /* managedProfileAvailable= */ true); final boolean suspended = updatePersonalAppsSuspension(userHandle); triggerPolicyComplianceCheckIfNeeded(userHandle, suspended); } else if (LOGIN_ACCOUNTS_CHANGED_ACTION.equals(action)) { calculateHasIncompatibleAccounts(); } Loading Loading @@ -3433,7 +3435,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final int profileUserHandle = getManagedUserId(userHandle); if (profileUserHandle >= 0) { // Given that the parent user has just started, profile should be locked. updatePersonalAppsSuspension(profileUserHandle, false /* unlocked */); updatePersonalAppsSuspension(profileUserHandle); } else { suspendPersonalAppsInternal(userHandle, profileUserHandle, false); } Loading Loading @@ -20786,7 +20788,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } mInjector.binderWithCleanCallingIdentity(() -> updatePersonalAppsSuspension( callingUserId, mUserManager.isUserUnlocked(callingUserId))); callingUserId)); DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_PERSONAL_APPS_SUSPENDED) Loading Loading @@ -20820,16 +20822,19 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { /** * Checks whether personal apps should be suspended according to the policy and applies the * change if needed. * * @param unlocked whether the profile is currently running unlocked. */ private boolean updatePersonalAppsSuspension(int profileUserId, boolean unlocked) { private boolean updatePersonalAppsSuspension(int profileUserId) { final boolean shouldSuspend; synchronized (getLockObject()) { final ActiveAdmin profileOwner = getProfileOwnerAdminLocked(profileUserId); if (profileOwner != null) { final int notificationState = updateProfileOffDeadlineLocked(profileUserId, profileOwner, unlocked); // Profile is considered "off" when it is either not running or is running locked // or is in quiet mode, i.e. when the admin cannot sync policies or show UI. boolean profileUserOff = !mUserManagerInternal.isUserUnlockingOrUnlocked(profileUserId) || mUserManager.isQuietModeEnabled(UserHandle.of(profileUserId)); final int notificationState = updateProfileOffDeadlineLocked( profileUserId, profileOwner, profileUserOff); final boolean suspendedExplicitly = profileOwner.mSuspendPersonalApps; final boolean suspendedByTimeout = profileOwner.mProfileOffDeadline == -1; Slogf.d(LOG_TAG, Loading @@ -20854,16 +20859,16 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { * @return notification state */ private int updateProfileOffDeadlineLocked( int profileUserId, ActiveAdmin profileOwner, boolean unlocked) { int profileUserId, ActiveAdmin profileOwner, boolean off) { final long now = mInjector.systemCurrentTimeMillis(); if (profileOwner.mProfileOffDeadline != 0 && now > profileOwner.mProfileOffDeadline) { Slogf.i(LOG_TAG, "Profile off deadline has been reached, unlocked: " + unlocked); Slogf.i(LOG_TAG, "Profile off deadline has been reached, off: " + off); if (profileOwner.mProfileOffDeadline != -1) { // Move the deadline far to the past so that it cannot be rolled back by TZ change. profileOwner.mProfileOffDeadline = -1; saveSettingsLocked(profileUserId); } return unlocked ? PROFILE_OFF_NOTIFICATION_NONE : PROFILE_OFF_NOTIFICATION_SUSPENDED; return off ? PROFILE_OFF_NOTIFICATION_SUSPENDED : PROFILE_OFF_NOTIFICATION_NONE; } boolean shouldSaveSettings = false; if (profileOwner.mSuspendPersonalApps) { Loading @@ -20880,7 +20885,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { profileOwner.mProfileOffDeadline = 0; shouldSaveSettings = true; } else if (profileOwner.mProfileOffDeadline == 0 && (profileOwner.mProfileMaximumTimeOffMillis != 0 && !unlocked)) { && (profileOwner.mProfileMaximumTimeOffMillis != 0 && off)) { // There profile is locked and there is a policy, but the deadline is not set -> set the // deadline. Slogf.i(LOG_TAG, "Profile off deadline is set."); Loading @@ -20894,7 +20899,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final long alarmTime; final int notificationState; if (unlocked || profileOwner.mProfileOffDeadline == 0) { if (!off || profileOwner.mProfileOffDeadline == 0) { alarmTime = 0; notificationState = PROFILE_OFF_NOTIFICATION_NONE; } else if (profileOwner.mProfileOffDeadline - now < MANAGED_PROFILE_OFF_WARNING_PERIOD) { Loading Loading @@ -21168,7 +21173,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } mInjector.binderWithCleanCallingIdentity( () -> updatePersonalAppsSuspension(userId, mUserManager.isUserUnlocked())); () -> updatePersonalAppsSuspension(userId)); DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_MANAGED_PROFILE_MAXIMUM_TIME_OFF)
services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +2 −0 Original line number Diff line number Diff line Loading @@ -8600,6 +8600,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { private void setUserUnlocked(int userHandle, boolean unlocked) { when(getServices().userManager.isUserUnlocked(eq(userHandle))).thenReturn(unlocked); when(getServices().userManagerInternal.isUserUnlockingOrUnlocked(eq(userHandle))) .thenReturn(unlocked); } private void prepareMocksForSetMaximumProfileTimeOff() throws Exception { Loading