From 0d8337643334204a811bb1e252a58203a68fa9c5 Mon Sep 17 00:00:00 2001 From: chaviw Date: Thu, 20 Jun 2019 17:09:53 -0700 Subject: [PATCH] Fixed screen decor layout frames The initial frames for the screen decor were set to the dock frame. This is incorrect because it incorporates the status bar, preventing the frame from starting at the corners. Instead, set the frame to unrestricted to allow frames in the status bar region. This bug was introduced with the refactor ag/4525486 Fixes: 135706131 Test: No visible change on phone. Fixes issue with auto Test: DisplayPolicyLayoutTests#testScreenDecorWindows Change-Id: I6782a3585252df505b43d3e706b0332c609c7414 --- .../com/android/server/wm/DisplayPolicy.java | 14 ++--- .../server/wm/DisplayPolicyLayoutTests.java | 59 +++++++++++++++++++ 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 7badc7a437743..bbfb3c5556575 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -1494,8 +1494,6 @@ public class DisplayPolicy { } sTmpRect.setEmpty(); - sTmpDockedFrame.set(displayFrames.mDock); - final int displayId = displayFrames.mDisplayId; final Rect dockFrame = displayFrames.mDock; final int displayHeight = displayFrames.mDisplayHeight; @@ -1508,11 +1506,13 @@ public class DisplayPolicy { continue; } - w.getWindowFrames().setFrames(sTmpDockedFrame /* parentFrame */, - sTmpDockedFrame /* displayFrame */, sTmpDockedFrame /* overscanFrame */, - sTmpDockedFrame /* contentFrame */, sTmpDockedFrame /* visibleFrame */, - sTmpRect /* decorFrame */, sTmpDockedFrame /* stableFrame */, - sTmpDockedFrame /* outsetFrame */); + w.getWindowFrames().setFrames(displayFrames.mUnrestricted /* parentFrame */, + displayFrames.mUnrestricted /* displayFrame */, + displayFrames.mUnrestricted /* overscanFrame */, + displayFrames.mUnrestricted /* contentFrame */, + displayFrames.mUnrestricted /* visibleFrame */, sTmpRect /* decorFrame */, + displayFrames.mUnrestricted /* stableFrame */, + displayFrames.mUnrestricted /* outsetFrame */); w.getWindowFrames().setDisplayCutout(displayFrames.mDisplayCutout); w.computeFrameLw(); final Rect frame = w.getFrameLw(); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java index 4a87aa46db581..de184b84857bc 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -16,6 +16,10 @@ package com.android.server.wm; +import static android.view.Gravity.BOTTOM; +import static android.view.Gravity.LEFT; +import static android.view.Gravity.RIGHT; +import static android.view.Gravity.TOP; import static android.view.Surface.ROTATION_0; import static android.view.Surface.ROTATION_270; import static android.view.Surface.ROTATION_90; @@ -26,9 +30,11 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR; import static android.view.WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; +import static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_DRAW_BAR_BACKGROUNDS; +import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_SCREEN_DECOR; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING; import static android.view.WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; @@ -66,6 +72,7 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { private WindowState mWindow; private int mRotation = ROTATION_0; private boolean mHasDisplayCutout; + private static final int DECOR_WINDOW_INSET = 50; @Before public void setUp() throws Exception { @@ -520,6 +527,58 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { } } + @Test + public void testScreenDecorWindows() { + synchronized (mWm.mGlobalLock) { + final WindowState decorWindow = createWindow(null, TYPE_APPLICATION_OVERLAY, + "decorWindow"); + decorWindow.mAttrs.flags |= FLAG_NOT_FOCUSABLE; + decorWindow.mAttrs.privateFlags |= PRIVATE_FLAG_IS_SCREEN_DECOR; + addWindow(decorWindow); + addWindow(mWindow); + + // Decor on top + updateDecorWindow(decorWindow, MATCH_PARENT, DECOR_WINDOW_INSET, TOP); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + assertInsetByTopBottom(mWindow.getContentFrameLw(), DECOR_WINDOW_INSET, NAV_BAR_HEIGHT); + + // Decor on bottom + updateDecorWindow(decorWindow, MATCH_PARENT, DECOR_WINDOW_INSET, BOTTOM); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, + DECOR_WINDOW_INSET); + + // Decor on the left + updateDecorWindow(decorWindow, DECOR_WINDOW_INSET, MATCH_PARENT, LEFT); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + assertInsetBy(mWindow.getContentFrameLw(), DECOR_WINDOW_INSET, STATUS_BAR_HEIGHT, 0, + NAV_BAR_HEIGHT); + + // Decor on the right + updateDecorWindow(decorWindow, DECOR_WINDOW_INSET, MATCH_PARENT, RIGHT); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + assertInsetBy(mWindow.getContentFrameLw(), 0, STATUS_BAR_HEIGHT, DECOR_WINDOW_INSET, + NAV_BAR_HEIGHT); + + // Decor not allowed as inset + updateDecorWindow(decorWindow, DECOR_WINDOW_INSET, DECOR_WINDOW_INSET, TOP); + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(mWindow, null, mFrames); + assertInsetByTopBottom(mWindow.getContentFrameLw(), STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT); + } + } + + private void updateDecorWindow(WindowState decorWindow, int width, int height, int gravity) { + decorWindow.mAttrs.width = width; + decorWindow.mAttrs.height = height; + decorWindow.mAttrs.gravity = gravity; + decorWindow.setRequestedSize(width, height); + } + /** * Asserts that {@code actual} is inset by the given amounts from the full display rect. *