Merge "Move color and display info into DecorProvider"

This commit is contained in:
TreeHugger Robot
2022-06-30 02:10:35 +00:00
committed by Android (Google) Code Review
10 changed files with 197 additions and 164 deletions

View File

@@ -47,7 +47,8 @@ import com.android.systemui.animation.Interpolators
open class DisplayCutoutBaseView : View, RegionInterceptableView {
private var shouldDrawCutout: Boolean = DisplayCutout.getFillBuiltInDisplayCutout(
context.resources, context.display?.uniqueId)
context.resources, context.display?.uniqueId
)
private var displayUniqueId: String? = null
private var displayMode: Display.Mode? = null
protected val location = IntArray(2)
@@ -74,8 +75,8 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
: super(context, attrs, defStyleAttr)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) :
super(context, attrs, defStyleAttr)
override fun onAttachedToWindow() {
super.onAttachedToWindow()
@@ -85,7 +86,7 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
onUpdate()
}
fun onDisplayChanged(displayId: Int) {
fun onDisplayChanged(newDisplayUniqueId: String?) {
val oldMode: Display.Mode? = displayMode
val display: Display? = context.display
displayMode = display?.mode
@@ -93,7 +94,8 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
if (displayUniqueId != display?.uniqueId) {
displayUniqueId = display?.uniqueId
shouldDrawCutout = DisplayCutout.getFillBuiltInDisplayCutout(
context.resources, displayUniqueId)
context.resources, displayUniqueId
)
}
// Skip if display mode or cutout hasn't changed.
@@ -101,7 +103,7 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
display?.cutout == displayInfo.displayCutout) {
return
}
if (displayId == display?.displayId) {
if (newDisplayUniqueId == display?.uniqueId) {
updateCutout()
updateProtectionBoundingPath()
onUpdate()
@@ -147,8 +149,9 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
cutoutBounds.translate(-location[0], -location[1])
// Intersect with window's frame
cutoutBounds.op(rootView.left, rootView.top, rootView.right, rootView.bottom,
Region.Op.INTERSECT)
cutoutBounds.op(
rootView.left, rootView.top, rootView.right, rootView.bottom, Region.Op.INTERSECT
)
return cutoutBounds
}
@@ -171,9 +174,12 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
protected open fun drawCutoutProtection(canvas: Canvas) {
if (cameraProtectionProgress > HIDDEN_CAMERA_PROTECTION_SCALE &&
!protectionRect.isEmpty) {
canvas.scale(cameraProtectionProgress, cameraProtectionProgress,
protectionRect.centerX(), protectionRect.centerY())
!protectionRect.isEmpty
) {
canvas.scale(
cameraProtectionProgress, cameraProtectionProgress, protectionRect.centerX(),
protectionRect.centerY()
)
canvas.drawPath(protectionPath, paint)
}
}
@@ -205,14 +211,17 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
requestLayout()
}
cameraProtectionAnimator?.cancel()
cameraProtectionAnimator = ValueAnimator.ofFloat(cameraProtectionProgress,
if (showProtection) 1.0f else HIDDEN_CAMERA_PROTECTION_SCALE).setDuration(750)
cameraProtectionAnimator = ValueAnimator.ofFloat(
cameraProtectionProgress,
if (showProtection) 1.0f else HIDDEN_CAMERA_PROTECTION_SCALE
).setDuration(750)
cameraProtectionAnimator?.interpolator = Interpolators.DECELERATE_QUINT
cameraProtectionAnimator?.addUpdateListener(ValueAnimator.AnimatorUpdateListener {
animation: ValueAnimator ->
cameraProtectionProgress = animation.animatedValue as Float
invalidate()
})
cameraProtectionAnimator?.addUpdateListener(
ValueAnimator.AnimatorUpdateListener { animation: ValueAnimator ->
cameraProtectionProgress = animation.animatedValue as Float
invalidate()
}
)
cameraProtectionAnimator?.addListener(object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator) {
cameraProtectionAnimator = null
@@ -245,8 +254,10 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
// Apply rotation.
val lw: Int = displayInfo.logicalWidth
val lh: Int = displayInfo.logicalHeight
val flipped = (displayInfo.rotation == Surface.ROTATION_90 ||
displayInfo.rotation == Surface.ROTATION_270)
val flipped = (
displayInfo.rotation == Surface.ROTATION_90 ||
displayInfo.rotation == Surface.ROTATION_270
)
val dw = if (flipped) lh else lw
val dh = if (flipped) lw else lh
transformPhysicalToLogicalCoordinates(displayInfo.rotation, dw, dh, m)
@@ -275,7 +286,7 @@ open class DisplayCutoutBaseView : View, RegionInterceptableView {
// We purposely ignore refresh rate and id changes here, because we don't need to
// invalidate for those, and they can trigger the refresh rate to increase
return oldMode?.physicalHeight != newMode?.physicalHeight ||
oldMode?.physicalWidth != newMode?.physicalWidth
oldMode?.physicalWidth != newMode?.physicalWidth
}
companion object {

View File

@@ -32,7 +32,6 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Color;
@@ -92,10 +91,8 @@ import com.android.systemui.util.settings.SecureSettings;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Executor;
import javax.inject.Inject;
@@ -448,6 +445,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
}
}
boolean needToUpdateProviderViews = false;
final String newUniqueId = mDisplayInfo.uniqueId;
if (!Objects.equals(newUniqueId, mDisplayUniqueId)) {
mDisplayUniqueId = newUniqueId;
@@ -470,8 +468,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
updateHwLayerRoundedCornerDrawable();
updateHwLayerRoundedCornerExistAndSize();
}
updateOverlayProviderViews();
needToUpdateProviderViews = true;
}
final float newRatio = getPhysicalPixelDisplaySizeRatio();
@@ -480,7 +477,13 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
if (mScreenDecorHwcLayer != null) {
updateHwLayerRoundedCornerExistAndSize();
}
updateOverlayProviderViews();
needToUpdateProviderViews = true;
}
if (needToUpdateProviderViews) {
updateOverlayProviderViews(null);
} else {
updateOverlayProviderViews(new Integer[] { mFaceScanningViewId });
}
if (mCutoutViews != null) {
@@ -490,18 +493,12 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
if (cutoutView == null) {
continue;
}
cutoutView.onDisplayChanged(displayId);
cutoutView.onDisplayChanged(newUniqueId);
}
}
DisplayCutoutView overlay = (DisplayCutoutView) getOverlayView(mFaceScanningViewId);
if (overlay != null) {
// handle display resolution changes
overlay.onDisplayChanged(displayId);
}
if (mScreenDecorHwcLayer != null) {
mScreenDecorHwcLayer.onDisplayChanged(displayId);
mScreenDecorHwcLayer.onDisplayChanged(newUniqueId);
}
}
};
@@ -804,7 +801,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
return;
}
removeOverlayView(provider.getViewId());
overlay.addDecorProvider(provider, mRotation);
overlay.addDecorProvider(provider, mRotation, mTintColor);
});
}
// Use visibility of privacy dot views & face scanning view to determine the overlay's
@@ -954,24 +951,6 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
return;
}
// When the hwc supports screen decorations, the layer will use the A8 color mode which
// won't be affected by the color inversion. If the composition goes the client composition
// route, the color inversion will be handled by the RenderEngine.
final Set<Integer> viewsMayNeedColorUpdate = new HashSet<>();
if (mHwcScreenDecorationSupport == null) {
ColorStateList tintList = ColorStateList.valueOf(mTintColor);
mRoundedCornerResDelegate.setColorTintList(tintList);
viewsMayNeedColorUpdate.add(R.id.rounded_corner_top_left);
viewsMayNeedColorUpdate.add(R.id.rounded_corner_top_right);
viewsMayNeedColorUpdate.add(R.id.rounded_corner_bottom_left);
viewsMayNeedColorUpdate.add(R.id.rounded_corner_bottom_right);
viewsMayNeedColorUpdate.add(R.id.display_cutout);
}
if (getOverlayView(mFaceScanningViewId) != null) {
viewsMayNeedColorUpdate.add(mFaceScanningViewId);
}
final Integer[] views = new Integer[viewsMayNeedColorUpdate.size()];
viewsMayNeedColorUpdate.toArray(views);
for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) {
if (mOverlays[i] == null) {
continue;
@@ -981,14 +960,19 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
View child;
for (int j = 0; j < size; j++) {
child = overlayView.getChildAt(j);
if (viewsMayNeedColorUpdate.contains(child.getId())
&& child instanceof DisplayCutoutView) {
if (child instanceof DisplayCutoutView && child.getId() == R.id.display_cutout) {
((DisplayCutoutView) child).setColor(mTintColor);
}
}
mOverlays[i].onReloadResAndMeasure(views, mProviderRefreshToken,
mRotation, mDisplayUniqueId);
}
updateOverlayProviderViews(new Integer[] {
mFaceScanningViewId,
R.id.rounded_corner_top_left,
R.id.rounded_corner_top_right,
R.id.rounded_corner_bottom_left,
R.id.rounded_corner_bottom_right
});
}
@VisibleForTesting
@@ -1119,7 +1103,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
}
// update all provider views inside overlay
updateOverlayProviderViews();
updateOverlayProviderViews(null);
}
FaceScanningOverlay faceScanningOverlay =
@@ -1191,7 +1175,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
context.getResources(), context.getDisplay().getUniqueId());
}
private void updateOverlayProviderViews() {
private void updateOverlayProviderViews(@Nullable Integer[] filterIds) {
if (mOverlays == null) {
return;
}
@@ -1200,7 +1184,8 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
if (overlay == null) {
continue;
}
overlay.onReloadResAndMeasure(null, mProviderRefreshToken, mRotation, mDisplayUniqueId);
overlay.onReloadResAndMeasure(filterIds, mProviderRefreshToken, mRotation, mTintColor,
mDisplayUniqueId);
}
}
@@ -1239,19 +1224,12 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
} catch (NumberFormatException e) {
mRoundedCornerResDelegate.setTuningSizeFactor(null);
}
Integer[] filterIds = {
updateOverlayProviderViews(new Integer[] {
R.id.rounded_corner_top_left,
R.id.rounded_corner_top_right,
R.id.rounded_corner_bottom_left,
R.id.rounded_corner_bottom_right
};
for (final OverlayWindow overlay: mOverlays) {
if (overlay == null) {
continue;
}
overlay.onReloadResAndMeasure(filterIds, mProviderRefreshToken, mRotation,
mDisplayUniqueId);
}
});
updateHwLayerRoundedCornerExistAndSize();
});
}

