From c5f429f0b67c9057dfa641a5e709fce68a7822dd Mon Sep 17 00:00:00 2001 From: Rubin Xu Date: Thu, 13 Apr 2023 15:40:26 +0100 Subject: [PATCH] Headless: fix locking work profile with separate challenge on power button SystemUI is querying the profile of its own running user, but in headless system user mode this should really be the current foreground user. Also fix a bug in DevicePolicyManager where device lock timeout is pushed to the wrong user. Bug: 265021591 Test: manual run of the CtsVerifier test Change-Id: I714cda9040b8712df6753a9d37e8c293fe527ad9 --- .../systemui/keyguard/KeyguardViewMediator.java | 10 ++++++---- .../devicepolicy/DevicePolicyManagerService.java | 3 +-- .../devicepolicy/DevicePolicyManagerTest.java | 16 ++++++++-------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 7a2013e2c612b..93ddfba5b6fc5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -1610,8 +1610,9 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } private void doKeyguardLaterForChildProfilesLocked() { - UserManager um = UserManager.get(mContext); - for (int profileId : um.getEnabledProfileIds(UserHandle.myUserId())) { + for (UserInfo profile : mUserTracker.getUserProfiles()) { + if (!profile.isEnabled()) continue; + final int profileId = profile.id; if (mLockPatternUtils.isSeparateProfileChallengeEnabled(profileId)) { long userTimeout = getLockTimeout(profileId); if (userTimeout == 0) { @@ -1634,8 +1635,9 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } private void doKeyguardForChildProfilesLocked() { - UserManager um = UserManager.get(mContext); - for (int profileId : um.getEnabledProfileIds(UserHandle.myUserId())) { + for (UserInfo profile : mUserTracker.getUserProfiles()) { + if (!profile.isEnabled()) continue; + final int profileId = profile.id; if (mLockPatternUtils.isSeparateProfileChallengeEnabled(profileId)) { lockProfile(profileId); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 7e5d5aae06e4c..6ebfc70849c9b 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -5865,8 +5865,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // would allow bypassing of the maximum time to lock. mInjector.settingsGlobalPutInt(Settings.Global.STAY_ON_WHILE_PLUGGED_IN, 0); } - getPowerManagerInternal().setMaximumScreenOffTimeoutFromDeviceAdmin( - UserHandle.USER_SYSTEM, timeMs); + getPowerManagerInternal().setMaximumScreenOffTimeoutFromDeviceAdmin(parentId, timeMs); }); } 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 16aadacb5af6e..d85db64b74cdc 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -3267,31 +3267,31 @@ public class DevicePolicyManagerTest extends DpmTestBase { reset(getServices().settings); dpm.setMaximumTimeToLock(admin1, 0); - verifyScreenTimeoutCall(null, UserHandle.USER_SYSTEM); + verifyScreenTimeoutCall(null, CALLER_USER_HANDLE); verifyStayOnWhilePluggedCleared(false); reset(getServices().powerManagerInternal); reset(getServices().settings); dpm.setMaximumTimeToLock(admin1, 1); - verifyScreenTimeoutCall(1L, UserHandle.USER_SYSTEM); + verifyScreenTimeoutCall(1L, CALLER_USER_HANDLE); verifyStayOnWhilePluggedCleared(true); reset(getServices().powerManagerInternal); reset(getServices().settings); dpm.setMaximumTimeToLock(admin2, 10); - verifyScreenTimeoutCall(null, UserHandle.USER_SYSTEM); + verifyScreenTimeoutCall(null, CALLER_USER_HANDLE); verifyStayOnWhilePluggedCleared(false); reset(getServices().powerManagerInternal); reset(getServices().settings); dpm.setMaximumTimeToLock(admin1, 5); - verifyScreenTimeoutCall(5L, UserHandle.USER_SYSTEM); + verifyScreenTimeoutCall(5L, CALLER_USER_HANDLE); verifyStayOnWhilePluggedCleared(true); reset(getServices().powerManagerInternal); reset(getServices().settings); dpm.setMaximumTimeToLock(admin2, 4); - verifyScreenTimeoutCall(4L, UserHandle.USER_SYSTEM); + verifyScreenTimeoutCall(4L, CALLER_USER_HANDLE); verifyStayOnWhilePluggedCleared(true); reset(getServices().powerManagerInternal); reset(getServices().settings); @@ -3301,20 +3301,20 @@ public class DevicePolicyManagerTest extends DpmTestBase { reset(getServices().settings); dpm.setMaximumTimeToLock(admin2, Long.MAX_VALUE); - verifyScreenTimeoutCall(Long.MAX_VALUE, UserHandle.USER_SYSTEM); + verifyScreenTimeoutCall(Long.MAX_VALUE, CALLER_USER_HANDLE); verifyStayOnWhilePluggedCleared(true); reset(getServices().powerManagerInternal); reset(getServices().settings); dpm.setMaximumTimeToLock(admin2, 10); - verifyScreenTimeoutCall(10L, UserHandle.USER_SYSTEM); + verifyScreenTimeoutCall(10L, CALLER_USER_HANDLE); verifyStayOnWhilePluggedCleared(true); reset(getServices().powerManagerInternal); reset(getServices().settings); // There's no restriction; should be set to MAX. dpm.setMaximumTimeToLock(admin2, 0); - verifyScreenTimeoutCall(Long.MAX_VALUE, UserHandle.USER_SYSTEM); + verifyScreenTimeoutCall(Long.MAX_VALUE, CALLER_USER_HANDLE); verifyStayOnWhilePluggedCleared(false); }