From 3353759edfb1915ebaf36318cddf6db20505c461 Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Tue, 21 Jun 2022 10:05:18 +0000 Subject: [PATCH] Move color and display info into DecorProvider Original tint color and display info are handled inside ScreenDecorations like specific cases. Move these info into interface of DecorProvider. Bug: 232874879 Test: atest ScreenDecorationsTest ScreenDecorHwcLayerTest \ OverlayWindowTest RoundedCornerResDelegateTest Test: fold/unfold/rotate/debugRoundedCornerSize/debugFlag on sw-layer devices Test: rotate/debugRoundedCornerSize/debugFlag/resolutionChange/faceAnim on hw-layer devices Change-Id: I1fdcbe4c5e8ee0a54eba03f59b9066e76e5c9a03 --- .../android/systemui/DisplayCutoutBaseView.kt | 53 ++++++---- .../android/systemui/ScreenDecorations.java | 76 +++++--------- .../android/systemui/decor/DecorProvider.kt | 8 +- .../decor/FaceScanningProviderFactory.kt | 11 ++- .../android/systemui/decor/OverlayWindow.kt | 30 +++--- .../decor/PrivacyDotDecorProviderFactory.kt | 6 +- .../decor/RoundedCornerDecorProviderImpl.kt | 37 ++++--- .../decor/RoundedCornerResDelegate.kt | 37 ++++--- .../systemui/ScreenDecorationsTest.java | 4 +- .../systemui/decor/OverlayWindowTest.kt | 99 +++++++++++-------- 10 files changed, 197 insertions(+), 164 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt index d2c229b8ead11..a3351e1a64400 100644 --- a/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt +++ b/packages/SystemUI/src/com/android/systemui/DisplayCutoutBaseView.kt @@ -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 { diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java index f99293a9d148e..aaaa3f77924a8 100644 --- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java @@ -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 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(); }); } diff --git a/packages/SystemUI/src/com/android/systemui/decor/DecorProvider.kt b/packages/SystemUI/src/com/android/systemui/decor/DecorProvider.kt index 169b50edccfc8..de6d7278971c5 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/DecorProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/DecorProvider.kt @@ -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 @@ -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 } diff --git a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt index adc0096eed377..a0d7640e65427 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/FaceScanningProviderFactory.kt @@ -109,19 +109,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, @@ -129,6 +135,7 @@ class FaceScanningOverlayProviderImpl( statusBarStateController, keyguardUpdateMonitor) view.id = viewId + view.setColor(tintColor) FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT).let { updateLayoutParams(it, rotation) diff --git a/packages/SystemUI/src/com/android/systemui/decor/OverlayWindow.kt b/packages/SystemUI/src/com/android/systemui/decor/OverlayWindow.kt index 3c0748e025522..dfb0b5aad9124 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/OverlayWindow.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/OverlayWindow.kt @@ -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): 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? = 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") } } -} \ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/decor/PrivacyDotDecorProviderFactory.kt b/packages/SystemUI/src/com/android/systemui/decor/PrivacyDotDecorProviderFactory.kt index 9f624b3dcb094..e18c0e15b57a7 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/PrivacyDotDecorProviderFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/PrivacyDotDecorProviderFactory.kt @@ -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 */) diff --git a/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerDecorProviderImpl.kt b/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerDecorProviderImpl.kt index e316722b64ea6..8156797c5a677 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerDecorProviderImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerDecorProviderImpl.kt @@ -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, @Surface.Rotation this.rotation = newRotation this.scaleX = newScaleX this.scaleY = newScaleY -} \ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerResDelegate.kt b/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerResDelegate.kt index b5a0cfcb1c184..a252864383876 100644 --- a/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerResDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/decor/RoundedCornerResDelegate.kt @@ -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") } -} \ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java index a35efa995ddd1..c83cc2654eb79 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java @@ -1382,7 +1382,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { mScreenDecorations.mDisplayListener.onDisplayChanged(1); - verify(hwcLayer, times(1)).onDisplayChanged(1); + verify(hwcLayer, times(1)).onDisplayChanged(any()); } @Test @@ -1406,7 +1406,7 @@ public class ScreenDecorationsTest extends SysuiTestCase { mScreenDecorations.mDisplayListener.onDisplayChanged(1); - verify(cutoutView, times(1)).onDisplayChanged(1); + verify(cutoutView, times(1)).onDisplayChanged(any()); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/decor/OverlayWindowTest.kt b/packages/SystemUI/tests/src/com/android/systemui/decor/OverlayWindowTest.kt index 69366fa0d4a94..8bf17d7c62f99 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/decor/OverlayWindowTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/decor/OverlayWindowTest.kt @@ -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(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(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))) } -} \ No newline at end of file +}