Loading packages/SystemUI/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -529,4 +529,7 @@ <!-- Flag to turn on the rendering of the above path or not --> <bool name="config_enableDisplayCutoutProtection">false</bool> <!-- Respect drawable/rounded.xml intrinsic size for multiple radius corner path customization --> <bool name="config_roundedCornerMultipleRadius">false</bool> </resources> packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +18 −6 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.graphics.drawable.VectorDrawable; import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.HandlerThread; Loading Loading @@ -126,8 +127,9 @@ public class ScreenDecorations extends SystemUI implements Tunable { private WindowManager mWindowManager; private int mRotation; private SecureSetting mColorInversionSetting; private boolean mPendingRotationChange; private Handler mHandler; private boolean mPendingRotationChange; private boolean mIsRoundedCornerMultipleRadius; private CameraAvailabilityListener.CameraTransitionCallback mCameraTransitionCallback = new CameraAvailabilityListener.CameraTransitionCallback() { Loading Loading @@ -194,6 +196,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { mRotation = mContext.getDisplay().getRotation(); mWindowManager = mContext.getSystemService(WindowManager.class); mDisplayManager = mContext.getSystemService(DisplayManager.class); mIsRoundedCornerMultipleRadius = mContext.getResources().getBoolean( R.bool.config_roundedCornerMultipleRadius); updateRoundedCornerRadii(); setupDecorations(); setupCameraListener(); Loading Loading @@ -572,15 +576,22 @@ public class ScreenDecorations extends SystemUI implements Tunable { com.android.internal.R.dimen.rounded_corner_radius_top); final int newRoundedDefaultBottom = mContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.rounded_corner_radius_bottom); final boolean roundedCornersChanged = mRoundedDefault != newRoundedDefault || mRoundedDefaultBottom != newRoundedDefaultBottom || mRoundedDefaultTop != newRoundedDefaultTop; if (roundedCornersChanged) { // If config_roundedCornerMultipleRadius set as true, ScreenDecorations respect the // max(width, height) size of drawable/rounded.xml instead of rounded_corner_radius if (mIsRoundedCornerMultipleRadius) { final VectorDrawable d = (VectorDrawable) mContext.getDrawable(R.drawable.rounded); mRoundedDefault = Math.max(d.getIntrinsicWidth(), d.getIntrinsicHeight()); mRoundedDefaultTop = mRoundedDefaultBottom = mRoundedDefault; } else { mRoundedDefault = newRoundedDefault; mRoundedDefaultTop = newRoundedDefaultTop; mRoundedDefaultBottom = newRoundedDefaultBottom; } onTuningChanged(SIZE, null); } } Loading Loading @@ -631,7 +642,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { } private boolean hasRoundedCorners() { return mRoundedDefault > 0 || mRoundedDefaultBottom > 0 || mRoundedDefaultTop > 0; return mRoundedDefault > 0 || mRoundedDefaultBottom > 0 || mRoundedDefaultTop > 0 || mIsRoundedCornerMultipleRadius; } private boolean shouldShowRoundedCorner(@BoundsPosition int pos) { Loading packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +84 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CO import static com.android.systemui.ScreenDecorations.rectsToRegion; import static com.google.common.truth.Truth.assertThat; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; Loading @@ -42,6 +44,7 @@ import static org.mockito.Mockito.when; import android.content.res.Configuration; import android.graphics.Insets; import android.graphics.Rect; import android.graphics.drawable.VectorDrawable; import android.hardware.display.DisplayManager; import android.os.Handler; import android.testing.AndroidTestingRunner; Loading Loading @@ -142,6 +145,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); Loading @@ -161,12 +166,70 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); mScreenDecorations.start(); // Top and bottom windows are created for rounded corners. verify(mWindowManager, times(1)) .addView(eq(mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP]), any()); verify(mWindowManager, times(1)) .addView(eq(mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM]), any()); // Left and right window should be null. assertNull(mScreenDecorations.mOverlays[BOUNDS_POSITION_LEFT]); assertNull(mScreenDecorations.mOverlays[BOUNDS_POSITION_RIGHT]); // One tunable. verify(mTunerService, times(1)).addTunable(any(), any()); } @Test public void testRoundingRadius_NoCutout() { final int testRadius = 1; mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, testRadius); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_top, testRadius); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_bottom, testRadius); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); mScreenDecorations.start(); // Size of corner view should same as rounded_corner_radius{_top|_bottom} assertThat(mScreenDecorations.mRoundedDefault).isEqualTo(testRadius); assertThat(mScreenDecorations.mRoundedDefaultTop).isEqualTo(testRadius); assertThat(mScreenDecorations.mRoundedDefaultBottom).isEqualTo(testRadius); } @Test public void testRoundingMultipleRadius_NoCutout() { final VectorDrawable d = (VectorDrawable) mContext.getDrawable(R.drawable.rounded); final int multipleRadiusSize = Math.max(d.getIntrinsicWidth(), d.getIntrinsicHeight()); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, 9999); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 9999); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, true); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); mScreenDecorations.start(); // Top and bottom windows are created for rounded corners. verify(mWindowManager, times(1)) .addView(eq(mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP]), any()); Loading @@ -179,6 +242,11 @@ public class ScreenDecorationsTest extends SysuiTestCase { // One tunable. verify(mTunerService, times(1)).addTunable(any(), any()); // Size of corner view should exactly match max(width, height) of R.drawable.rounded assertThat(mScreenDecorations.mRoundedDefault).isEqualTo(multipleRadiusSize); assertThat(mScreenDecorations.mRoundedDefaultTop).isEqualTo(multipleRadiusSize); assertThat(mScreenDecorations.mRoundedDefaultBottom).isEqualTo(multipleRadiusSize); } @Test Loading @@ -193,6 +261,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // top cutout doReturn(new DisplayCutout( Loading Loading @@ -227,6 +297,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // left cutout doReturn(new DisplayCutout( Loading Loading @@ -257,6 +329,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // top cutout doReturn(new DisplayCutout( Loading Loading @@ -288,6 +362,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // left cutout doReturn(new DisplayCutout( Loading Loading @@ -319,6 +395,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // top and left cutout doReturn(new DisplayCutout( Loading Loading @@ -355,6 +433,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // Set to short edge cutout(top). doReturn(new DisplayCutout( Loading Loading @@ -402,6 +482,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // top cutout doReturn(new DisplayCutout( Loading Loading @@ -440,6 +522,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); mScreenDecorations.start(); assertEquals(mScreenDecorations.mRoundedDefault, 20); Loading Loading
packages/SystemUI/res/values/config.xml +3 −0 Original line number Diff line number Diff line Loading @@ -529,4 +529,7 @@ <!-- Flag to turn on the rendering of the above path or not --> <bool name="config_enableDisplayCutoutProtection">false</bool> <!-- Respect drawable/rounded.xml intrinsic size for multiple radius corner path customization --> <bool name="config_roundedCornerMultipleRadius">false</bool> </resources>
packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +18 −6 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; import android.graphics.drawable.VectorDrawable; import android.hardware.display.DisplayManager; import android.os.Handler; import android.os.HandlerThread; Loading Loading @@ -126,8 +127,9 @@ public class ScreenDecorations extends SystemUI implements Tunable { private WindowManager mWindowManager; private int mRotation; private SecureSetting mColorInversionSetting; private boolean mPendingRotationChange; private Handler mHandler; private boolean mPendingRotationChange; private boolean mIsRoundedCornerMultipleRadius; private CameraAvailabilityListener.CameraTransitionCallback mCameraTransitionCallback = new CameraAvailabilityListener.CameraTransitionCallback() { Loading Loading @@ -194,6 +196,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { mRotation = mContext.getDisplay().getRotation(); mWindowManager = mContext.getSystemService(WindowManager.class); mDisplayManager = mContext.getSystemService(DisplayManager.class); mIsRoundedCornerMultipleRadius = mContext.getResources().getBoolean( R.bool.config_roundedCornerMultipleRadius); updateRoundedCornerRadii(); setupDecorations(); setupCameraListener(); Loading Loading @@ -572,15 +576,22 @@ public class ScreenDecorations extends SystemUI implements Tunable { com.android.internal.R.dimen.rounded_corner_radius_top); final int newRoundedDefaultBottom = mContext.getResources().getDimensionPixelSize( com.android.internal.R.dimen.rounded_corner_radius_bottom); final boolean roundedCornersChanged = mRoundedDefault != newRoundedDefault || mRoundedDefaultBottom != newRoundedDefaultBottom || mRoundedDefaultTop != newRoundedDefaultTop; if (roundedCornersChanged) { // If config_roundedCornerMultipleRadius set as true, ScreenDecorations respect the // max(width, height) size of drawable/rounded.xml instead of rounded_corner_radius if (mIsRoundedCornerMultipleRadius) { final VectorDrawable d = (VectorDrawable) mContext.getDrawable(R.drawable.rounded); mRoundedDefault = Math.max(d.getIntrinsicWidth(), d.getIntrinsicHeight()); mRoundedDefaultTop = mRoundedDefaultBottom = mRoundedDefault; } else { mRoundedDefault = newRoundedDefault; mRoundedDefaultTop = newRoundedDefaultTop; mRoundedDefaultBottom = newRoundedDefaultBottom; } onTuningChanged(SIZE, null); } } Loading Loading @@ -631,7 +642,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { } private boolean hasRoundedCorners() { return mRoundedDefault > 0 || mRoundedDefaultBottom > 0 || mRoundedDefaultTop > 0; return mRoundedDefault > 0 || mRoundedDefaultBottom > 0 || mRoundedDefaultTop > 0 || mIsRoundedCornerMultipleRadius; } private boolean shouldShowRoundedCorner(@BoundsPosition int pos) { Loading
packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +84 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_IS_ROUNDED_CO import static com.android.systemui.ScreenDecorations.rectsToRegion; import static com.google.common.truth.Truth.assertThat; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; Loading @@ -42,6 +44,7 @@ import static org.mockito.Mockito.when; import android.content.res.Configuration; import android.graphics.Insets; import android.graphics.Rect; import android.graphics.drawable.VectorDrawable; import android.hardware.display.DisplayManager; import android.os.Handler; import android.testing.AndroidTestingRunner; Loading Loading @@ -142,6 +145,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); Loading @@ -161,12 +166,70 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); mScreenDecorations.start(); // Top and bottom windows are created for rounded corners. verify(mWindowManager, times(1)) .addView(eq(mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP]), any()); verify(mWindowManager, times(1)) .addView(eq(mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM]), any()); // Left and right window should be null. assertNull(mScreenDecorations.mOverlays[BOUNDS_POSITION_LEFT]); assertNull(mScreenDecorations.mOverlays[BOUNDS_POSITION_RIGHT]); // One tunable. verify(mTunerService, times(1)).addTunable(any(), any()); } @Test public void testRoundingRadius_NoCutout() { final int testRadius = 1; mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, testRadius); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_top, testRadius); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius_bottom, testRadius); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); mScreenDecorations.start(); // Size of corner view should same as rounded_corner_radius{_top|_bottom} assertThat(mScreenDecorations.mRoundedDefault).isEqualTo(testRadius); assertThat(mScreenDecorations.mRoundedDefaultTop).isEqualTo(testRadius); assertThat(mScreenDecorations.mRoundedDefaultBottom).isEqualTo(testRadius); } @Test public void testRoundingMultipleRadius_NoCutout() { final VectorDrawable d = (VectorDrawable) mContext.getDrawable(R.drawable.rounded); final int multipleRadiusSize = Math.max(d.getIntrinsicWidth(), d.getIntrinsicHeight()); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, 9999); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 9999); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, true); // no cutout doReturn(null).when(mScreenDecorations).getCutout(); mScreenDecorations.start(); // Top and bottom windows are created for rounded corners. verify(mWindowManager, times(1)) .addView(eq(mScreenDecorations.mOverlays[BOUNDS_POSITION_TOP]), any()); Loading @@ -179,6 +242,11 @@ public class ScreenDecorationsTest extends SysuiTestCase { // One tunable. verify(mTunerService, times(1)).addTunable(any(), any()); // Size of corner view should exactly match max(width, height) of R.drawable.rounded assertThat(mScreenDecorations.mRoundedDefault).isEqualTo(multipleRadiusSize); assertThat(mScreenDecorations.mRoundedDefaultTop).isEqualTo(multipleRadiusSize); assertThat(mScreenDecorations.mRoundedDefaultBottom).isEqualTo(multipleRadiusSize); } @Test Loading @@ -193,6 +261,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // top cutout doReturn(new DisplayCutout( Loading Loading @@ -227,6 +297,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // left cutout doReturn(new DisplayCutout( Loading Loading @@ -257,6 +329,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // top cutout doReturn(new DisplayCutout( Loading Loading @@ -288,6 +362,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // left cutout doReturn(new DisplayCutout( Loading Loading @@ -319,6 +395,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // top and left cutout doReturn(new DisplayCutout( Loading Loading @@ -355,6 +433,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // Set to short edge cutout(top). doReturn(new DisplayCutout( Loading Loading @@ -402,6 +482,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.dimen.rounded_corner_radius_bottom, 0); mContext.getOrCreateTestableResources() .addOverride(dimen.rounded_corner_content_padding, 0); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); // top cutout doReturn(new DisplayCutout( Loading Loading @@ -440,6 +522,8 @@ public class ScreenDecorationsTest extends SysuiTestCase { com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, false); mContext.getOrCreateTestableResources().addOverride( com.android.internal.R.dimen.rounded_corner_radius, 20); mContext.getOrCreateTestableResources() .addOverride(R.bool.config_roundedCornerMultipleRadius, false); mScreenDecorations.start(); assertEquals(mScreenDecorations.mRoundedDefault, 20); Loading