summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Evan Laird <evanlaird@google.com> 2023-06-20 15:09:03 -0400
committer Evan Laird <evanlaird@google.com> 2023-06-28 10:48:21 -0400
commit7128c6aa8541f93099a7359347b5a8aaae1fe5e0 (patch)
tree649a639e420cd9b5e7eda8fd49d9d34550ebea39
parent9270125958b2c92f5179df04e2c55801d6b5852e (diff)
[Decor] Support ScreenDecorCommand in ScreenDecorations
This CL ties together the debug support added earlier to the ScreenDecorCommand that now exists. It also makes the following changes: 1. Allow for nullable top/bottom rounded drawables in the ScreenDecorHwcLayer 2. Make ScreenDecorHwcLayer support dynamic color Test: manual Test: existing screendecor and command line tests Bug: 285941724 Change-Id: I945e5086735b78718fbe388e5567c5f312834ae2
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt32
-rw-r--r--packages/SystemUI/src/com/android/systemui/ScreenDecorations.java40
-rw-r--r--packages/SystemUI/src/com/android/systemui/decor/DebugRoundedCornerDelegate.kt30
3 files changed, 89 insertions, 13 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt b/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt
index 670c1fa45e5c..c46558532372 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorHwcLayer.kt
@@ -56,9 +56,14 @@ class ScreenDecorHwcLayer(
) : DisplayCutoutBaseView(context) {
val colorMode: Int
private val useInvertedAlphaColor: Boolean
- private val color: Int
+ private var color: Int = Color.BLACK
+ set(value) {
+ field = value
+ paint.color = value
+ }
+
private val bgColor: Int
- private val cornerFilter: ColorFilter
+ private var cornerFilter: ColorFilter
private val cornerBgFilter: ColorFilter
private val clearPaint: Paint
@JvmField val transparentRect: Rect = Rect()
@@ -109,10 +114,16 @@ class ScreenDecorHwcLayer(
override fun onAttachedToWindow() {
super.onAttachedToWindow()
parent.requestTransparentRegion(this)
+ updateColors()
+ }
+
+ private fun updateColors() {
if (!debug) {
viewRootImpl.setDisplayDecoration(true)
}
+ cornerFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN)
+
if (useInvertedAlphaColor) {
paint.set(clearPaint)
} else {
@@ -121,6 +132,21 @@ class ScreenDecorHwcLayer(
}
}
+ fun setDebugColor(color: Int) {
+ if (!debug) {
+ return
+ }
+
+ if (this.color == color) {
+ return
+ }
+
+ this.color = color
+
+ updateColors()
+ invalidate()
+ }
+
override fun onUpdate() {
parent.requestTransparentRegion(this)
}
@@ -367,7 +393,7 @@ class ScreenDecorHwcLayer(
/**
* Update the rounded corner drawables.
*/
- fun updateRoundedCornerDrawable(top: Drawable, bottom: Drawable) {
+ fun updateRoundedCornerDrawable(top: Drawable?, bottom: Drawable?) {
roundedCornerDrawableTop = top
roundedCornerDrawableBottom = bottom
updateRoundedCornerDrawableBounds()
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 31e792cae39b..a03e4b15f9b7 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -72,6 +72,7 @@ import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.decor.CutoutDecorProviderFactory;
import com.android.systemui.decor.DebugRoundedCornerDelegate;
+import com.android.systemui.decor.DebugRoundedCornerModel;
import com.android.systemui.decor.DecorProvider;
import com.android.systemui.decor.DecorProviderFactory;
import com.android.systemui.decor.DecorProviderKt;
@@ -356,7 +357,42 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
};
private final ScreenDecorCommand.Callback mScreenDecorCommandCallback = (cmd, pw) -> {
- android.util.Log.d(TAG, cmd.toString());
+ // If we are exiting debug mode, we can set it (false) and bail, otherwise we will
+ // ensure that debug mode is set
+ if (cmd.getDebug() != null && !cmd.getDebug()) {
+ setDebug(false);
+ return;
+ } else {
+ // setDebug is idempotent
+ setDebug(true);
+ }
+
+ if (cmd.getColor() != null) {
+ mDebugColor = cmd.getColor();
+ mExecutor.execute(() -> {
+ if (mScreenDecorHwcLayer != null) {
+ mScreenDecorHwcLayer.setDebugColor(cmd.getColor());
+ }
+ updateColorInversionDefault();
+ });
+ }
+
+ DebugRoundedCornerModel roundedTop = null;
+ DebugRoundedCornerModel roundedBottom = null;
+ if (cmd.getRoundedTop() != null) {
+ roundedTop = cmd.getRoundedTop().toRoundedCornerDebugModel();
+ }
+ if (cmd.getRoundedBottom() != null) {
+ roundedBottom = cmd.getRoundedBottom().toRoundedCornerDebugModel();
+ }
+ if (roundedTop != null || roundedBottom != null) {
+ mDebugRoundedCornerDelegate.applyNewDebugCorners(roundedTop, roundedBottom);
+ mExecutor.execute(() -> {
+ removeAllOverlays();
+ removeHwcOverlay();
+ setupDecorations();
+ });
+ }
};
@Override
@@ -1239,7 +1275,7 @@ public class ScreenDecorations implements CoreStartable, Dumpable {
bottomDrawable = mDebugRoundedCornerDelegate.getBottomRoundedDrawable();
}
- if (topDrawable == null || bottomDrawable == null) {
+ if (topDrawable == null && bottomDrawable == null) {
return;
}
mScreenDecorHwcLayer.updateRoundedCornerDrawable(topDrawable, bottomDrawable);
diff --git a/packages/SystemUI/src/com/android/systemui/decor/DebugRoundedCornerDelegate.kt b/packages/SystemUI/src/com/android/systemui/decor/DebugRoundedCornerDelegate.kt
index 4069bc7d73d0..557168731b23 100644
--- a/packages/SystemUI/src/com/android/systemui/decor/DebugRoundedCornerDelegate.kt
+++ b/packages/SystemUI/src/com/android/systemui/decor/DebugRoundedCornerDelegate.kt
@@ -77,16 +77,30 @@ class DebugRoundedCornerDelegate : RoundedCornerResDelegate {
}
fun applyNewDebugCorners(
- topCorner: DebugRoundedCornerModel,
- bottomCorner: DebugRoundedCornerModel,
+ topCorner: DebugRoundedCornerModel?,
+ bottomCorner: DebugRoundedCornerModel?,
) {
- hasTop = true
- topRoundedDrawable = topCorner.toPathDrawable(paint)
- topRoundedSize = topCorner.size()
+ topCorner?.let {
+ hasTop = true
+ topRoundedDrawable = it.toPathDrawable(paint)
+ topRoundedSize = it.size()
+ }
+ ?: {
+ hasTop = false
+ topRoundedDrawable = null
+ topRoundedSize = Size(0, 0)
+ }
- hasBottom = true
- bottomRoundedDrawable = bottomCorner.toPathDrawable(paint)
- bottomRoundedSize = bottomCorner.size()
+ bottomCorner?.let {
+ hasBottom = true
+ bottomRoundedDrawable = it.toPathDrawable(paint)
+ bottomRoundedSize = it.size()
+ }
+ ?: {
+ hasBottom = false
+ bottomRoundedDrawable = null
+ bottomRoundedSize = Size(0, 0)
+ }
}
/**