diff options
author | Heemin Seog <hseog@google.com> | 2020-10-02 16:17:57 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-10-02 16:17:57 +0000 |
commit | 530bebf0302fece760126a34b47a6b64ddcbde8e (patch) | |
tree | 6aded09ea85e29ff9287f4288ee983ff2d76a863 | |
parent | 960ffca13a519b0fb9e0942665577c62f97d0eea (diff) | |
parent | 658f85c5c42bf2819683e786b24e6edc98065599 (diff) | |
download | base-530bebf0302fece760126a34b47a6b64ddcbde8e.tar.gz |
Merge "DO NOT MERGE Update the stable display frame for flexible insets" into rvc-qpr-dev
-rw-r--r-- | services/core/java/com/android/server/wm/DisplayPolicy.java | 42 | ||||
-rw-r--r-- | services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java | 46 |
2 files changed, 88 insertions, 0 deletions
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index c691a0e220ed..515d1f58d3ef 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -2659,6 +2659,14 @@ public class DisplayPolicy { } win.computeFrame(displayFrames); + + // When system bars are added to the Android device through {@link #layoutStatusBar} and + // {@link #layoutNavigationBar}, the displayFrames are adjusted to take the system bars into + // account. The call below adjusts the display frames for system bars which use flexible + // insets mapping instead of {@link #layoutStatusbar} and {@link #layoutNavigationBar}. Note + // that this call is a no-op if not using flexible insets mapping. + adjustDisplayFramesForFlexibleInsets(win, displayFrames); + // Dock windows carve out the bottom of the screen, so normal windows // can't appear underneath them. if (type == TYPE_INPUT_METHOD && win.isVisibleLw() @@ -2671,6 +2679,40 @@ public class DisplayPolicy { } } + private void adjustDisplayFramesForFlexibleInsets(WindowState win, + DisplayFrames displayFrames) { + if (win == mStatusBarAlt) { + adjustDisplayFramesForWindow(win, mStatusBarAltPosition, displayFrames); + } else if (win == mNavigationBarAlt) { + adjustDisplayFramesForWindow(win, mNavigationBarAltPosition, displayFrames); + } else if (win == mClimateBarAlt) { + adjustDisplayFramesForWindow(win, mClimateBarAltPosition, displayFrames); + } else if (win == mExtraNavBarAlt) { + adjustDisplayFramesForWindow(win, mExtraNavBarAltPosition, displayFrames); + } + } + + private static void adjustDisplayFramesForWindow(WindowState win, + @WindowManagerPolicy.AltBarPosition int position, DisplayFrames displayFrames) { + final Rect frame = win.getFrameLw(); + + // Note: This doesn't take into account display cutouts. + switch (position) { + case ALT_BAR_TOP: + displayFrames.mStable.top = frame.bottom; + break; + case ALT_BAR_BOTTOM: + displayFrames.mStable.bottom = displayFrames.mStableFullscreen.bottom = frame.top; + break; + case ALT_BAR_LEFT: + displayFrames.mStable.left = displayFrames.mStableFullscreen.left = frame.right; + break; + case ALT_BAR_RIGHT: + displayFrames.mStable.right = displayFrames.mStableFullscreen.right = frame.left; + break; + } + } + private void layoutWallpaper(DisplayFrames displayFrames, Rect pf, Rect df, Rect cf) { // The wallpaper has Real Ultimate Power df.set(displayFrames.mUnrestricted); 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 cb9b49abfe2b..58d4104bf2b0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java @@ -45,6 +45,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR; +import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL; import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR_SUB_PANEL; import static android.view.WindowManagerPolicyConstants.ALT_BAR_BOTTOM; import static android.view.WindowManagerPolicyConstants.ALT_BAR_LEFT; @@ -753,6 +754,51 @@ public class DisplayPolicyLayoutTests extends DisplayPolicyTestsBase { } @Test + public void layoutWindowLw_withFlexibleSystemBars_adjustStableFrame() { + mDisplayPolicy.removeWindowLw(mStatusBarWindow); + mDisplayPolicy.removeWindowLw(mNavBarWindow); + + WindowState statusWin = spy(createWindow(null, TYPE_STATUS_BAR_ADDITIONAL, + "StatusBarAdditional")); + doNothing().when(statusWin).computeFrameLw(); + statusWin.mAttrs.providesInsetsTypes = new int[]{ITYPE_STATUS_BAR}; + statusWin.mAttrs.gravity = Gravity.TOP; + statusWin.mAttrs.height = STATUS_BAR_HEIGHT; + statusWin.mAttrs.width = MATCH_PARENT; + statusWin.getFrameLw().set(0, 0, DISPLAY_WIDTH, STATUS_BAR_HEIGHT); + addWindow(statusWin); + + WindowState navWin = spy(createWindow(null, TYPE_NAVIGATION_BAR_PANEL, + "NavigationBarPanel")); + doNothing().when(navWin).computeFrameLw(); + navWin.mAttrs.providesInsetsTypes = new int[]{ITYPE_NAVIGATION_BAR}; + navWin.mAttrs.gravity = Gravity.BOTTOM; + navWin.mAttrs.height = NAV_BAR_HEIGHT; + navWin.mAttrs.width = MATCH_PARENT; + navWin.getFrameLw().set(0, DISPLAY_HEIGHT - NAV_BAR_HEIGHT, DISPLAY_WIDTH, DISPLAY_HEIGHT); + addWindow(navWin); + + WindowState climateWin = spy(createWindow(null, TYPE_NAVIGATION_BAR_PANEL, + "ClimatePanel")); + doNothing().when(climateWin).computeFrameLw(); + climateWin.mAttrs.providesInsetsTypes = new int[]{ITYPE_CLIMATE_BAR}; + climateWin.mAttrs.gravity = Gravity.LEFT; + climateWin.mAttrs.height = MATCH_PARENT; + climateWin.mAttrs.width = 20; + climateWin.getFrameLw().set(0, 0, 20, DISPLAY_HEIGHT); + addWindow(climateWin); + + mDisplayPolicy.beginLayoutLw(mFrames, 0 /* UI mode */); + mDisplayPolicy.layoutWindowLw(statusWin, null, mFrames); + mDisplayPolicy.layoutWindowLw(navWin, null, mFrames); + mDisplayPolicy.layoutWindowLw(climateWin, null, mFrames); + + assertThat(mFrames.mStable, + is(new Rect(20, STATUS_BAR_HEIGHT, DISPLAY_WIDTH, + DISPLAY_HEIGHT - NAV_BAR_HEIGHT))); + } + + @Test public void layoutHint_appWindow() { mWindow.mAttrs.flags = FLAG_LAYOUT_IN_SCREEN | FLAG_LAYOUT_INSET_DECOR | FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS; |