summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/WindowLayout.java40
1 files changed, 15 insertions, 25 deletions
diff --git a/core/java/android/view/WindowLayout.java b/core/java/android/view/WindowLayout.java
index ad9f21b4fa70..6b233a26a72d 100644
--- a/core/java/android/view/WindowLayout.java
+++ b/core/java/android/view/WindowLayout.java
@@ -176,6 +176,8 @@ public class WindowLayout {
final boolean hasCompatScale = compatScale != 1f;
final int pw = outParentFrame.width();
final int ph = outParentFrame.height();
+ final boolean extendedByCutout =
+ (attrs.privateFlags & PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT) != 0;
int rw = requestedWidth;
int rh = requestedHeight;
float x, y;
@@ -183,11 +185,13 @@ public class WindowLayout {
// If the view hierarchy hasn't been measured, the requested width and height would be
// UNSPECIFIED_LENGTH. This can happen in the first layout of a window or in the simulated
- // layout.
- if (rw == UNSPECIFIED_LENGTH) {
+ // layout. If extendedByCutout is true, we cannot use the requested lengths. Otherwise,
+ // the window frame might be extended again because the requested lengths may come from the
+ // window frame.
+ if (rw == UNSPECIFIED_LENGTH || extendedByCutout) {
rw = attrs.width >= 0 ? attrs.width : pw;
}
- if (rh == UNSPECIFIED_LENGTH) {
+ if (rh == UNSPECIFIED_LENGTH || extendedByCutout) {
rh = attrs.height >= 0 ? attrs.height : ph;
}
@@ -259,29 +263,15 @@ public class WindowLayout {
Gravity.applyDisplay(attrs.gravity, outDisplayFrame, outFrame);
}
- if ((attrs.privateFlags & PRIVATE_FLAG_LAYOUT_SIZE_EXTENDED_BY_CUTOUT) != 0
- && !cutout.isEmpty()) {
- // If the actual frame covering a display cutout, and the window is requesting to extend
- // it's requested frame, re-do the frame calculation after getting the new requested
- // size.
+ if (extendedByCutout && !displayCutoutSafe.contains(outFrame)) {
mTempRect.set(outFrame);
- // Do nothing if the display cutout and window don't overlap entirely. This may happen
- // when the cutout is not on the same side with the window.
- boolean shouldExpand = false;
- final Rect [] cutoutBounds = cutout.getBoundingRectsAll();
- for (Rect cutoutBound : cutoutBounds) {
- if (cutoutBound.isEmpty()) continue;
- if (mTempRect.contains(cutoutBound) || cutoutBound.contains(mTempRect)) {
- shouldExpand = true;
- break;
- }
- }
- if (shouldExpand) {
- // Try to fit move the bar to avoid the display cutout first. Make sure the clip
- // flags are not set to make the window move.
- final int clipFlags = DISPLAY_CLIP_VERTICAL | DISPLAY_CLIP_HORIZONTAL;
- Gravity.applyDisplay(attrs.gravity & ~clipFlags, displayCutoutSafe,
- mTempRect);
+
+ // Move the frame into displayCutoutSafe.
+ final int clipFlags = DISPLAY_CLIP_VERTICAL | DISPLAY_CLIP_HORIZONTAL;
+ Gravity.applyDisplay(attrs.gravity & ~clipFlags, displayCutoutSafe,
+ mTempRect);
+
+ if (mTempRect.intersect(outDisplayFrame)) {
outFrame.union(mTempRect);
}
}