summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHeemin Seog <hseog@google.com>2020-10-02 16:17:57 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-10-02 16:17:57 +0000
commit530bebf0302fece760126a34b47a6b64ddcbde8e (patch)
tree6aded09ea85e29ff9287f4288ee983ff2d76a863
parent960ffca13a519b0fb9e0942665577c62f97d0eea (diff)
parent658f85c5c42bf2819683e786b24e6edc98065599 (diff)
downloadbase-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.java42
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayPolicyLayoutTests.java46
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;