DisplayCutout: Dispatch all non-zero safeInsets
Ensures that even if the display cutout does not overlap
a window, the safe insets are still dispatched if the window
overlaps any part of the cutout area and the safe insets
are therefore non-zero.
To do that, we need to compute the insets once against the
display size, then only shrink or expand the safe insets
accordingly.
Bug: 73533636
Test: atest DisplayCutoutTest
Change-Id: I1ea449178e29c7effdd92cac78af1a3875ca7e70
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index d22828d..841586a 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -138,6 +138,7 @@
import android.util.ArraySet;
import android.util.DisplayMetrics;
import android.util.MutableBoolean;
+import android.util.Size;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import android.view.Display;
@@ -1197,14 +1198,20 @@
DisplayCutout calculateDisplayCutoutForCurrentRotation() {
final DisplayCutout cutout = mInitialDisplayCutout;
- if (cutout == null || cutout == DisplayCutout.NO_CUTOUT || mRotation == ROTATION_0) {
+ if (cutout == null || cutout == DisplayCutout.NO_CUTOUT) {
return cutout;
}
+ if (mRotation == ROTATION_0) {
+ return cutout.computeSafeInsets(mInitialDisplayWidth, mInitialDisplayHeight);
+ }
+ final boolean rotated = (mRotation == ROTATION_90 || mRotation == ROTATION_270);
final Path bounds = cutout.getBounds().getBoundaryPath();
transformPhysicalToLogicalCoordinates(mRotation, mInitialDisplayWidth,
mInitialDisplayHeight, mTmpMatrix);
bounds.transform(mTmpMatrix);
- return DisplayCutout.fromBounds(bounds);
+ return DisplayCutout.fromBounds(bounds).computeSafeInsets(
+ rotated ? mInitialDisplayHeight : mInitialDisplayWidth,
+ rotated ? mInitialDisplayWidth : mInitialDisplayHeight);
}
/**
diff --git a/services/core/java/com/android/server/wm/DisplayFrames.java b/services/core/java/com/android/server/wm/DisplayFrames.java
index 13d0c86..57ce15bc 100644
--- a/services/core/java/com/android/server/wm/DisplayFrames.java
+++ b/services/core/java/com/android/server/wm/DisplayFrames.java
@@ -22,17 +22,12 @@
import static com.android.server.wm.proto.DisplayFramesProto.STABLE_BOUNDS;
import android.annotation.NonNull;
-import android.content.res.Resources;
-import android.graphics.Point;
import android.graphics.Rect;
import android.util.proto.ProtoOutputStream;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
-import com.android.internal.annotations.VisibleForTesting;
-
import java.io.PrintWriter;
-import java.util.Arrays;
/**
* Container class for all the display frames that affect how we do window layout on a display.
@@ -173,7 +168,7 @@
mStableFullscreen.set(mUnrestricted);
mCurrent.set(mUnrestricted);
- mDisplayCutout = mDisplayInfoCutout.calculateRelativeTo(mOverscan);
+ mDisplayCutout = mDisplayInfoCutout;
mDisplayCutoutSafe.set(Integer.MIN_VALUE, Integer.MIN_VALUE,
Integer.MAX_VALUE, Integer.MAX_VALUE);
if (!mDisplayCutout.isEmpty()) {