Merge "Phase out config_roundedCornerMultipleRadius" into tm-dev am: 76fa901bb9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17739085

Change-Id: I072641fb8e5347120d136b2bbc729f9b88c5371a
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2022-04-19 03:27:36 +00:00
committed by Automerger Merge Worker
11 changed files with 401 additions and 370 deletions

View File

@@ -60,6 +60,8 @@ class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDec
private val debugTransparentRegionPaint: Paint?
private val tempRect: Rect = Rect()
private var hasTopRoundedCorner = false
private var hasBottomRoundedCorner = false
private var roundedCornerTopSize = 0
private var roundedCornerBottomSize = 0
private var roundedCornerDrawableTop: Drawable? = null
@@ -300,7 +302,7 @@ class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDec
}
private fun drawRoundedCorners(canvas: Canvas) {
if (roundedCornerTopSize == 0 && roundedCornerBottomSize == 0) {
if (!hasTopRoundedCorner && !hasBottomRoundedCorner) {
return
}
var degree: Int
@@ -312,9 +314,11 @@ class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDec
canvas.translate(
getRoundedCornerTranslationX(degree).toFloat(),
getRoundedCornerTranslationY(degree).toFloat())
if (i == RoundedCorner.POSITION_TOP_LEFT || i == RoundedCorner.POSITION_TOP_RIGHT) {
if (hasTopRoundedCorner && (i == RoundedCorner.POSITION_TOP_LEFT ||
i == RoundedCorner.POSITION_TOP_RIGHT)) {
drawRoundedCorner(canvas, roundedCornerDrawableTop, roundedCornerTopSize)
} else {
} else if (hasBottomRoundedCorner && (i == RoundedCorner.POSITION_BOTTOM_LEFT ||
i == RoundedCorner.POSITION_BOTTOM_RIGHT)) {
drawRoundedCorner(canvas, roundedCornerDrawableBottom, roundedCornerBottomSize)
}
canvas.restore()
@@ -366,14 +370,24 @@ class ScreenDecorHwcLayer(context: Context, displayDecorationSupport: DisplayDec
}
/**
* Update the rounded corner size.
* Update the rounded corner existence and size.
*/
fun updateRoundedCornerSize(top: Int, bottom: Int) {
if (roundedCornerTopSize == top && roundedCornerBottomSize == bottom) {
fun updateRoundedCornerExistenceAndSize(
hasTop: Boolean,
hasBottom: Boolean,
topSize: Int,
bottomSize: Int
) {
if (hasTopRoundedCorner == hasTop &&
hasBottomRoundedCorner == hasBottom &&
roundedCornerBottomSize == bottomSize &&
roundedCornerBottomSize == bottomSize) {
return
}
roundedCornerTopSize = top
roundedCornerBottomSize = bottom
hasTopRoundedCorner = hasTop
hasBottomRoundedCorner = hasBottom
roundedCornerTopSize = topSize
roundedCornerBottomSize = bottomSize
updateRoundedCornerDrawableBounds()
// Use requestLayout() to trigger transparent region recalculated

View File

@@ -132,9 +132,6 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
private final ThreadFactory mThreadFactory;
private final DecorProviderFactory mDotFactory;
//TODO: These are piecemeal being updated to Points for now to support non-square rounded
// corners. for now it is only supposed when reading the intrinsic size from the drawables with
// mIsRoundedCornerMultipleRadius is set
@VisibleForTesting
protected RoundedCornerResDelegate mRoundedCornerResDelegate;
@VisibleForTesting
@@ -406,7 +403,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
if (mScreenDecorHwcLayer != null) {
updateHwLayerRoundedCornerDrawable();
updateHwLayerRoundedCornerSize();
updateHwLayerRoundedCornerExistAndSize();
}
updateOverlayProviderViews();
@@ -699,7 +696,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
mScreenDecorHwcWindow.addView(mScreenDecorHwcLayer, new FrameLayout.LayoutParams(
MATCH_PARENT, MATCH_PARENT, Gravity.TOP | Gravity.START));
mWindowManager.addView(mScreenDecorHwcWindow, getHwcWindowLayoutParams());
updateHwLayerRoundedCornerSize();
updateHwLayerRoundedCornerExistAndSize();
updateHwLayerRoundedCornerDrawable();
mScreenDecorHwcWindow.getViewTreeObserver().addOnPreDrawListener(
new ValidatingPreDrawListener(mScreenDecorHwcWindow));
@@ -961,7 +958,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
if (mScreenDecorHwcLayer != null) {
mScreenDecorHwcLayer.pendingRotationChange = false;
mScreenDecorHwcLayer.updateRotation(mRotation);
updateHwLayerRoundedCornerSize();
updateHwLayerRoundedCornerExistAndSize();
updateHwLayerRoundedCornerDrawable();
}
updateLayoutParams();
@@ -1090,7 +1087,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
overlay.onReloadResAndMeasure(filterIds, mProviderRefreshToken, mRotation,
mDisplayUniqueId);
}
updateHwLayerRoundedCornerSize();
updateHwLayerRoundedCornerExistAndSize();
});
}
@@ -1108,15 +1105,15 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
mScreenDecorHwcLayer.updateRoundedCornerDrawable(topDrawable, bottomDrawable);
}
private void updateHwLayerRoundedCornerSize() {
private void updateHwLayerRoundedCornerExistAndSize() {
if (mScreenDecorHwcLayer == null) {
return;
}
final int topWidth = mRoundedCornerResDelegate.getTopRoundedSize().getWidth();
final int bottomWidth = mRoundedCornerResDelegate.getBottomRoundedSize().getWidth();
mScreenDecorHwcLayer.updateRoundedCornerSize(topWidth, bottomWidth);
mScreenDecorHwcLayer.updateRoundedCornerExistenceAndSize(
mRoundedCornerResDelegate.getHasTop(),
mRoundedCornerResDelegate.getHasBottom(),
mRoundedCornerResDelegate.getTopRoundedSize().getWidth(),
mRoundedCornerResDelegate.getBottomRoundedSize().getWidth());
}
@VisibleForTesting

View File

@@ -25,8 +25,7 @@ class RoundedCornerDecorProviderFactory(
override val hasProviders: Boolean
get() = roundedCornerResDelegate.run {
// We don't consider isMultipleRadius here because it makes no sense if size is zero.
topRoundedSize.width > 0 || bottomRoundedSize.width > 0
hasTop || hasBottom
}
override fun onDisplayUniqueIdChanged(displayUniqueId: String?) {
@@ -35,8 +34,8 @@ class RoundedCornerDecorProviderFactory(
override val providers: List<DecorProvider>
get() {
val hasTop = roundedCornerResDelegate.topRoundedSize.width > 0
val hasBottom = roundedCornerResDelegate.bottomRoundedSize.width > 0
val hasTop = roundedCornerResDelegate.hasTop
val hasBottom = roundedCornerResDelegate.hasBottom
return when {
hasTop && hasBottom -> listOf(
RoundedCornerDecorProviderImpl(

View File

@@ -37,10 +37,11 @@ class RoundedCornerResDelegate(
private var reloadToken: Int = 0
var isMultipleRadius: Boolean = false
var hasTop: Boolean = false
private set
private var roundedDrawable: Drawable? = null
var hasBottom: Boolean = false
private set
var topRoundedDrawable: Drawable? = null
private set
@@ -48,8 +49,6 @@ class RoundedCornerResDelegate(
var bottomRoundedDrawable: Drawable? = null
private set
private var roundedSize = Size(0, 0)
var topRoundedSize = Size(0, 0)
private set
@@ -83,52 +82,31 @@ class RoundedCornerResDelegate(
private fun reloadRes() {
val configIdx = DisplayUtils.getDisplayUniqueIdConfigIndex(res, displayUniqueId)
isMultipleRadius = getIsMultipleRadius(configIdx)
roundedDrawable = getDrawable(
displayConfigIndex = configIdx,
arrayResId = R.array.config_roundedCornerDrawableArray,
backupDrawableId = R.drawable.rounded
)
val hasDefaultRadius = RoundedCorners.getRoundedCornerRadius(res, displayUniqueId) > 0
hasTop = hasDefaultRadius ||
(RoundedCorners.getRoundedCornerTopRadius(res, displayUniqueId) > 0)
hasBottom = hasDefaultRadius ||
(RoundedCorners.getRoundedCornerBottomRadius(res, displayUniqueId) > 0)
topRoundedDrawable = getDrawable(
displayConfigIndex = configIdx,
arrayResId = R.array.config_roundedCornerTopDrawableArray,
backupDrawableId = R.drawable.rounded_corner_top
) ?: roundedDrawable
)
bottomRoundedDrawable = getDrawable(
displayConfigIndex = configIdx,
arrayResId = R.array.config_roundedCornerBottomDrawableArray,
backupDrawableId = R.drawable.rounded_corner_bottom
) ?: roundedDrawable
)
}
private fun reloadMeasures(roundedSizeFactor: Int? = null) {
// If config_roundedCornerMultipleRadius set as true, ScreenDecorations respect the
// (width, height) size of drawable/rounded.xml instead of rounded_corner_radius
if (isMultipleRadius) {
roundedSize = Size(
roundedDrawable?.intrinsicWidth ?: 0,
roundedDrawable?.intrinsicHeight ?: 0)
topRoundedDrawable?.let {
topRoundedSize = Size(it.intrinsicWidth, it.intrinsicHeight)
}
bottomRoundedDrawable?.let {
bottomRoundedSize = Size(it.intrinsicWidth, it.intrinsicHeight)
}
} else {
val defaultRadius = RoundedCorners.getRoundedCornerRadius(res, displayUniqueId)
val topRadius = RoundedCorners.getRoundedCornerTopRadius(res, displayUniqueId)
val bottomRadius = RoundedCorners.getRoundedCornerBottomRadius(res, displayUniqueId)
roundedSize = Size(defaultRadius, defaultRadius)
topRoundedSize = Size(topRadius, topRadius)
bottomRoundedSize = Size(bottomRadius, bottomRadius)
topRoundedDrawable?.let {
topRoundedSize = Size(it.intrinsicWidth, it.intrinsicHeight)
}
if (topRoundedSize.width == 0) {
topRoundedSize = roundedSize
}
if (bottomRoundedSize.width == 0) {
bottomRoundedSize = roundedSize
bottomRoundedDrawable?.let {
bottomRoundedSize = Size(it.intrinsicWidth, it.intrinsicHeight)
}
if (roundedSizeFactor != null && roundedSizeFactor > 0) {
@@ -146,25 +124,6 @@ class RoundedCornerResDelegate(
reloadMeasures(factor)
}
/**
* Gets whether the rounded corners are multiple radii for current display.
*
* Loads the default config {@link R.bool#config_roundedCornerMultipleRadius} if
* {@link com.android.internal.R.array#config_displayUniqueIdArray} is not set.
*/
private fun getIsMultipleRadius(displayConfigIndex: Int): Boolean {
val isMultipleRadius: Boolean
res.obtainTypedArray(R.array.config_roundedCornerMultipleRadiusArray).let { array ->
isMultipleRadius = if (displayConfigIndex >= 0 && displayConfigIndex < array.length()) {
array.getBoolean(displayConfigIndex, false)
} else {
res.getBoolean(R.bool.config_roundedCornerMultipleRadius)
}
array.recycle()
}
return isMultipleRadius
}
private fun getDrawable(
displayConfigIndex: Int,
@ArrayRes arrayResId: Int,
@@ -184,8 +143,8 @@ class RoundedCornerResDelegate(
override fun dump(pw: PrintWriter, args: Array<out String>) {
pw.println("RoundedCornerResDelegate state:")
pw.println(" isMultipleRadius:$isMultipleRadius")
pw.println(" roundedSize(w,h)=(${roundedSize.width},${roundedSize.height})")
pw.println(" hasTop=$hasTop")
pw.println(" hasBottom=$hasBottom")
pw.println(" topRoundedSize(w,h)=(${topRoundedSize.width},${topRoundedSize.height})")
pw.println(" bottomRoundedSize(w,h)=(${bottomRoundedSize.width}," +
"${bottomRoundedSize.height})")

View File

@@ -0,0 +1,24 @@
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="3px"
android:height="3px"
android:viewportWidth="3"
android:viewportHeight="3">
<path
android:fillColor="#000000"
android:pathData="M8,0H0v8C0,3.6,3.6,0,8,0z" />
</vector>

View File

@@ -0,0 +1,24 @@
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="4px"
android:height="4px"
android:viewportWidth="4"
android:viewportHeight="4">
<path
android:fillColor="#000000"
android:pathData="M8,0H0v8C0,3.6,3.6,0,8,0z" />
</vector>

View File

@@ -0,0 +1,24 @@
<!--
~ Copyright (C) 2022 The Android Open Source Project
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="5px"
android:height="5px"
android:viewportWidth="5"
android:viewportHeight="5">
<path
android:fillColor="#000000"
android:pathData="M8,0H0v8C0,3.6,3.6,0,8,0z" />
</vector>

View File

@@ -85,37 +85,37 @@ class ScreenDecorHwcLayerTest : SysuiTestCase() {
@Test
fun testTransparentRegion_noCutout_noRoundedCorner_noProtection() {
setupConfigs(null, 0, 0, RectF(), 0f)
setupConfigs(null, false, false, 0, 0, RectF(), 0f)
decorHwcLayer.calculateTransparentRect()
assertThat(decorHwcLayer.transparentRect)
.isEqualTo(Rect(0, 0, decorHwcLayer.width, decorHwcLayer.height))
.isEqualTo(Rect(0, 0, decorHwcLayer.width, decorHwcLayer.height))
}
@Test
fun testTransparentRegion_onlyShortEdgeCutout() {
setupConfigs(cutoutTop, 0, 0, RectF(), 0f)
setupConfigs(cutoutTop, false, false, 0, 0, RectF(), 0f)
decorHwcLayer.calculateTransparentRect()
assertThat(decorHwcLayer.transparentRect)
.isEqualTo(Rect(0, cutoutSize, decorHwcLayer.width, decorHwcLayer.height))
.isEqualTo(Rect(0, cutoutSize, decorHwcLayer.width, decorHwcLayer.height))
}
@Test
fun testTransparentRegion_onlyLongEdgeCutout() {
setupConfigs(cutoutRight, 0, 0, RectF(), 0f)
setupConfigs(cutoutRight, false, false, 0, 0, RectF(), 0f)
decorHwcLayer.calculateTransparentRect()
assertThat(decorHwcLayer.transparentRect)
.isEqualTo(Rect(0, 0, decorHwcLayer.width - cutoutSize, decorHwcLayer.height))
.isEqualTo(Rect(0, 0, decorHwcLayer.width - cutoutSize, decorHwcLayer.height))
}
@Test
fun testTransparentRegion_onlyRoundedCorners() {
setupConfigs(null, roundedSizeTop, roundedSizeBottom, RectF(), 0f)
setupConfigs(null, true, true, roundedSizeTop, roundedSizeBottom, RectF(), 0f)
decorHwcLayer.calculateTransparentRect()
@@ -126,7 +126,7 @@ class ScreenDecorHwcLayerTest : SysuiTestCase() {
@Test
fun testTransparentRegion_onlyCutoutProtection() {
setupConfigs(null, 0, 0, RectF(48f, 1f, 52f, 5f), 0.5f)
setupConfigs(null, false, false, 0, 0, RectF(48f, 1f, 52f, 5f), 0.5f)
decorHwcLayer.calculateTransparentRect()
@@ -143,7 +143,8 @@ class ScreenDecorHwcLayerTest : SysuiTestCase() {
@Test
fun testTransparentRegion_hasShortEdgeCutout_hasRoundedCorner_hasCutoutProtection() {
setupConfigs(cutoutTop, roundedSizeTop, roundedSizeBottom, RectF(48f, 1f, 52f, 5f), 1f)
setupConfigs(cutoutTop, true, true, roundedSizeTop, roundedSizeBottom,
RectF(48f, 1f, 52f, 5f), 1f)
decorHwcLayer.calculateTransparentRect()
@@ -153,7 +154,8 @@ class ScreenDecorHwcLayerTest : SysuiTestCase() {
@Test
fun testTransparentRegion_hasLongEdgeCutout_hasRoundedCorner_hasCutoutProtection() {
setupConfigs(cutoutRight, roundedSizeTop, roundedSizeBottom, RectF(48f, 1f, 52f, 5f), 1f)
setupConfigs(cutoutRight, true, true, roundedSizeTop, roundedSizeBottom,
RectF(48f, 1f, 52f, 5f), 1f)
decorHwcLayer.calculateTransparentRect()
@@ -163,6 +165,8 @@ class ScreenDecorHwcLayerTest : SysuiTestCase() {
private fun setupConfigs(
cutout: DisplayCutout?,
hasRoundedTop: Boolean,
hasRoundedBottom: Boolean,
roundedTop: Int,
roundedBottom: Int,
protectionRect: RectF,
@@ -174,7 +178,8 @@ class ScreenDecorHwcLayerTest : SysuiTestCase() {
info.displayCutout = cutout
return@then true
}
decorHwcLayer.updateRoundedCornerSize(roundedTop, roundedBottom)
decorHwcLayer.updateRoundedCornerExistenceAndSize(hasRoundedTop, hasRoundedBottom,
roundedTop, roundedBottom)
decorHwcLayer.protectionRect.set(protectionRect)
decorHwcLayer.cameraProtectionProgress = protectionProgress
decorHwcLayer.updateCutout()

View File

@@ -46,12 +46,13 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.annotation.IdRes;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.Insets;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.VectorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManager;
import android.hardware.graphics.common.DisplayDecorationSupport;
import android.os.Handler;
@@ -67,6 +68,7 @@ import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowMetrics;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.test.filters.SmallTest;
@@ -74,6 +76,7 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.decor.CornerDecorProvider;
import com.android.systemui.decor.DecorProvider;
import com.android.systemui.decor.DecorProviderFactory;
import com.android.systemui.decor.OverlayWindow;
import com.android.systemui.decor.PrivacyDotCornerDecorProviderImpl;
import com.android.systemui.decor.PrivacyDotDecorProviderFactory;
@@ -94,6 +97,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.List;
@RunWithLooper
@RunWith(AndroidTestingRunner.class)
@@ -384,8 +388,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testNoRounding_NoCutout_NoPrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
@@ -402,8 +406,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testNoRounding_NoCutout_PrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
@@ -434,8 +438,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRounding_NoCutout_NoPrivacyDot() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
20 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
20 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
@@ -462,8 +466,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRounding_NoCutout_PrivacyDot() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
20 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
20 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
@@ -492,10 +496,13 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRoundingRadius_NoCutout() {
final Size testRadiusPoint = new Size(1, 1);
final Size testRadiusPoint = new Size(3, 3);
setupResources(1 /* radius */, 1 /* radiusTop */, 1 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded3px)
/* roundedTopDrawable */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded3px)
/* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
@@ -508,10 +515,12 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRoundingTopBottomRadius_OnTopBottomOverlay() {
final int testTopRadius = 1;
final int testBottomRadius = 5;
setupResources(testTopRadius, testTopRadius, testBottomRadius, 0 /* roundedPadding */,
false /* multipleRadius */, false /* fillCutout */, true /* privacyDot */);
setupResources(1 /* radius */, 1 /* radiusTop */, 1 /* radiusBottom */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded4px)
/* roundedTopDrawable */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded3px)
/* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
@@ -523,10 +532,10 @@ public class ScreenDecorationsTest extends SysuiTestCase {
.findViewById(R.id.rounded_corner_top_right);
ViewGroup.LayoutParams leftParams = leftRoundedCorner.getLayoutParams();
ViewGroup.LayoutParams rightParams = rightRoundedCorner.getLayoutParams();
assertEquals(leftParams.width, testTopRadius);
assertEquals(leftParams.height, testTopRadius);
assertEquals(rightParams.width, testTopRadius);
assertEquals(rightParams.height, testTopRadius);
assertEquals(4, leftParams.width);
assertEquals(4, leftParams.height);
assertEquals(4, rightParams.width);
assertEquals(4, rightParams.height);
leftRoundedCorner = mScreenDecorations.mOverlays[BOUNDS_POSITION_BOTTOM].getRootView()
.findViewById(R.id.rounded_corner_bottom_left);
@@ -534,18 +543,20 @@ public class ScreenDecorationsTest extends SysuiTestCase {
.findViewById(R.id.rounded_corner_bottom_right);
leftParams = leftRoundedCorner.getLayoutParams();
rightParams = rightRoundedCorner.getLayoutParams();
assertEquals(leftParams.width, testBottomRadius);
assertEquals(leftParams.height, testBottomRadius);
assertEquals(rightParams.width, testBottomRadius);
assertEquals(rightParams.height, testBottomRadius);
assertEquals(3, leftParams.width);
assertEquals(3, leftParams.height);
assertEquals(3, rightParams.width);
assertEquals(3, rightParams.height);
}
@Test
public void testRoundingTopBottomRadius_OnLeftRightOverlay() {
final int testTopRadius = 1;
final int testBottomRadius = 5;
setupResources(testTopRadius, testTopRadius, testBottomRadius, 0 /* roundedPadding */,
false /* multipleRadius */, false /* fillCutout */, true /* privacyDot */);
setupResources(1 /* radius */, 1 /* radiusTop */, 1 /* radiusBottom */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded3px)
/* roundedTopDrawable */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded5px)
/* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
// left cutout
final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null};
@@ -559,10 +570,10 @@ public class ScreenDecorationsTest extends SysuiTestCase {
.findViewById(R.id.rounded_corner_bottom_left);
ViewGroup.LayoutParams topParams = topRoundedCorner.getLayoutParams();
ViewGroup.LayoutParams bottomParams = bottomRoundedCorner.getLayoutParams();
assertEquals(topParams.width, testTopRadius);
assertEquals(topParams.height, testTopRadius);
assertEquals(bottomParams.width, testBottomRadius);
assertEquals(bottomParams.height, testBottomRadius);
assertEquals(3, topParams.width);
assertEquals(3, topParams.height);
assertEquals(5, bottomParams.width);
assertEquals(5, bottomParams.height);
topRoundedCorner = mScreenDecorations.mOverlays[BOUNDS_POSITION_RIGHT].getRootView()
.findViewById(R.id.rounded_corner_top_right);
@@ -570,88 +581,17 @@ public class ScreenDecorationsTest extends SysuiTestCase {
.findViewById(R.id.rounded_corner_bottom_right);
topParams = topRoundedCorner.getLayoutParams();
bottomParams = bottomRoundedCorner.getLayoutParams();
assertEquals(topParams.width, testTopRadius);
assertEquals(topParams.height, testTopRadius);
assertEquals(bottomParams.width, testBottomRadius);
assertEquals(bottomParams.height, testBottomRadius);
}
@Test
public void testRoundingMultipleRadius_NoCutout_NoPrivacyDot() {
final VectorDrawable d = (VectorDrawable) mContext.getDrawable(R.drawable.rounded);
final Size multipleRadiusSize = new Size(d.getIntrinsicWidth(), d.getIntrinsicHeight());
setupResources(9999 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
9999 /* roundedPadding */, true /* multipleRadius */,
false /* fillCutout */, false /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
mScreenDecorations.start();
// Top and bottom windows are created for rounded corners.
// Left and right window should be null.
verifyOverlaysExistAndAdded(false, true, false, true, View.VISIBLE);
// Rounded corner views shall exist
verifyRoundedCornerViewsExist(BOUNDS_POSITION_TOP, true);
verifyRoundedCornerViewsExist(BOUNDS_POSITION_BOTTOM, true);
// Privacy dots shall not exist
verifyDotViewsNullable(true);
// One tunable.
verify(mTunerService, times(1)).addTunable(any(), any());
// No dot controller init
verify(mDotViewController, never()).initialize(any(), any(), any(), any());
// Size of corner view should exactly match max(width, height) of R.drawable.rounded
final RoundedCornerResDelegate resDelegate = mScreenDecorations.mRoundedCornerResDelegate;
assertThat(resDelegate.getTopRoundedSize()).isEqualTo(multipleRadiusSize);
assertThat(resDelegate.getBottomRoundedSize()).isEqualTo(multipleRadiusSize);
}
@Test
public void testRoundingMultipleRadius_NoCutout_PrivacyDot() {
final VectorDrawable d = (VectorDrawable) mContext.getDrawable(R.drawable.rounded);
final Size multipleRadiusSize = new Size(d.getIntrinsicWidth(), d.getIntrinsicHeight());
setupResources(9999 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
9999 /* roundedPadding */, true /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
mScreenDecorations.start();
// Top and bottom windows are created for rounded corners.
// Left and right window should be null.
verifyOverlaysExistAndAdded(false, true, false, true, View.VISIBLE);
verify(mDotViewController, times(1)).initialize(any(), any(), any(), any());
verify(mDotViewController, times(1)).setShowingListener(null);
// Rounded corner views shall exist
verifyRoundedCornerViewsExist(BOUNDS_POSITION_TOP, true);
verifyRoundedCornerViewsExist(BOUNDS_POSITION_BOTTOM, true);
// Privacy dots shall exist but invisible
verifyDotViewsVisibility(View.INVISIBLE);
// One tunable.
verify(mTunerService, times(1)).addTunable(any(), any());
// Dot controller init
verify(mDotViewController, times(1)).initialize(
isA(View.class), isA(View.class), isA(View.class), isA(View.class));
// Size of corner view should exactly match max(width, height) of R.drawable.rounded
final RoundedCornerResDelegate resDelegate = mScreenDecorations.mRoundedCornerResDelegate;
assertThat(resDelegate.getTopRoundedSize()).isEqualTo(multipleRadiusSize);
assertThat(resDelegate.getBottomRoundedSize()).isEqualTo(multipleRadiusSize);
assertEquals(3, topParams.width);
assertEquals(3, topParams.height);
assertEquals(5, bottomParams.width);
assertEquals(5, bottomParams.height);
}
@Test
public void testNoRounding_CutoutShortEdge_NoPrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
// top cutout
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -673,8 +613,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testNoRounding_CutoutShortEdge_PrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
// top cutout
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -707,8 +647,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testNoRounding_CutoutLongEdge_NoPrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
// left cutout
final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null};
@@ -734,8 +674,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testNoRounding_CutoutLongEdge_PrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
// left cutout
final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null};
@@ -761,8 +701,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRounding_CutoutShortEdge_NoPrivacyDot() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
20 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
// top cutout
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -789,8 +729,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRounding_CutoutShortEdge_PrivacyDot() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
20 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
// top cutout
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -820,8 +760,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRounding_CutoutLongEdge_NoPrivacyDot() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
20 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
// left cutout
final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null};
@@ -838,8 +778,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRounding_CutoutLongEdge_PrivacyDot() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
20 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
// left cutout
final Rect[] bounds = {new Rect(0, 50, 1, 60), null, null, null};
@@ -858,8 +798,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRounding_CutoutShortAndLongEdge_NoPrivacyDot() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
20 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
20 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
// top and left cutout
final Rect[] bounds = {new Rect(0, 50, 1, 60), new Rect(9, 0, 10, 1), null, null};
@@ -877,8 +817,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testRounding_CutoutShortAndLongEdge_PrivacyDot() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
20 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
20 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
// top and left cutout
final Rect[] bounds = {new Rect(0, 50, 1, 60), new Rect(9, 0, 10, 1), null, null};
@@ -898,8 +838,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testNoRounding_SwitchFrom_ShortEdgeCutout_To_LongCutout_NoPrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
// Set to short edge cutout(top).
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -921,8 +861,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testNoRounding_SwitchFrom_ShortEdgeCutout_To_LongCutout_PrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
// Set to short edge cutout(top).
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -964,8 +904,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testDelayedCutout_NoPrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */);
// top cutout
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -987,8 +927,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testDelayedCutout_PrivacyDot() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
// top cutout
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -1029,43 +969,71 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testUpdateRoundedCorners() {
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded3px)
/* roundedTopDrawable */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded4px)
/* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
mScreenDecorations.start();
final RoundedCornerResDelegate resDelegate = mScreenDecorations.mRoundedCornerResDelegate;
assertEquals(resDelegate.getTopRoundedSize(), new Size(20, 20));
assertEquals(resDelegate.getBottomRoundedSize(), new Size(20, 20));
when(mContext.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.rounded_corner_radius)).thenReturn(5);
final RoundedCornerResDelegate resDelegate = mScreenDecorations.mRoundedCornerResDelegate;
assertEquals(new Size(3, 3), resDelegate.getTopRoundedSize());
assertEquals(new Size(4, 4), resDelegate.getBottomRoundedSize());
setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded4px)
/* roundedTopDrawable */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded5px)
/* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
mScreenDecorations.onConfigurationChanged(null);
assertEquals(resDelegate.getTopRoundedSize(), new Size(5, 5));
assertEquals(resDelegate.getBottomRoundedSize(), new Size(5, 5));
assertEquals(new Size(4, 4), resDelegate.getTopRoundedSize());
assertEquals(new Size(5, 5), resDelegate.getBottomRoundedSize());
}
@Test
public void testOnlyRoundedCornerRadiusTop() {
setupResources(0 /* radius */, 10 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
mScreenDecorations.start();
final RoundedCornerResDelegate resDelegate = mScreenDecorations.mRoundedCornerResDelegate;
assertEquals(new Size(10, 10), resDelegate.getTopRoundedSize());
assertEquals(new Size(0, 0), resDelegate.getBottomRoundedSize());
}
assertEquals(true, resDelegate.getHasTop());
assertEquals(false, resDelegate.getHasBottom());
assertEquals(getDrawableIntrinsicSize(R.drawable.rounded_corner_top),
resDelegate.getTopRoundedSize());
final DecorProviderFactory mRoundedCornerFactory = mScreenDecorations.mRoundedCornerFactory;
assertEquals(true, mRoundedCornerFactory.getHasProviders());
final List<DecorProvider> providers = mRoundedCornerFactory.getProviders();
assertEquals(2, providers.size());
assertEquals(true, providers.get(0).getAlignedBounds().contains(BOUNDS_POSITION_TOP));
assertEquals(true, providers.get(1).getAlignedBounds().contains(BOUNDS_POSITION_TOP)); }
@Test
public void testOnlyRoundedCornerRadiusBottom() {
setupResources(0 /* radius */, 0 /* radiusTop */, 20 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
mScreenDecorations.start();
final RoundedCornerResDelegate resDelegate = mScreenDecorations.mRoundedCornerResDelegate;
assertEquals(new Size(0, 0), resDelegate.getTopRoundedSize());
assertEquals(new Size(20, 20), resDelegate.getBottomRoundedSize());
assertEquals(false, resDelegate.getHasTop());
assertEquals(true, resDelegate.getHasBottom());
assertEquals(getDrawableIntrinsicSize(R.drawable.rounded_corner_bottom),
resDelegate.getBottomRoundedSize());
final DecorProviderFactory mRoundedCornerFactory = mScreenDecorations.mRoundedCornerFactory;
assertEquals(true, mRoundedCornerFactory.getHasProviders());
final List<DecorProvider> providers = mRoundedCornerFactory.getProviders();
assertEquals(2, providers.size());
assertEquals(true, providers.get(0).getAlignedBounds().contains(BOUNDS_POSITION_BOTTOM));
assertEquals(true, providers.get(1).getAlignedBounds().contains(BOUNDS_POSITION_BOTTOM));
}
@Test
@@ -1120,8 +1088,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testSupportHwcLayer_SwitchFrom_NotSupport() {
setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
// top cutout
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -1148,8 +1116,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testNotSupportHwcLayer_SwitchFrom_Support() {
setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();
decorationSupport.format = PixelFormat.R_8;
doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport();
@@ -1183,8 +1151,11 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testAutoShowHideOverlayWindowWhenSupportHwcLayer() {
setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded3px)
/* roundedTopDrawable */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded4px)
/* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();
decorationSupport.format = PixelFormat.R_8;
doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport();
@@ -1212,8 +1183,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testAutoShowHideOverlayWindowWhenNoRoundedAndNoCutout() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, true /* privacyDot */);
// no cutout
doReturn(null).when(mScreenDecorations).getCutout();
@@ -1236,8 +1207,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testHwcLayer_noPrivacyDot() {
setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();
decorationSupport.format = PixelFormat.R_8;
doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport();
@@ -1257,8 +1228,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testHwcLayer_PrivacyDot() {
setupResources(0 /* radius */, 10 /* radiusTop */, 20 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();
decorationSupport.format = PixelFormat.R_8;
doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport();
@@ -1281,8 +1252,8 @@ 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 */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();
decorationSupport.format = PixelFormat.R_8;
doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport();
@@ -1307,8 +1278,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testOnDisplayChanged_nonHwcLayer() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, false /* privacyDot */);
// top cutout
final Rect[] bounds = {null, new Rect(9, 0, 10, 1), null, null};
@@ -1331,8 +1302,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testHasSameProvidersWithNullOverlays() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
false /* fillCutout */, false /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* fillCutout */, false /* privacyDot */);
mScreenDecorations.start();
@@ -1349,8 +1320,8 @@ public class ScreenDecorationsTest extends SysuiTestCase {
@Test
public void testHasSameProvidersWithPrivacyDots() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
0 /* roundedPadding */, false /* multipleRadius */,
true /* fillCutout */, true /* privacyDot */);
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, true /* fillCutout */, true /* privacyDot */);
mScreenDecorations.start();
@@ -1370,8 +1341,24 @@ public class ScreenDecorationsTest extends SysuiTestCase {
assertTrue(mScreenDecorations.hasSameProviders(newProviders));
}
private void setupResources(int radius, int radiusTop, int radiusBottom, int roundedPadding,
boolean multipleRadius, boolean fillCutout, boolean privacyDot) {
private Size getDrawableIntrinsicSize(@DrawableRes int drawableResId) {
final Drawable d = mContext.getDrawable(drawableResId);
return new Size(d.getIntrinsicWidth(), d.getIntrinsicHeight());
}
@Nullable
private Drawable getTestsDrawable(@DrawableRes int drawableId) {
try {
return mContext.createPackageContext("com.android.systemui.tests", 0)
.getDrawable(drawableId);
} catch (PackageManager.NameNotFoundException exception) {
return null;
}
}
private void setupResources(int radius, int radiusTop, int radiusBottom,
@Nullable Drawable roundedTopDrawable, @Nullable Drawable roundedBottomDrawable,
int roundedPadding, boolean fillCutout, boolean privacyDot) {
mContext.getOrCreateTestableResources().addOverride(
com.android.internal.R.array.config_displayUniqueIdArray,
new String[]{});
@@ -1393,19 +1380,24 @@ public class ScreenDecorationsTest extends SysuiTestCase {
mContext.getOrCreateTestableResources().addOverride(
R.array.config_roundedCornerBottomDrawableArray,
mMockTypedArray);
mContext.getOrCreateTestableResources().addOverride(
R.array.config_roundedCornerMultipleRadiusArray,
mMockTypedArray);
mContext.getOrCreateTestableResources().addOverride(
com.android.internal.R.dimen.rounded_corner_radius, radius);
mContext.getOrCreateTestableResources().addOverride(
com.android.internal.R.dimen.rounded_corner_radius_top, radiusTop);
mContext.getOrCreateTestableResources().addOverride(
com.android.internal.R.dimen.rounded_corner_radius_bottom, radiusBottom);
if (roundedTopDrawable != null) {
mContext.getOrCreateTestableResources().addOverride(
R.drawable.rounded_corner_top,
roundedTopDrawable);
}
if (roundedBottomDrawable != null) {
mContext.getOrCreateTestableResources().addOverride(
R.drawable.rounded_corner_bottom,
roundedBottomDrawable);
}
mContext.getOrCreateTestableResources().addOverride(
R.dimen.rounded_corner_content_padding, roundedPadding);
mContext.getOrCreateTestableResources().addOverride(
R.bool.config_roundedCornerMultipleRadius, multipleRadius);
mContext.getOrCreateTestableResources().addOverride(
com.android.internal.R.bool.config_fillMainBuiltInDisplayCutout, fillCutout);

View File

@@ -44,9 +44,8 @@ class RoundedCornerDecorProviderFactoryTest : SysuiTestCase() {
@Test
fun testNoRoundedCorners() {
Mockito.doReturn(Size(0, 0)).`when`(roundedCornerResDelegate).topRoundedSize
Mockito.doReturn(Size(0, 0)).`when`(roundedCornerResDelegate).bottomRoundedSize
Mockito.doReturn(false).`when`(roundedCornerResDelegate).isMultipleRadius
Mockito.doReturn(false).`when`(roundedCornerResDelegate).hasTop
Mockito.doReturn(false).`when`(roundedCornerResDelegate).hasBottom
roundedCornerDecorProviderFactory =
RoundedCornerDecorProviderFactory(roundedCornerResDelegate)
@@ -56,10 +55,10 @@ class RoundedCornerDecorProviderFactoryTest : SysuiTestCase() {
}
@Test
fun testHasRoundedCornersIfTopWidthLargerThan0() {
Mockito.doReturn(Size(1, 0)).`when`(roundedCornerResDelegate).topRoundedSize
Mockito.doReturn(Size(0, 0)).`when`(roundedCornerResDelegate).bottomRoundedSize
Mockito.doReturn(false).`when`(roundedCornerResDelegate).isMultipleRadius
fun testOnlyHasTopRoundedCorners() {
Mockito.doReturn(true).`when`(roundedCornerResDelegate).hasTop
Mockito.doReturn(false).`when`(roundedCornerResDelegate).hasBottom
Mockito.doReturn(Size(1, 1)).`when`(roundedCornerResDelegate).topRoundedSize
roundedCornerDecorProviderFactory =
RoundedCornerDecorProviderFactory(roundedCornerResDelegate)
@@ -82,9 +81,9 @@ class RoundedCornerDecorProviderFactoryTest : SysuiTestCase() {
@Test
fun testHasRoundedCornersIfBottomWidthLargerThan0() {
Mockito.doReturn(Size(0, 0)).`when`(roundedCornerResDelegate).topRoundedSize
Mockito.doReturn(false).`when`(roundedCornerResDelegate).hasTop
Mockito.doReturn(true).`when`(roundedCornerResDelegate).hasBottom
Mockito.doReturn(Size(1, 1)).`when`(roundedCornerResDelegate).bottomRoundedSize
Mockito.doReturn(false).`when`(roundedCornerResDelegate).isMultipleRadius
roundedCornerDecorProviderFactory =
RoundedCornerDecorProviderFactory(roundedCornerResDelegate)
@@ -107,9 +106,10 @@ class RoundedCornerDecorProviderFactoryTest : SysuiTestCase() {
@Test
fun test4CornerDecorProvidersInfo() {
Mockito.doReturn(true).`when`(roundedCornerResDelegate).hasTop
Mockito.doReturn(true).`when`(roundedCornerResDelegate).hasBottom
Mockito.doReturn(Size(10, 10)).`when`(roundedCornerResDelegate).topRoundedSize
Mockito.doReturn(Size(10, 10)).`when`(roundedCornerResDelegate).bottomRoundedSize
Mockito.doReturn(true).`when`(roundedCornerResDelegate).isMultipleRadius
roundedCornerDecorProviderFactory =
RoundedCornerDecorProviderFactory(roundedCornerResDelegate)

View File

@@ -17,12 +17,14 @@
package com.android.systemui.decor
import android.content.res.TypedArray
import android.graphics.drawable.VectorDrawable
import android.graphics.drawable.Drawable
import android.testing.AndroidTestingRunner
import android.testing.TestableResources
import android.util.Size
import androidx.annotation.DrawableRes
import androidx.test.filters.SmallTest
import com.android.systemui.R
import com.android.internal.R as InternalR
import com.android.systemui.R as SystemUIR
import com.android.systemui.tests.R
import com.android.systemui.SysuiTestCase
import org.junit.Assert.assertEquals
import org.junit.Before
@@ -44,67 +46,77 @@ class RoundedCornerResDelegateTest : SysuiTestCase() {
MockitoAnnotations.initMocks(this)
}
@Test
fun testTopAndBottomRoundedCornerExist() {
setupResources(radius = 5)
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
assertEquals(true, roundedCornerResDelegate.hasTop)
assertEquals(true, roundedCornerResDelegate.hasBottom)
}
@Test
fun testTopRoundedCornerExist() {
setupResources(radiusTop = 10)
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
assertEquals(true, roundedCornerResDelegate.hasTop)
assertEquals(false, roundedCornerResDelegate.hasBottom)
}
@Test
fun testBottomRoundedCornerExist() {
setupResources(radiusBottom = 15)
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
assertEquals(false, roundedCornerResDelegate.hasTop)
assertEquals(true, roundedCornerResDelegate.hasBottom)
}
@Test
fun testUpdateDisplayUniqueId() {
mContext.orCreateTestableResources.addOverrides(
mockTypeArray = mockTypedArray,
radius = 3,
radiusTop = 0,
radiusBottom = 4,
multipleRadius = false)
setupResources(radius = 100,
roundedTopDrawable = getTestsDrawable(R.drawable.rounded3px),
roundedBottomDrawable = getTestsDrawable(R.drawable.rounded4px))
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
assertEquals(Size(3, 3), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(4, 4), roundedCornerResDelegate.bottomRoundedSize)
assertEquals(false, roundedCornerResDelegate.isMultipleRadius)
mContext.orCreateTestableResources.addOverrides(
mockTypeArray = mockTypedArray,
radius = 5,
radiusTop = 6,
radiusBottom = 0)
setupResources(radius = 100,
roundedTopDrawable = getTestsDrawable(R.drawable.rounded4px),
roundedBottomDrawable = getTestsDrawable(R.drawable.rounded5px))
roundedCornerResDelegate.updateDisplayUniqueId("test", null)
assertEquals(Size(6, 6), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(4, 4), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(5, 5), roundedCornerResDelegate.bottomRoundedSize)
}
@Test
fun testNotUpdateDisplayUniqueIdButChangeRefreshToken() {
mContext.orCreateTestableResources.addOverrides(
mockTypeArray = mockTypedArray,
radius = 3,
radiusTop = 0,
radiusBottom = 4,
multipleRadius = false)
setupResources(radius = 100,
roundedTopDrawable = getTestsDrawable(R.drawable.rounded3px),
roundedBottomDrawable = getTestsDrawable(R.drawable.rounded4px))
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
assertEquals(Size(3, 3), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(4, 4), roundedCornerResDelegate.bottomRoundedSize)
assertEquals(false, roundedCornerResDelegate.isMultipleRadius)
mContext.orCreateTestableResources.addOverrides(
mockTypeArray = mockTypedArray,
radius = 5,
radiusTop = 6,
radiusBottom = 0)
setupResources(radius = 100,
roundedTopDrawable = getTestsDrawable(R.drawable.rounded4px),
roundedBottomDrawable = getTestsDrawable(R.drawable.rounded5px))
roundedCornerResDelegate.updateDisplayUniqueId(null, 1)
assertEquals(Size(6, 6), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(4, 4), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(5, 5), roundedCornerResDelegate.bottomRoundedSize)
}
@Test
fun testUpdateTuningSizeFactor() {
mContext.orCreateTestableResources.addOverrides(
mockTypeArray = mockTypedArray,
radiusTop = 2,
radiusBottom = 0,
multipleRadius = false)
setupResources(radius = 100,
roundedTopDrawable = getTestsDrawable(R.drawable.rounded3px),
roundedBottomDrawable = getTestsDrawable(R.drawable.rounded4px))
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
@@ -115,62 +127,43 @@ class RoundedCornerResDelegateTest : SysuiTestCase() {
assertEquals(Size(length, length), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(length, length), roundedCornerResDelegate.bottomRoundedSize)
mContext.orCreateTestableResources.addOverrides(
mockTypeArray = mockTypedArray,
radiusTop = 1,
radiusBottom = 2,
multipleRadius = false)
roundedCornerResDelegate.updateTuningSizeFactor(null, 2)
assertEquals(Size(1, 1), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(2, 2), roundedCornerResDelegate.bottomRoundedSize)
}
@Test
fun testReadDefaultRadiusWhen0() {
mContext.orCreateTestableResources.addOverrides(
mockTypeArray = mockTypedArray,
radius = 3,
radiusTop = 0,
radiusBottom = 0,
multipleRadius = false)
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
assertEquals(Size(3, 3), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(3, 3), roundedCornerResDelegate.bottomRoundedSize)
assertEquals(Size(4, 4), roundedCornerResDelegate.bottomRoundedSize)
}
@Test
fun testReadMultipleRadius() {
val d = mContext.getDrawable(R.drawable.rounded) as VectorDrawable
val multipleRadiusSize = Size(d.intrinsicWidth, d.intrinsicHeight)
mContext.orCreateTestableResources.addOverrides(
mockTypeArray = mockTypedArray,
multipleRadius = true)
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
assertEquals(multipleRadiusSize, roundedCornerResDelegate.topRoundedSize)
assertEquals(multipleRadiusSize, roundedCornerResDelegate.bottomRoundedSize)
private fun getTestsDrawable(@DrawableRes drawableId: Int): Drawable? {
return mContext.createPackageContext("com.android.systemui.tests", 0)
.getDrawable(drawableId)
}
private fun setupResources(
radius: Int? = null,
radiusTop: Int? = null,
radiusBottom: Int? = null,
roundedTopDrawable: Drawable? = null,
roundedBottomDrawable: Drawable? = null
) {
mContext.orCreateTestableResources.let { res ->
res.addOverride(InternalR.array.config_displayUniqueIdArray, arrayOf<String>())
res.addOverride(InternalR.array.config_roundedCornerRadiusArray, mockTypedArray)
res.addOverride(InternalR.array.config_roundedCornerTopRadiusArray, mockTypedArray)
res.addOverride(InternalR.array.config_roundedCornerBottomRadiusArray, mockTypedArray)
res.addOverride(SystemUIR.array.config_roundedCornerDrawableArray, mockTypedArray)
res.addOverride(SystemUIR.array.config_roundedCornerTopDrawableArray, mockTypedArray)
res.addOverride(SystemUIR.array.config_roundedCornerBottomDrawableArray, mockTypedArray)
res.addOverride(SystemUIR.array.config_roundedCornerMultipleRadiusArray, mockTypedArray)
res.addOverride(com.android.internal.R.dimen.rounded_corner_radius, radius ?: 0)
res.addOverride(com.android.internal.R.dimen.rounded_corner_radius_top, radiusTop ?: 0)
res.addOverride(com.android.internal.R.dimen.rounded_corner_radius_bottom,
radiusBottom ?: 0)
roundedTopDrawable?.let { drawable ->
res.addOverride(SystemUIR.drawable.rounded_corner_top, drawable)
}
roundedBottomDrawable?.let { drawable ->
res.addOverride(SystemUIR.drawable.rounded_corner_bottom, drawable)
}
}
}
}
private fun TestableResources.addOverrides(
mockTypeArray: TypedArray,
radius: Int? = null,
radiusTop: Int? = null,
radiusBottom: Int? = null,
multipleRadius: Boolean? = null
) {
addOverride(com.android.internal.R.array.config_displayUniqueIdArray, arrayOf<String>())
addOverride(com.android.internal.R.array.config_roundedCornerRadiusArray, mockTypeArray)
addOverride(com.android.internal.R.array.config_roundedCornerTopRadiusArray, mockTypeArray)
addOverride(com.android.internal.R.array.config_roundedCornerBottomRadiusArray, mockTypeArray)
addOverride(R.array.config_roundedCornerDrawableArray, mockTypeArray)
addOverride(R.array.config_roundedCornerTopDrawableArray, mockTypeArray)
addOverride(R.array.config_roundedCornerBottomDrawableArray, mockTypeArray)
addOverride(R.array.config_roundedCornerMultipleRadiusArray, mockTypeArray)
radius?.let { addOverride(com.android.internal.R.dimen.rounded_corner_radius, it) }
radiusTop?.let { addOverride(com.android.internal.R.dimen.rounded_corner_radius_top, it) }
radiusBottom?.let { addOverride(com.android.internal.R.dimen.rounded_corner_radius_bottom, it) }
multipleRadius?.let { addOverride(R.bool.config_roundedCornerMultipleRadius, it) }
}