Passing info to RoundedCornerResDelegate directly

1. Move rounded corners tint color into RoundedCornerResDelegate, and
   RoundedCornerDecorProviderImpl uses it to draw image.
2. After display changed, pass display unique id to
   RoundedCornerResDelegate directly.
3. Cache tuning size inside RoundedCornerResDelegate

Bug: 229234279
Bug: 218951516
Test: atest ScreenDecorationsTest PrivacyDotDecorProviderFactoryTest \
      RoundedCornerDecorProviderFactoryTest RoundedCornerResDelegateTest
Change-Id: I7edd16db06f6023a3c3dfd10b430a5002b9ee942
This commit is contained in:
Milton Wu
2022-04-14 21:11:24 +08:00
parent 174c5ebb78
commit e9440ab1a0
7 changed files with 43 additions and 47 deletions

View File

@@ -64,7 +64,6 @@ import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.annotation.VisibleForTesting;
@@ -292,11 +291,6 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
return decorProviders;
}
private void updateDisplayIdToProviderFactories() {
mDotFactory.onDisplayUniqueIdChanged(mDisplayUniqueId);
mRoundedCornerFactory.onDisplayUniqueIdChanged(mDisplayUniqueId);
}
/**
* Check that newProviders is the same list with decorProviders inside mOverlay.
* @param newProviders expected comparing DecorProviders
@@ -389,7 +383,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
final DisplayDecorationSupport newScreenDecorationSupport =
mContext.getDisplay().getDisplayDecorationSupport();
updateDisplayIdToProviderFactories();
mRoundedCornerResDelegate.updateDisplayUniqueId(newUniqueId, null);
// When providers or the value of mSupportHwcScreenDecoration is changed,
// re-setup the whole screen decoration.
@@ -857,6 +851,15 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
}
ColorStateList tintList = ColorStateList.valueOf(mTintColor);
mRoundedCornerResDelegate.setColorTintList(tintList);
Integer[] roundedCornerIds = {
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 (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) {
if (mOverlays[i] == null) {
continue;
@@ -866,19 +869,12 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
View child;
for (int j = 0; j < size; j++) {
child = overlayView.getChildAt(j);
if (child.getId() == R.id.privacy_dot_top_left_container
|| child.getId() == R.id.privacy_dot_top_right_container
|| child.getId() == R.id.privacy_dot_bottom_left_container
|| child.getId() == R.id.privacy_dot_bottom_right_container) {
// Exclude privacy dot from color inversion (for now?)
continue;
}
if (child instanceof ImageView) {
((ImageView) child).setImageTintList(tintList);
} else if (child instanceof DisplayCutoutView) {
if (child instanceof DisplayCutoutView) {
((DisplayCutoutView) child).setColor(mTintColor);
}
}
mOverlays[i].onReloadResAndMeasure(roundedCornerIds, mProviderRefreshToken, mRotation,
mDisplayUniqueId);
}
}
@@ -1067,12 +1063,11 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
if (mOverlays == null || !SIZE.equals(key)) {
return;
}
++mProviderRefreshToken;
try {
final int sizeFactor = Integer.parseInt(newValue);
mRoundedCornerResDelegate.updateTuningSizeFactor(sizeFactor, mProviderRefreshToken);
mRoundedCornerResDelegate.setTuningSizeFactor(sizeFactor);
} catch (NumberFormatException e) {
mRoundedCornerResDelegate.updateTuningSizeFactor(null, mProviderRefreshToken);
mRoundedCornerResDelegate.setTuningSizeFactor(null);
}
Integer[] filterIds = {
R.id.rounded_corner_top_left,

View File

@@ -19,5 +19,4 @@ package com.android.systemui.decor
abstract class DecorProviderFactory {
abstract val providers: List<DecorProvider>
abstract val hasProviders: Boolean
abstract fun onDisplayUniqueIdChanged(displayUniqueId: String?)
}

View File

@@ -39,10 +39,6 @@ class PrivacyDotDecorProviderFactory @Inject constructor(
override val hasProviders: Boolean
get() = isPrivacyDotEnabled
override fun onDisplayUniqueIdChanged(displayUniqueId: String?) {
// Do nothing for privacy dot
}
override val providers: List<DecorProvider>
get() {
return if (hasProviders) {

View File

@@ -28,10 +28,6 @@ class RoundedCornerDecorProviderFactory(
hasTop || hasBottom
}
override fun onDisplayUniqueIdChanged(displayUniqueId: String?) {
roundedCornerResDelegate.updateDisplayUniqueId(displayUniqueId, null)
}
override val providers: List<DecorProvider>
get() {
val hasTop = roundedCornerResDelegate.hasTop

View File

@@ -65,7 +65,7 @@ class RoundedCornerDecorProviderImpl(
private fun initView(view: ImageView, @Surface.Rotation rotation: Int) {
view.setRoundedCornerImage(roundedCornerResDelegate, isTop)
view.adjustRotation(alignedBounds, rotation)
view.setColorFilter(IMAGE_TINT_COLOR)
view.imageTintList = roundedCornerResDelegate.colorTintList
}
override fun onReloadResAndMeasure(
@@ -93,8 +93,6 @@ class RoundedCornerDecorProviderImpl(
}
}
private const val IMAGE_TINT_COLOR: Int = 0xFF000000.toInt()
@DisplayCutout.BoundsPosition
private fun Int.toLayoutGravity(@Surface.Rotation rotation: Int): Int = when (rotation) {
Surface.ROTATION_0 -> when (this) {

View File

@@ -18,7 +18,9 @@ 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
@@ -55,6 +57,17 @@ class RoundedCornerResDelegate(
var bottomRoundedSize = Size(0, 0)
private set
var colorTintList = ColorStateList.valueOf(Color.BLACK)
var tuningSizeFactor: Int? = null
set(value) {
if (field == value) {
return
}
field = value
reloadMeasures()
}
init {
reloadRes()
reloadMeasures()
@@ -101,7 +114,7 @@ class RoundedCornerResDelegate(
)
}
private fun reloadMeasures(roundedSizeFactor: Int? = null) {
private fun reloadMeasures() {
topRoundedDrawable?.let {
topRoundedSize = Size(it.intrinsicWidth, it.intrinsicHeight)
}
@@ -109,21 +122,20 @@ class RoundedCornerResDelegate(
bottomRoundedSize = Size(it.intrinsicWidth, it.intrinsicHeight)
}
if (roundedSizeFactor != null && roundedSizeFactor > 0) {
val length: Int = (roundedSizeFactor * density).toInt()
topRoundedSize = Size(length, length)
bottomRoundedSize = Size(length, length)
tuningSizeFactor?.let {
if (it <= 0) {
return
}
val length: Int = (it * density).toInt()
if (topRoundedSize.width > 0) {
topRoundedSize = Size(length, length)
}
if (bottomRoundedSize.width > 0) {
bottomRoundedSize = Size(length, length)
}
}
}
fun updateTuningSizeFactor(factor: Int?, newReloadToken: Int) {
if (reloadToken == newReloadToken) {
return
}
reloadToken = newReloadToken
reloadMeasures(factor)
}
private fun getDrawable(
displayConfigIndex: Int,
@ArrayRes arrayResId: Int,

View File

@@ -121,13 +121,13 @@ class RoundedCornerResDelegateTest : SysuiTestCase() {
roundedCornerResDelegate = RoundedCornerResDelegate(mContext.resources, null)
val factor = 5
roundedCornerResDelegate.updateTuningSizeFactor(factor, 1)
roundedCornerResDelegate.tuningSizeFactor = factor
val length = (factor * mContext.resources.displayMetrics.density).toInt()
assertEquals(Size(length, length), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(length, length), roundedCornerResDelegate.bottomRoundedSize)
roundedCornerResDelegate.updateTuningSizeFactor(null, 2)
roundedCornerResDelegate.tuningSizeFactor = null
assertEquals(Size(3, 3), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(4, 4), roundedCornerResDelegate.bottomRoundedSize)