Only use simple rects for cutout region
Otherwise there is a big performance hit in all kinds of
situations where we do operations with the region, specifically
when:
- updating input windows
- insetting the cutout during layout
- touch dispatch
Test: DisplayCutoutTest, WmDisplayCutoutTest
Bug: 110464019
Bug: 110452325
Change-Id: I94a25c3794ecd33b8b7204ca308ac91623498f13
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 47dbccb..2887e5ef 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -1253,11 +1253,21 @@
cutout, mInitialDisplayWidth, mInitialDisplayHeight);
}
final boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270);
- final Path bounds = cutout.getBounds().getBoundaryPath();
+ final List<Rect> bounds = WmDisplayCutout.computeSafeInsets(
+ cutout, mInitialDisplayWidth, mInitialDisplayHeight)
+ .getDisplayCutout().getBoundingRects();
transformPhysicalToLogicalCoordinates(rotation, mInitialDisplayWidth, mInitialDisplayHeight,
mTmpMatrix);
- bounds.transform(mTmpMatrix);
- return WmDisplayCutout.computeSafeInsets(DisplayCutout.fromBounds(bounds),
+ final Region region = Region.obtain();
+ for (int i = 0; i < bounds.size(); i++) {
+ final Rect rect = bounds.get(i);
+ final RectF rectF = new RectF(bounds.get(i));
+ mTmpMatrix.mapRect(rectF);
+ rectF.round(rect);
+ region.op(rect, Op.UNION);
+ }
+
+ return WmDisplayCutout.computeSafeInsets(DisplayCutout.fromBounds(region),
rotated ? mInitialDisplayHeight : mInitialDisplayWidth,
rotated ? mInitialDisplayWidth : mInitialDisplayHeight);
}