Merge "Phase out config_roundedCornerMultipleRadius" into tm-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
76fa901bb9
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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})")
|
||||
|
||||
24
packages/SystemUI/tests/res/drawable/rounded3px.xml
Normal file
24
packages/SystemUI/tests/res/drawable/rounded3px.xml
Normal 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>
|
||||
24
packages/SystemUI/tests/res/drawable/rounded4px.xml
Normal file
24
packages/SystemUI/tests/res/drawable/rounded4px.xml
Normal 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>
|
||||
24
packages/SystemUI/tests/res/drawable/rounded5px.xml
Normal file
24
packages/SystemUI/tests/res/drawable/rounded5px.xml
Normal 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>
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) }
|
||||
}
|
||||
Reference in New Issue
Block a user