From e1d2b2b70d47b905345fec8e79e6bdb009ffe867 Mon Sep 17 00:00:00 2001 From: shawnlin Date: Thu, 24 Mar 2022 12:34:26 +0800 Subject: [PATCH] Fixed cutout not being updated for non hwc layer Call onDisplayChanged for non-hwc cutout view to update cutout. Bug: 221242189 Test: manual: 1. select double cutout emulation in settings 2. reboot device and check the cutout Test: atest ScreenDecorationsTest Change-Id: I7272249a5a708d5c359d02f3330eb038c7747c78 --- .../android/systemui/ScreenDecorations.java | 13 ++++- .../systemui/ScreenDecorationsTest.java | 52 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index 5de09b13bf6a6..944544de3f3ba 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -143,8 +143,9 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab private int mProviderRefreshToken = 0; @VisibleForTesting protected OverlayWindow[] mOverlays = null; + @VisibleForTesting @Nullable - private DisplayCutoutView[] mCutoutViews; + DisplayCutoutView[] mCutoutViews; @VisibleForTesting ViewGroup mScreenDecorHwcWindow; @VisibleForTesting @@ -365,6 +366,16 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab } updateHwLayerRoundedCornerDrawable(); } + if (mCutoutViews != null) { + final int size = mCutoutViews.length; + for (int i = 0; i < size; i++) { + final DisplayCutoutView cutoutView = mCutoutViews[i]; + if (cutoutView == null) { + continue; + } + cutoutView.onDisplayChanged(displayId); + } + } if (mScreenDecorHwcLayer != null) { mScreenDecorHwcLayer.onDisplayChanged(displayId); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index ac78626ff1263..0df645f5602b6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -126,6 +126,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { private CornerDecorProvider mPrivacyDotBottomLeftDecorProvider; @Mock private CornerDecorProvider mPrivacyDotBottomRightDecorProvider; + @Mock + private Display.Mode mDisplayMode; @Before public void setup() { @@ -1163,6 +1165,56 @@ public class ScreenDecorationsTest extends SysuiTestCase { } + @Test + public void testOnDisplayChanged_hwcLayer() { + setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + true /* fillCutout */, false /* privacyDot */); + final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport(); + decorationSupport.format = PixelFormat.R_8; + doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport(); + + // top cutout + final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; + doReturn(getDisplayCutoutForRotation(Insets.of(0, 1, 0, 0), bounds)) + .when(mScreenDecorations).getCutout(); + + mScreenDecorations.start(); + + final ScreenDecorHwcLayer hwcLayer = mScreenDecorations.mScreenDecorHwcLayer; + spyOn(hwcLayer); + doReturn(mDisplay).when(hwcLayer).getDisplay(); + doReturn(mDisplayMode).when(mDisplay).getMode(); + + mScreenDecorations.mDisplayListener.onDisplayChanged(1); + + verify(hwcLayer, times(1)).onDisplayChanged(1); + } + + @Test + public void testOnDisplayChanged_nonHwcLayer() { + setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, + 0 /* roundedPadding */, false /* multipleRadius */, + true /* fillCutout */, false /* privacyDot */); + + // top cutout + final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null}; + doReturn(getDisplayCutoutForRotation(Insets.of(0, 1, 0, 0), bounds)) + .when(mScreenDecorations).getCutout(); + + mScreenDecorations.start(); + + final ScreenDecorations.DisplayCutoutView cutoutView = + mScreenDecorations.mCutoutViews[BOUNDS_POSITION_TOP]; + spyOn(cutoutView); + doReturn(mDisplay).when(cutoutView).getDisplay(); + doReturn(mDisplayMode).when(mDisplay).getMode(); + + mScreenDecorations.mDisplayListener.onDisplayChanged(1); + + verify(cutoutView, times(1)).onDisplayChanged(1); + } + private void setupResources(int radius, int radiusTop, int radiusBottom, int roundedPadding, boolean multipleRadius, boolean fillCutout, boolean privacyDot) { mContext.getOrCreateTestableResources().addOverride(