diff --git a/services/core/java/com/android/server/wm/KeyguardController.java b/services/core/java/com/android/server/wm/KeyguardController.java index b31c2e462766f..20216c3afcd49 100644 --- a/services/core/java/com/android/server/wm/KeyguardController.java +++ b/services/core/java/com/android/server/wm/KeyguardController.java @@ -167,6 +167,11 @@ class KeyguardController { if (aodChanged) { // Ensure the new state takes effect. mWindowManager.mWindowPlacerLocked.performSurfacePlacement(); + // If the device can enter AOD and keyguard at the same time, the screen will not be + // turned off, so the snapshot needs to be refreshed when these states are changed. + if (aodShowing && keyguardShowing && keyguardChanged) { + mWindowManager.mTaskSnapshotController.snapshotForSleeping(DEFAULT_DISPLAY); + } } if (keyguardChanged) { diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index 8915eba3d509a..5af44317b8c1f 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -635,20 +635,7 @@ class TaskSnapshotController { mHandler.post(() -> { try { synchronized (mService.mGlobalLock) { - mTmpTasks.clear(); - mService.mRoot.getDisplayContent(displayId).forAllTasks(task -> { - // Since RecentsAnimation will handle task snapshot while switching apps - // with the best capture timing (e.g. IME window capture), No need - // additional task capture while task is controlled by RecentsAnimation. - if (task.isVisible() && !task.isAnimatingByRecents()) { - mTmpTasks.add(task); - } - }); - // Allow taking snapshot of home when turning screen off to reduce the delay of - // waking from secure lock to home. - final boolean allowSnapshotHome = displayId == Display.DEFAULT_DISPLAY && - mService.mPolicy.isKeyguardSecure(mService.mCurrentUserId); - snapshotTasks(mTmpTasks, allowSnapshotHome); + snapshotForSleeping(displayId); } } finally { listener.onScreenOff(); @@ -656,6 +643,27 @@ class TaskSnapshotController { }); } + /** Called when the device is going to sleep (e.g. screen off, AOD without screen off). */ + void snapshotForSleeping(int displayId) { + if (shouldDisableSnapshots()) { + return; + } + mTmpTasks.clear(); + mService.mRoot.getDisplayContent(displayId).forAllTasks(task -> { + // Since RecentsAnimation will handle task snapshot while switching apps with the best + // capture timing (e.g. IME window capture), No need additional task capture while task + // is controlled by RecentsAnimation. + if (task.isVisible() && !task.isAnimatingByRecents()) { + mTmpTasks.add(task); + } + }); + // Allow taking snapshot of home when turning screen off to reduce the delay of waking from + // secure lock to home. + final boolean allowSnapshotHome = displayId == Display.DEFAULT_DISPLAY + && mService.mPolicy.isKeyguardSecure(mService.mCurrentUserId); + snapshotTasks(mTmpTasks, allowSnapshotHome); + } + /** * @return The {@link Appearance} flags for the top fullscreen opaque window in the given * {@param task}.