From a099ac1f983bbaf04e1413409e63fff8c61f6b6c Mon Sep 17 00:00:00 2001 From: shawnlin Date: Tue, 9 Mar 2021 12:04:06 +0800 Subject: [PATCH] Fixed RoundedCorner bugs 1. Fixed WindowInsets.getRoundedCorner() returns negative centers - negative centers should be treated as empty rounded corner. 2. Fixed Display.getRoundedCorner() doesn't align the current rotation - return the correct rounded corners of the current rotation. Bug: 182227121 Test: atest RoundedCornerTest Change-Id: I701afc4e7908d51af60c18e7b2adebc770138543 --- core/java/android/view/RoundedCorner.java | 2 +- core/java/android/view/RoundedCorners.java | 8 ++++---- .../coretests/src/android/view/RoundedCornerTest.java | 7 +++++++ .../core/java/com/android/server/wm/DisplayContent.java | 2 ++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/java/android/view/RoundedCorner.java b/core/java/android/view/RoundedCorner.java index cc7525b48aa2a..56b438350d068 100644 --- a/core/java/android/view/RoundedCorner.java +++ b/core/java/android/view/RoundedCorner.java @@ -163,7 +163,7 @@ public final class RoundedCorner implements Parcelable { * @hide */ public boolean isEmpty() { - return mRadius == 0 || mCenter.x == 0 || mCenter.y == 0; + return mRadius == 0 || mCenter.x <= 0 || mCenter.y <= 0; } private String getPositionString(@Position int position) { diff --git a/core/java/android/view/RoundedCorners.java b/core/java/android/view/RoundedCorners.java index 569c287901c7a..623d9692ac806 100644 --- a/core/java/android/view/RoundedCorners.java +++ b/core/java/android/view/RoundedCorners.java @@ -181,16 +181,16 @@ public class RoundedCorners implements Parcelable { boolean hasRoundedCorner; switch (position) { case POSITION_TOP_LEFT: - hasRoundedCorner = radius > insetTop || radius > insetLeft; + hasRoundedCorner = radius > insetTop && radius > insetLeft; break; case POSITION_TOP_RIGHT: - hasRoundedCorner = radius > insetTop || radius > insetRight; + hasRoundedCorner = radius > insetTop && radius > insetRight; break; case POSITION_BOTTOM_RIGHT: - hasRoundedCorner = radius > insetBottom || radius > insetRight; + hasRoundedCorner = radius > insetBottom && radius > insetRight; break; case POSITION_BOTTOM_LEFT: - hasRoundedCorner = radius > insetBottom || radius > insetLeft; + hasRoundedCorner = radius > insetBottom && radius > insetLeft; break; default: throw new IllegalArgumentException( diff --git a/core/tests/coretests/src/android/view/RoundedCornerTest.java b/core/tests/coretests/src/android/view/RoundedCornerTest.java index 8eb13bc03b4be..43490213c29a6 100644 --- a/core/tests/coretests/src/android/view/RoundedCornerTest.java +++ b/core/tests/coretests/src/android/view/RoundedCornerTest.java @@ -61,6 +61,13 @@ public class RoundedCornerTest { assertThat(roundedCorner.isEmpty(), is(true)); } + @Test + public void testIsEmpty_negativeCenter() { + RoundedCorner roundedCorner = + new RoundedCorner(RoundedCorner.POSITION_BOTTOM_LEFT, 1, -2, -3); + assertThat(roundedCorner.isEmpty(), is(true)); + } + @Test public void testEquals() { RoundedCorner roundedCorner = new RoundedCorner( diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 1d45c6e1a3715..979172e48ea97 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1868,6 +1868,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // Update application display metrics. final WmDisplayCutout wmDisplayCutout = calculateDisplayCutoutForRotation(rotation); final DisplayCutout displayCutout = wmDisplayCutout.getDisplayCutout(); + final RoundedCorners roundedCorners = calculateRoundedCornersForRotation(rotation); final int appWidth = mDisplayPolicy.getNonDecorDisplayWidth(dw, dh, rotation, uiMode, displayCutout); @@ -1884,6 +1885,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null); } mDisplayInfo.displayCutout = displayCutout.isEmpty() ? null : displayCutout; + mDisplayInfo.roundedCorners = roundedCorners; mDisplayInfo.getAppMetrics(mDisplayMetrics); if (mDisplayScalingDisabled) { mDisplayInfo.flags |= Display.FLAG_SCALING_DISABLED;