View File

@@ -33,7 +33,7 @@ abstract class DecorProvider {
/** The number of total aligned bounds */
val numOfAlignedEdge: Int
get() = alignedBounds.size
get() = alignedBounds.size
/** The aligned bounds for the view which is created through inflateView() */
abstract val alignedBounds: List<Int>
@@ -46,14 +46,16 @@ abstract class DecorProvider {
view: View,
reloadToken: Int,
@Surface.Rotation rotation: Int,
displayUniqueId: String? = null
tintColor: Int,
displayUniqueId: String?
)
/** Inflate view into parent as current rotation */
abstract fun inflateView(
context: Context,
parent: ViewGroup,
@Surface.Rotation rotation: Int
@Surface.Rotation rotation: Int,
tintColor: Int
): View
}

View File

@@ -115,19 +115,25 @@ class FaceScanningOverlayProviderImpl(
override fun onReloadResAndMeasure(
view: View,
reloadToken: Int,
rotation: Int,
@Surface.Rotation rotation: Int,
tintColor: Int,
displayUniqueId: String?
) {
(view.layoutParams as FrameLayout.LayoutParams).let {
updateLayoutParams(it, rotation)
view.layoutParams = it
(view as? FaceScanningOverlay)?.let { overlay ->
overlay.setColor(tintColor)
overlay.onDisplayChanged(displayUniqueId)
}
}
}
override fun inflateView(
context: Context,
parent: ViewGroup,
@Surface.Rotation rotation: Int
@Surface.Rotation rotation: Int,
tintColor: Int
): View {
val view = FaceScanningOverlay(
context,
@@ -137,6 +143,7 @@ class FaceScanningOverlayProviderImpl(
mainExecutor
)
view.id = viewId
view.setColor(tintColor)
FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT).let {
updateLayoutParams(it, rotation)

View File

@@ -34,9 +34,10 @@ class OverlayWindow(private val context: Context) {
fun addDecorProvider(
decorProvider: DecorProvider,
@Surface.Rotation rotation: Int
@Surface.Rotation rotation: Int,
tintColor: Int
) {
val view = decorProvider.inflateView(context, rootView, rotation)
val view = decorProvider.inflateView(context, rootView, rotation, tintColor)
viewProviderMap[decorProvider.viewId] = Pair(view, decorProvider)
}
@@ -69,7 +70,7 @@ class OverlayWindow(private val context: Context) {
*/
fun hasSameProviders(newProviders: List<DecorProvider>): Boolean {
return (newProviders.size == viewProviderMap.size) &&
newProviders.all { getView(it.viewId) != null }
newProviders.all { getView(it.viewId) != null }
}
/**
@@ -82,23 +83,28 @@ class OverlayWindow(private val context: Context) {
filterIds: Array<Int>? = null,
reloadToken: Int,
@Surface.Rotation rotation: Int,
tintColor: Int,
displayUniqueId: String? = null
) {
filterIds?.forEach { id ->
viewProviderMap[id]?.let {
it.second.onReloadResAndMeasure(
view = it.first,
reloadToken = reloadToken,
displayUniqueId = displayUniqueId,
rotation = rotation)
view = it.first,
reloadToken = reloadToken,
rotation = rotation,
tintColor = tintColor,
displayUniqueId = displayUniqueId
)
}
} ?: run {
viewProviderMap.values.forEach {
it.second.onReloadResAndMeasure(
view = it.first,
reloadToken = reloadToken,
displayUniqueId = displayUniqueId,
rotation = rotation)
view = it.first,
reloadToken = reloadToken,
rotation = rotation,
tintColor = tintColor,
displayUniqueId = displayUniqueId
)
}
}
}
@@ -111,4 +117,4 @@ class OverlayWindow(private val context: Context) {
pw.println(" child[$i]=$child")
}
}
}
}

View File

@@ -20,9 +20,9 @@ import android.content.Context
import android.content.res.Resources
import android.view.DisplayCutout
import android.view.LayoutInflater
import android.view.Surface
import android.view.View
import android.view.ViewGroup
import android.view.Surface
import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
@@ -85,6 +85,7 @@ class PrivacyDotCornerDecorProviderImpl(
view: View,
reloadToken: Int,
rotation: Int,
tintColor: Int,
displayUniqueId: String?
) {
// Do nothing here because it is handled inside PrivacyDotViewController
@@ -93,7 +94,8 @@ class PrivacyDotCornerDecorProviderImpl(
override fun inflateView(
context: Context,
parent: ViewGroup,
@Surface.Rotation rotation: Int
@Surface.Rotation rotation: Int,
tintColor: Int
): View {
LayoutInflater.from(context).inflate(layoutId, parent, true)
return parent.getChildAt(parent.childCount - 1 /* latest new added child */)

View File

@@ -17,6 +17,7 @@
package com.android.systemui.decor
import android.content.Context
import android.content.res.ColorStateList
import android.view.DisplayCutout
import android.view.Gravity
import android.view.Surface
@@ -38,12 +39,13 @@ class RoundedCornerDecorProviderImpl(
override fun inflateView(
context: Context,
parent: ViewGroup,
@Surface.Rotation rotation: Int
@Surface.Rotation rotation: Int,
tintColor: Int
): View {
return ImageView(context).also { view ->
// View
view.id = viewId
initView(view, rotation)
initView(view, rotation, tintColor)
// LayoutParams
val layoutSize = if (isTop) {
@@ -52,31 +54,36 @@ class RoundedCornerDecorProviderImpl(
roundedCornerResDelegate.bottomRoundedSize
}
val params = FrameLayout.LayoutParams(
layoutSize.width,
layoutSize.height,
alignedBound1.toLayoutGravity(rotation) or
alignedBound2.toLayoutGravity(rotation))
layoutSize.width,
layoutSize.height,
alignedBound1.toLayoutGravity(rotation) or alignedBound2.toLayoutGravity(rotation)
)
// AddView
parent.addView(view, params)
}
}
private fun initView(view: ImageView, @Surface.Rotation rotation: Int) {
private fun initView(
view: ImageView,
@Surface.Rotation rotation: Int,
tintColor: Int
) {
view.setRoundedCornerImage(roundedCornerResDelegate, isTop)
view.adjustRotation(alignedBounds, rotation)
view.imageTintList = roundedCornerResDelegate.colorTintList
view.imageTintList = ColorStateList.valueOf(tintColor)
}
override fun onReloadResAndMeasure(
view: View,
reloadToken: Int,
@Surface.Rotation rotation: Int,
tintColor: Int,
displayUniqueId: String?
) {
roundedCornerResDelegate.updateDisplayUniqueId(displayUniqueId, reloadToken)
initView((view as ImageView), rotation)
initView((view as ImageView), rotation, tintColor)
val layoutSize = if (isTop) {
roundedCornerResDelegate.topRoundedSize
@@ -87,7 +94,7 @@ class RoundedCornerDecorProviderImpl(
it.width = layoutSize.width
it.height = layoutSize.height
it.gravity = alignedBound1.toLayoutGravity(rotation) or
alignedBound2.toLayoutGravity(rotation)
alignedBound2.toLayoutGravity(rotation)
view.setLayoutParams(it)
}
}
@@ -134,10 +141,10 @@ private fun ImageView.setRoundedCornerImage(
setImageDrawable(drawable)
} else {
setImageResource(
if (isTop)
R.drawable.rounded_corner_top
else
R.drawable.rounded_corner_bottom
if (isTop)
R.drawable.rounded_corner_top
else
R.drawable.rounded_corner_bottom
)
}
}
@@ -187,4 +194,4 @@ private fun ImageView.adjustRotation(alignedBounds: List<Int>, @Surface.Rotation
this.rotation = newRotation
this.scaleX = newScaleX
this.scaleY = newScaleY
}
}

View File

@@ -18,9 +18,7 @@ package com.android.systemui.decor
import android.annotation.ArrayRes
import android.annotation.DrawableRes
import android.content.res.ColorStateList
import android.content.res.Resources
import android.graphics.Color
import android.graphics.drawable.Drawable
import android.util.DisplayUtils
import android.util.Size
@@ -57,8 +55,6 @@ class RoundedCornerResDelegate(
var bottomRoundedSize = Size(0, 0)
private set
var colorTintList = ColorStateList.valueOf(Color.BLACK)
var tuningSizeFactor: Int? = null
set(value) {
if (field == value) {
@@ -107,19 +103,19 @@ class RoundedCornerResDelegate(
val hasDefaultRadius = RoundedCorners.getRoundedCornerRadius(res, displayUniqueId) > 0
hasTop = hasDefaultRadius ||
(RoundedCorners.getRoundedCornerTopRadius(res, displayUniqueId) > 0)
(RoundedCorners.getRoundedCornerTopRadius(res, displayUniqueId) > 0)
hasBottom = hasDefaultRadius ||
(RoundedCorners.getRoundedCornerBottomRadius(res, displayUniqueId) > 0)
(RoundedCorners.getRoundedCornerBottomRadius(res, displayUniqueId) > 0)
topRoundedDrawable = getDrawable(
displayConfigIndex = configIdx,
arrayResId = R.array.config_roundedCornerTopDrawableArray,
backupDrawableId = R.drawable.rounded_corner_top
displayConfigIndex = configIdx,
arrayResId = R.array.config_roundedCornerTopDrawableArray,
backupDrawableId = R.drawable.rounded_corner_top
)
bottomRoundedDrawable = getDrawable(
displayConfigIndex = configIdx,
arrayResId = R.array.config_roundedCornerBottomDrawableArray,
backupDrawableId = R.drawable.rounded_corner_bottom
displayConfigIndex = configIdx,
arrayResId = R.array.config_roundedCornerBottomDrawableArray,
backupDrawableId = R.drawable.rounded_corner_bottom
)
}
@@ -147,13 +143,15 @@ class RoundedCornerResDelegate(
if (physicalPixelDisplaySizeRatio != 1f) {
if (topRoundedSize.width != 0) {
topRoundedSize = Size(
(physicalPixelDisplaySizeRatio * topRoundedSize.width + 0.5f).toInt(),
(physicalPixelDisplaySizeRatio * topRoundedSize.height + 0.5f).toInt())
(physicalPixelDisplaySizeRatio * topRoundedSize.width + 0.5f).toInt(),
(physicalPixelDisplaySizeRatio * topRoundedSize.height + 0.5f).toInt()
)
}
if (bottomRoundedSize.width != 0) {
bottomRoundedSize = Size(
(physicalPixelDisplaySizeRatio * bottomRoundedSize.width + 0.5f).toInt(),
(physicalPixelDisplaySizeRatio * bottomRoundedSize.height + 0.5f).toInt())
(physicalPixelDisplaySizeRatio * bottomRoundedSize.width + 0.5f).toInt(),
(physicalPixelDisplaySizeRatio * bottomRoundedSize.height + 0.5f).toInt()
)
}
}
}
@@ -180,8 +178,9 @@ class RoundedCornerResDelegate(
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})")
pw.println(
" bottomRoundedSize(w,h)=(${bottomRoundedSize.width},${bottomRoundedSize.height})"
)
pw.println(" physicalPixelDisplaySizeRatio=$physicalPixelDisplaySizeRatio")
}
}
}

View File

@@ -1383,7 +1383,7 @@ public class ScreenDecorationsTest extends SysuiTestCase {
mScreenDecorations.mDisplayListener.onDisplayChanged(1);
verify(hwcLayer, times(1)).onDisplayChanged(1);
verify(hwcLayer, times(1)).onDisplayChanged(any());
}
@Test
@@ -1407,7 +1407,7 @@ public class ScreenDecorationsTest extends SysuiTestCase {
mScreenDecorations.mDisplayListener.onDisplayChanged(1);
verify(cutoutView, times(1)).onDisplayChanged(1);
verify(cutoutView, times(1)).onDisplayChanged(any());
}
@Test

View File

@@ -16,6 +16,7 @@
package com.android.systemui.decor
import android.graphics.Color
import android.testing.AndroidTestingRunner
import android.testing.TestableLooper.RunWithLooper
import android.view.DisplayCutout
@@ -51,35 +52,45 @@ class OverlayWindowTest : SysuiTestCase() {
@Before
fun setUp() {
decorProvider1 = spy(PrivacyDotCornerDecorProviderImpl(
decorProvider1 = spy(
PrivacyDotCornerDecorProviderImpl(
viewId = TEST_DECOR_VIEW_ID_1,
alignedBound1 = DisplayCutout.BOUNDS_POSITION_TOP,
alignedBound2 = DisplayCutout.BOUNDS_POSITION_LEFT,
layoutId = R.layout.privacy_dot_top_left))
decorProvider2 = spy(PrivacyDotCornerDecorProviderImpl(
layoutId = R.layout.privacy_dot_top_left
)
)
decorProvider2 = spy(
PrivacyDotCornerDecorProviderImpl(
viewId = TEST_DECOR_VIEW_ID_2,
alignedBound1 = DisplayCutout.BOUNDS_POSITION_BOTTOM,
alignedBound2 = DisplayCutout.BOUNDS_POSITION_LEFT,
layoutId = R.layout.privacy_dot_bottom_left))
decorProvider3 = spy(PrivacyDotCornerDecorProviderImpl(
layoutId = R.layout.privacy_dot_bottom_left
)
)
decorProvider3 = spy(
PrivacyDotCornerDecorProviderImpl(
viewId = TEST_DECOR_VIEW_ID_3,
alignedBound1 = DisplayCutout.BOUNDS_POSITION_BOTTOM,
alignedBound2 = DisplayCutout.BOUNDS_POSITION_RIGHT,
layoutId = R.layout.privacy_dot_bottom_right))
layoutId = R.layout.privacy_dot_bottom_right
)
)
overlay = OverlayWindow(mContext)
}
@Test
fun testAddProvider() {
@Surface.Rotation val rotation = Surface.ROTATION_270
overlay.addDecorProvider(decorProvider1, rotation)
overlay.addDecorProvider(decorProvider2, rotation)
overlay.addDecorProvider(decorProvider1, rotation, Color.BLACK)
overlay.addDecorProvider(decorProvider2, rotation, Color.YELLOW)
verify(decorProvider1, times(1)).inflateView(
mContext, overlay.rootView, rotation)
mContext, overlay.rootView, rotation, Color.BLACK
)
verify(decorProvider2, times(1)).inflateView(
mContext, overlay.rootView, rotation)
mContext, overlay.rootView, rotation, Color.YELLOW
)
val view1FoundFromRootView = overlay.rootView.findViewById<View>(TEST_DECOR_VIEW_ID_1)
Assert.assertNotNull(view1FoundFromRootView)
@@ -91,8 +102,8 @@ class OverlayWindowTest : SysuiTestCase() {
@Test
fun testRemoveView() {
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_270)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_270)
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_270, Color.BLACK)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_270, Color.BLACK)
overlay.removeView(TEST_DECOR_VIEW_ID_1)
val viewFoundFromRootView = overlay.rootView.findViewById<View>(TEST_DECOR_VIEW_ID_1)
@@ -102,39 +113,47 @@ class OverlayWindowTest : SysuiTestCase() {
@Test
fun testOnReloadResAndMeasureWithoutIds() {
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_0)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_0)
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_0, Color.BLACK)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_0, Color.BLACK)
overlay.onReloadResAndMeasure(
reloadToken = 1,
rotation = Surface.ROTATION_90,
displayUniqueId = null)
reloadToken = 1,
rotation = Surface.ROTATION_90,
tintColor = Color.BLACK,
displayUniqueId = null
)
verify(decorProvider1, times(1)).onReloadResAndMeasure(
overlay.getView(TEST_DECOR_VIEW_ID_1)!!, 1, Surface.ROTATION_90, null)
overlay.getView(TEST_DECOR_VIEW_ID_1)!!, 1, Surface.ROTATION_90, Color.BLACK, null
)
verify(decorProvider2, times(1)).onReloadResAndMeasure(
overlay.getView(TEST_DECOR_VIEW_ID_2)!!, 1, Surface.ROTATION_90, null)
overlay.getView(TEST_DECOR_VIEW_ID_2)!!, 1, Surface.ROTATION_90, Color.BLACK, null
)
}
@Test
fun testOnReloadResAndMeasureWithIds() {
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_0)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_0)
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_0, Color.BLACK)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_0, Color.BLACK)
overlay.onReloadResAndMeasure(
filterIds = arrayOf(TEST_DECOR_VIEW_ID_2),
reloadToken = 1,
rotation = Surface.ROTATION_90,
displayUniqueId = null)
filterIds = arrayOf(TEST_DECOR_VIEW_ID_2),
reloadToken = 1,
rotation = Surface.ROTATION_90,
tintColor = Color.BLACK,
displayUniqueId = null
)
verify(decorProvider1, never()).onReloadResAndMeasure(
overlay.getView(TEST_DECOR_VIEW_ID_1)!!, 1, Surface.ROTATION_90, null)
overlay.getView(TEST_DECOR_VIEW_ID_1)!!, 1, Surface.ROTATION_90, Color.BLACK, null
)
verify(decorProvider2, times(1)).onReloadResAndMeasure(
overlay.getView(TEST_DECOR_VIEW_ID_2)!!, 1, Surface.ROTATION_90, null)
overlay.getView(TEST_DECOR_VIEW_ID_2)!!, 1, Surface.ROTATION_90, Color.BLACK, null
)
}
@Test
fun testRemoveRedundantViewsWithNullParameter() {
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_270)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_270)
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_270, Color.BLACK)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_270, Color.BLACK)
overlay.removeRedundantViews(null)
@@ -146,13 +165,15 @@ class OverlayWindowTest : SysuiTestCase() {
@Test
fun testRemoveRedundantViewsWith2Providers() {
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_270)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_270)
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_270, Color.BLACK)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_270, Color.BLACK)
overlay.removeRedundantViews(IntArray(2).apply {
this[0] = TEST_DECOR_VIEW_ID_3
this[1] = TEST_DECOR_VIEW_ID_1
})
overlay.removeRedundantViews(
IntArray(2).apply {
this[0] = TEST_DECOR_VIEW_ID_3
this[1] = TEST_DECOR_VIEW_ID_1
}
)
Assert.assertNotNull(overlay.getView(TEST_DECOR_VIEW_ID_1))
Assert.assertNotNull(overlay.rootView.findViewById(TEST_DECOR_VIEW_ID_1))
@@ -167,16 +188,16 @@ class OverlayWindowTest : SysuiTestCase() {
Assert.assertFalse(overlay.hasSameProviders(listOf(decorProvider2)))
Assert.assertFalse(overlay.hasSameProviders(listOf(decorProvider2, decorProvider1)))
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_0)
overlay.addDecorProvider(decorProvider1, Surface.ROTATION_0, Color.BLACK)
Assert.assertFalse(overlay.hasSameProviders(emptyList()))
Assert.assertTrue(overlay.hasSameProviders(listOf(decorProvider1)))
Assert.assertFalse(overlay.hasSameProviders(listOf(decorProvider2)))
Assert.assertFalse(overlay.hasSameProviders(listOf(decorProvider2, decorProvider1)))
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_0)
overlay.addDecorProvider(decorProvider2, Surface.ROTATION_0, Color.BLACK)
Assert.assertFalse(overlay.hasSameProviders(emptyList()))
Assert.assertFalse(overlay.hasSameProviders(listOf(decorProvider1)))
Assert.assertFalse(overlay.hasSameProviders(listOf(decorProvider2)))
Assert.assertTrue(overlay.hasSameProviders(listOf(decorProvider2, decorProvider1)))
}
}
}