From c74b5723a4a368d572952ef52c92c5754b5fd26c Mon Sep 17 00:00:00 2001 From: Wale Ogunwale Date: Tue, 28 Oct 2014 10:35:29 -0700 Subject: [PATCH] Fix issue 6455374: Bad recent image on camera launch from lockscreen. When transitioning from the lockscreen to the camera app, the previous activity that was running before the screen was locked is briefly resumed and then paused. During the pause we take a screenshot of the activity for recents which ends up being an image of the wallpaper, because the activity was moved behind the wallpaper while the lockscreen is up. With this change we no longer include the wallpaper layer in the screenshot if it is layered on top of the window we are targeting for the screenshot. Bug: 6455374 Change-Id: I305950a32c176f55eeeb6358266746e32e848383 --- .../android/server/wm/WindowManagerService.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0e55c1cecff65..13fb96fd620c3 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6049,6 +6049,10 @@ public class WindowManagerService extends IWindowManager.Stub while (true) { if (retryCount++ > 0) { + // Reset max/min layers on retries so we don't accidentally take a screenshot of a + // layer based on the previous try. + maxLayer = 0; + minLayer = Integer.MAX_VALUE; try { Thread.sleep(100); } catch (InterruptedException e) { @@ -6071,7 +6075,17 @@ public class WindowManagerService extends IWindowManager.Stub continue; } } else if (ws.mIsWallpaper) { - // Fall through. + if (appWin == null) { + // We have not ran across the target window yet, so it is probably + // behind the wallpaper. This can happen when the keyguard is up and + // all windows are moved behind the wallpaper. We don't want to + // include the wallpaper layer in the screenshot as it will coverup + // the layer of the target window. + continue; + } + // Fall through. The target window is in front of the wallpaper. For this + // case we want to include the wallpaper layer in the screenshot because + // the target window might have some transparent areas. } else if (appToken != null) { if (ws.mAppToken == null || ws.mAppToken.token != appToken) { // This app window is of no interest if it is not associated with the