From e6c6ecb2b038edaa0828119773857825bc579f86 Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Thu, 20 Jul 2017 18:09:20 +0200 Subject: [PATCH] Fix snapshots for dialogs When taking a snapshot, always include the full stack bounds. When showing a snapshot starting window, use the SystemUI flags from the top fullscreen window in the task - this is the same way as we do it when the real windows are going to be visible. Test: Revoke contacts permissions, launch contacts, go to recents, go back. Test: go/wm-smoke Fixes: 63268663 Change-Id: If8d9701f6d34abd56116ed04fe27fe82688e506a --- core/java/android/view/WindowManager.java | 11 +++++ .../server/policy/PhoneWindowManager.java | 10 +---- .../com/android/server/wm/DisplayContent.java | 14 +++--- .../core/java/com/android/server/wm/Task.java | 11 +++++ .../server/wm/TaskSnapshotSurface.java | 44 +++++++++++-------- 5 files changed, 57 insertions(+), 33 deletions(-) diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index 9b881fd3d1c88..faf3e1258929a 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -2591,5 +2591,16 @@ public interface WindowManager extends ViewManager { encoder.addProperty("type", type); encoder.addProperty("flags", flags); } + + /** + * @hide + * @return True if the layout parameters will cause the window to cover the full screen; + * false otherwise. + */ + public boolean isFullscreen() { + return x == 0 && y == 0 + && width == WindowManager.LayoutParams.MATCH_PARENT + && height == WindowManager.LayoutParams.MATCH_PARENT; + } } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 8e2097ae26096..d36d2f187e53a 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -5417,7 +5417,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // represent should be hidden or if we should hide the lockscreen. For attached app // windows we defer the decision to the window it is attached to. if (appWindow && attached == null) { - if (isFullscreen(attrs) && StackId.normallyFullscreenWindows(stackId)) { + if (attrs.isFullscreen() && StackId.normallyFullscreenWindows(stackId)) { if (DEBUG_LAYOUT) Slog.v(TAG, "Fullscreen window: " + win); mTopFullscreenOpaqueWindowState = win; if (mTopFullscreenOpaqueOrDimmingWindowState == null) { @@ -5456,7 +5456,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // separately, because both the "real fullscreen" opaque window and the one for the docked // stack can control View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR. if (mTopDockedOpaqueWindowState == null && affectsSystemUi && appWindow && attached == null - && isFullscreen(attrs) && stackId == DOCKED_STACK_ID) { + && attrs.isFullscreen() && stackId == DOCKED_STACK_ID) { mTopDockedOpaqueWindowState = win; if (mTopDockedOpaqueOrDimmingWindowState == null) { mTopDockedOpaqueOrDimmingWindowState = win; @@ -5481,12 +5481,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } - private boolean isFullscreen(WindowManager.LayoutParams attrs) { - return attrs.x == 0 && attrs.y == 0 - && attrs.width == WindowManager.LayoutParams.MATCH_PARENT - && attrs.height == WindowManager.LayoutParams.MATCH_PARENT; - } - /** {@inheritDoc} */ @Override public int finishPostLayoutPolicyLw() { diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 05f4626259d78..a37b2e56b0d0b 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2992,14 +2992,14 @@ class DisplayContent extends WindowContainer implements DimLayer.DimLayerU return token != null ? token.findMainWindow() : null; } + AppWindowToken getTopFullscreenAppToken() { + for (int i = mChildren.size() - 1; i >= 0; i--) { + final AppWindowToken token = mChildren.get(i); + final WindowState win = token.findMainWindow(); + if (win != null && win.mAttrs.isFullscreen()) { + return token; + } + } + return null; + } + AppWindowToken getTopVisibleAppToken() { for (int i = mChildren.size() - 1; i >= 0; i--) { final AppWindowToken token = mChildren.get(i); diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 469dab4e0a3ee..d7f049621632f 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -151,14 +151,27 @@ class TaskSnapshotSurface implements StartingSurface { final int currentOrientation; synchronized (service.mWindowMap) { final WindowState mainWindow = token.findMainWindow(); - if (mainWindow == null) { + final Task task = token.getTask(); + if (task == null) { + Slog.w(TAG, "TaskSnapshotSurface.create: Failed to find task for token=" + + token); + return null; + } + final AppWindowToken topFullscreenToken = token.getTask().getTopFullscreenAppToken(); + if (topFullscreenToken == null) { + Slog.w(TAG, "TaskSnapshotSurface.create: Failed to find top fullscreen for task=" + + task); + return null; + } + final WindowState topFullscreenWindow = topFullscreenToken.findMainWindow(); + if (mainWindow == null || topFullscreenWindow == null) { Slog.w(TAG, "TaskSnapshotSurface.create: Failed to find main window for token=" + token); return null; } - sysUiVis = mainWindow.getSystemUiVisibility(); - windowFlags = mainWindow.getAttrs().flags; - windowPrivateFlags = mainWindow.getAttrs().privateFlags; + sysUiVis = topFullscreenWindow.getSystemUiVisibility(); + windowFlags = topFullscreenWindow.getAttrs().flags; + windowPrivateFlags = topFullscreenWindow.getAttrs().privateFlags; layoutParams.dimAmount = mainWindow.getAttrs().dimAmount; layoutParams.type = TYPE_APPLICATION_STARTING; @@ -172,22 +185,17 @@ class TaskSnapshotSurface implements StartingSurface { layoutParams.width = LayoutParams.MATCH_PARENT; layoutParams.height = LayoutParams.MATCH_PARENT; layoutParams.systemUiVisibility = sysUiVis; - final Task task = token.getTask(); - if (task != null) { - layoutParams.setTitle(String.format(TITLE_FORMAT, task.mTaskId)); + layoutParams.setTitle(String.format(TITLE_FORMAT, task.mTaskId)); - final TaskDescription taskDescription = task.getTaskDescription(); - if (taskDescription != null) { - backgroundColor = taskDescription.getBackgroundColor(); - statusBarColor = taskDescription.getStatusBarColor(); - navigationBarColor = taskDescription.getNavigationBarColor(); - } - taskBounds = new Rect(); - task.getBounds(taskBounds); - } else { - taskBounds = null; + final TaskDescription taskDescription = task.getTaskDescription(); + if (taskDescription != null) { + backgroundColor = taskDescription.getBackgroundColor(); + statusBarColor = taskDescription.getStatusBarColor(); + navigationBarColor = taskDescription.getNavigationBarColor(); } - currentOrientation = mainWindow.getConfiguration().orientation; + taskBounds = new Rect(); + task.getBounds(taskBounds); + currentOrientation = topFullscreenWindow.getConfiguration().orientation; } try { final int res = session.addToDisplay(window, window.mSeq, layoutParams,