From 84bc3d7b4078049d054601b2d953f761374e3b26 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 19 Dec 2019 19:24:07 +0800 Subject: [PATCH] Use opaque window as reference to show snapshot starting window A fully transparent window won't display any content on screen. It also cannot affect insets appearance (system ui flags) so it should not affect creating starting window. Otherwise the status bar color may be wrong when the starting window is showing. Bug: 140811348 Test: atest AppWindowTokenTests#testGetTopFullscreenOpaqueWindow Test: 1. Click quick search box on launcher. 2. Dismiss the search view. 3. Turn off screen and unlock. 4. Check the text color of status bar. Change-Id: I54f837295a32d3ab6bb54d2d69aa50d8f50b0fa9 --- .../server/policy/WindowManagerPolicy.java | 7 ------- .../com/android/server/wm/ActivityRecord.java | 6 +++--- .../server/wm/TaskSnapshotController.java | 10 +++++----- .../android/server/wm/TaskSnapshotSurface.java | 16 ++++++++-------- .../java/com/android/server/wm/WindowState.java | 16 +++++++++++----- .../android/server/wm/AppWindowTokenTests.java | 12 +++++++----- 6 files changed, 34 insertions(+), 33 deletions(-) diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java index f608642f3b81e..a2425a349b7cc 100644 --- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java +++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java @@ -335,13 +335,6 @@ public interface WindowManagerPolicy extends WindowManagerPolicyConstants { */ boolean isAnimatingLw(); - /** - * @return Whether the window can affect SystemUI flags, meaning that SystemUI (system bars, - * for example) will be affected by the flags specified in this window. This is the - * case when the surface is on screen but not exiting. - */ - boolean canAffectSystemUiFlags(); - /** * Is this window considered to be gone for purposes of layout? */ diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 6bfa1aea49316..bfc626828fa0a 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5576,12 +5576,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A /** * @return The to top most child window for which {@link LayoutParams#isFullscreen()} returns - * true. + * true and isn't fully transparent. */ - WindowState getTopFullscreenWindow() { + WindowState getTopFullscreenOpaqueWindow() { for (int i = mChildren.size() - 1; i >= 0; i--) { final WindowState win = mChildren.get(i); - if (win != null && win.mAttrs.isFullscreen()) { + if (win != null && win.mAttrs.isFullscreen() && !win.isFullyTransparent()) { return win; } } diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index dee9e9f266a83..a2212278c458c 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -511,16 +511,16 @@ class TaskSnapshotController { } /** - * @return The SystemUI visibility flags for the top fullscreen window in the given + * @return The SystemUI visibility flags for the top fullscreen opaque window in the given * {@param task}. */ private int getSystemUiVisibility(Task task) { final ActivityRecord topFullscreenActivity = task.getTopFullscreenActivity(); - final WindowState topFullscreenWindow = topFullscreenActivity != null - ? topFullscreenActivity.getTopFullscreenWindow() + final WindowState topFullscreenOpaqueWindow = topFullscreenActivity != null + ? topFullscreenActivity.getTopFullscreenOpaqueWindow() : null; - if (topFullscreenWindow != null) { - return topFullscreenWindow.getSystemUiVisibility(); + if (topFullscreenOpaqueWindow != null) { + return topFullscreenOpaqueWindow.getSystemUiVisibility(); } return 0; } diff --git a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 1484d6aeabefe..c877a632d7f51 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -155,7 +155,7 @@ class TaskSnapshotSurface implements StartingSurface { final MergedConfiguration tmpMergedConfiguration = new MergedConfiguration(); final TaskDescription taskDescription = new TaskDescription(); taskDescription.setBackgroundColor(WHITE); - final WindowState topFullscreenWindow; + final WindowState topFullscreenOpaqueWindow; final int sysUiVis; final int windowFlags; final int windowPrivateFlags; @@ -175,15 +175,15 @@ class TaskSnapshotSurface implements StartingSurface { + task); return null; } - topFullscreenWindow = topFullscreenActivity.getTopFullscreenWindow(); - if (mainWindow == null || topFullscreenWindow == null) { + topFullscreenOpaqueWindow = topFullscreenActivity.getTopFullscreenOpaqueWindow(); + if (mainWindow == null || topFullscreenOpaqueWindow == null) { Slog.w(TAG, "TaskSnapshotSurface.create: Failed to find main window for activity=" + activity); return null; } - sysUiVis = topFullscreenWindow.getSystemUiVisibility(); - windowFlags = topFullscreenWindow.getAttrs().flags; - windowPrivateFlags = topFullscreenWindow.getAttrs().privateFlags; + sysUiVis = topFullscreenOpaqueWindow.getSystemUiVisibility(); + windowFlags = topFullscreenOpaqueWindow.getAttrs().flags; + windowPrivateFlags = topFullscreenOpaqueWindow.getAttrs().privateFlags; layoutParams.packageName = mainWindow.getAttrs().packageName; layoutParams.windowAnimations = mainWindow.getAttrs().windowAnimations; @@ -206,7 +206,7 @@ class TaskSnapshotSurface implements StartingSurface { } taskBounds = new Rect(); task.getBounds(taskBounds); - currentOrientation = topFullscreenWindow.getConfiguration().orientation; + currentOrientation = topFullscreenOpaqueWindow.getConfiguration().orientation; } try { final int res = session.addToDisplay(window, window.mSeq, layoutParams, @@ -222,7 +222,7 @@ class TaskSnapshotSurface implements StartingSurface { final TaskSnapshotSurface snapshotSurface = new TaskSnapshotSurface(service, window, surfaceControl, snapshot, layoutParams.getTitle(), taskDescription, sysUiVis, windowFlags, windowPrivateFlags, taskBounds, - currentOrientation, topFullscreenWindow.getClientInsetsState()); + currentOrientation, topFullscreenOpaqueWindow.getClientInsetsState()); window.setOuter(snapshotSurface); try { session.relayout(window, window.mSeq, layoutParams, -1, -1, View.VISIBLE, 0, -1, diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 6918c966a3ec1..04ad4be3d172d 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1642,11 +1642,17 @@ class WindowState extends WindowContainer implements WindowManagerP && (parentAndClientVisible || isAnimating(TRANSITION | PARENTS)); } - // TODO: Another visibility method that was added late in the release to minimize risk. - @Override - public boolean canAffectSystemUiFlags() { - final boolean translucent = mAttrs.alpha == 0.0f; - if (translucent) { + boolean isFullyTransparent() { + return mAttrs.alpha == 0f; + } + + /** + * @return Whether the window can affect SystemUI flags, meaning that SystemUI (system bars, + * for example) will be affected by the flags specified in this window. This is the + * case when the surface is on screen but not exiting. + */ + boolean canAffectSystemUiFlags() { + if (isFullyTransparent()) { return false; } if (mActivityRecord == null) { diff --git a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java index 0c7fad46804c2..70e5ee71b448d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppWindowTokenTests.java @@ -135,17 +135,19 @@ public class AppWindowTokenTests extends WindowTestsBase { @Test @Presubmit - public void testGetTopFullscreenWindow() { - assertNull(mActivity.getTopFullscreenWindow()); + public void testGetTopFullscreenOpaqueWindow() { + assertNull(mActivity.getTopFullscreenOpaqueWindow()); final WindowState window1 = createWindow(null, TYPE_BASE_APPLICATION, mActivity, "window1"); final WindowState window11 = createWindow(null, TYPE_APPLICATION, mActivity, "window11"); final WindowState window12 = createWindow(null, TYPE_APPLICATION, mActivity, "window12"); - assertEquals(window12, mActivity.getTopFullscreenWindow()); + assertEquals(window12, mActivity.getTopFullscreenOpaqueWindow()); window12.mAttrs.width = 500; - assertEquals(window11, mActivity.getTopFullscreenWindow()); + assertEquals(window11, mActivity.getTopFullscreenOpaqueWindow()); window11.mAttrs.width = 500; - assertEquals(window1, mActivity.getTopFullscreenWindow()); + assertEquals(window1, mActivity.getTopFullscreenOpaqueWindow()); + window1.mAttrs.alpha = 0f; + assertNull(mActivity.getTopFullscreenOpaqueWindow()); mActivity.removeImmediately(); }