From 19660ca3e040750c2a86dc7382af6445d3a0bf16 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Tue, 1 Mar 2022 16:12:53 +0800 Subject: [PATCH] Only wakeup device for dismiss keyguard when dream activity is on top. Regression from I62be9283a1d22119eceae5585960b5775a019153. When dismiss keyguard from shell command, the wakeup signal should only be used for leaving the dream activity. Bug: 219376804 Test: atest KeyguardTests KeyguardLockedTests Test: atest WindowManagerServiceTests Test: Enable dream, set crediental, wait for dream activity resumed and keyguard locked. Dismiss keyguard by shell command "dismiss-keyguard", verify the DreamActivity can be stopped after enter crediental. Test: Test with test app, verify the device won't wakeup after screen off. Change-Id: I4edab8588421b3e341cf3bde07e989ff5e651cfe --- .../com/android/server/wm/KeyguardController.java | 13 +++++++++++-- .../com/android/server/wm/WindowManagerService.java | 4 ++-- .../server/wm/WindowManagerServiceTests.java | 2 +- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index c55af9b6286ea..7bf150b18e9bf 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -443,6 +443,13 @@ class KeyguardController { || !mWindowManager.isKeyguardSecure(mService.getCurrentUserId()); } + /** + * @return Whether the dream activity is on top of default display. + */ + boolean isShowingDream() { + return getDisplayState(DEFAULT_DISPLAY).mShowingDream; + } + private void dismissMultiWindowModeForTaskIfNeeded(int displayId, @Nullable Task currentTaskControllingOcclusion) { // TODO(b/113840485): Handle docked stack for individual display. @@ -501,6 +508,7 @@ class KeyguardController { private boolean mKeyguardGoingAway; private boolean mDismissalRequested; private boolean mOccluded; + private boolean mShowingDream; private ActivityRecord mTopOccludesActivity; private ActivityRecord mDismissingKeyguardActivity; @@ -536,6 +544,7 @@ class KeyguardController { mRequestDismissKeyguard = false; mOccluded = false; + mShowingDream = false; mTopOccludesActivity = null; mDismissingKeyguardActivity = null; @@ -570,9 +579,9 @@ class KeyguardController { } } - final boolean dreaming = display.getDisplayPolicy().isShowingDreamLw() && (top != null + mShowingDream = display.getDisplayPolicy().isShowingDreamLw() && (top != null && top.getActivityType() == ACTIVITY_TYPE_DREAM); - mOccluded = dreaming || occludedByActivity; + mOccluded = mShowingDream || occludedByActivity; mRequestDismissKeyguard = lastDismissKeyguardActivity != mDismissingKeyguardActivity && !mOccluded && mDismissingKeyguardActivity != null diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 709f885db7761..7206d7d4a376e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3217,8 +3217,8 @@ public class WindowManagerService extends IWindowManager.Stub if (!checkCallingPermission(permission.CONTROL_KEYGUARD, "dismissKeyguard")) { throw new SecurityException("Requires CONTROL_KEYGUARD permission"); } - if (mAtmService.isDreaming()) { - mAtmService.mTaskSupervisor.wakeUp("dismissKeyguard"); + if (mAtmService.mKeyguardController.isShowingDream()) { + mAtmService.mTaskSupervisor.wakeUp("leaveDream"); } synchronized (mGlobalLock) { mPolicy.dismissKeyguardLw(callback, message); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java index 68e90e1c00d3b..08320f8c423fe 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowManagerServiceTests.java @@ -161,7 +161,7 @@ public class WindowManagerServiceTests extends WindowTestsBase { @Test public void testDismissKeyguardCanWakeUp() { doReturn(true).when(mWm).checkCallingPermission(anyString(), anyString()); - doReturn(true).when(mWm.mAtmService).isDreaming(); + doReturn(true).when(mWm.mAtmService.mKeyguardController).isShowingDream(); doNothing().when(mWm.mAtmService.mTaskSupervisor).wakeUp(anyString()); mWm.dismissKeyguard(null, "test-dismiss-keyguard"); verify(mWm.mAtmService.mTaskSupervisor).wakeUp(anyString());