Merge "Move color and display info into DecorProvider"
This commit is contained in:
committed by
Android (Google) Code Review
commit
f18b219e83
@@ -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 {
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 */)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user