summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-12-13 15:23:43 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2024-12-13 15:23:43 -0800
commit2b6085d6581d8c15388869b2eeeba600a89afbf0 (patch)
treeea24bf7771f9be311f6ab5dcb46e408a5268491a
parent8d7d869dc31a0e6d1085cca007e787d185a6b485 (diff)
parent329bba57e431017d9492b4d6d53c99ff7248e4b4 (diff)
Merge "Rewrite scrim clip modifier" into main
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/NotificationScrimClip.kt97
1 files changed, 32 insertions, 65 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/NotificationScrimClip.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/NotificationScrimClip.kt
index c912bd59c19f..790793eab258 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/NotificationScrimClip.kt
+++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/ui/NotificationScrimClip.kt
@@ -17,14 +17,16 @@
package com.android.systemui.qs.composefragment.ui
import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.drawWithCache
+import androidx.compose.ui.geometry.CornerRadius
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.BlendMode
import androidx.compose.ui.graphics.ClipOp
-import androidx.compose.ui.graphics.Path
-import androidx.compose.ui.graphics.asAndroidPath
-import androidx.compose.ui.graphics.drawscope.ContentDrawScope
-import androidx.compose.ui.graphics.drawscope.clipPath
-import androidx.compose.ui.node.DrawModifierNode
-import androidx.compose.ui.node.ModifierNodeElement
-import androidx.compose.ui.platform.InspectorInfo
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.clipRect
+import androidx.compose.ui.graphics.layer.CompositingStrategy
+import androidx.compose.ui.graphics.layer.drawLayer
/**
* Clipping modifier for clipping out the notification scrim as it slides over QS. It will clip out
@@ -32,65 +34,30 @@ import androidx.compose.ui.platform.InspectorInfo
* from the QS container.
*/
fun Modifier.notificationScrimClip(clipParams: () -> NotificationScrimClipParams): Modifier {
- return this then NotificationScrimClipElement(clipParams)
-}
-
-private class NotificationScrimClipNode(var clipParams: () -> NotificationScrimClipParams) :
- DrawModifierNode, Modifier.Node() {
- private val path = Path()
-
- private var lastClipParams = NotificationScrimClipParams()
-
- override fun ContentDrawScope.draw() {
- val newClipParams = clipParams()
- if (newClipParams != lastClipParams) {
- lastClipParams = newClipParams
- applyClipParams(path, lastClipParams)
- }
- clipPath(path, ClipOp.Difference) { this@draw.drawContent() }
- }
-
- private fun ContentDrawScope.applyClipParams(
- path: Path,
- clipParams: NotificationScrimClipParams,
- ) {
- with(clipParams) {
- path.rewind()
- path
- .asAndroidPath()
- .addRoundRect(
- -leftInset.toFloat(),
- top.toFloat(),
- size.width + rightInset,
- bottom.toFloat(),
- radius.toFloat(),
- radius.toFloat(),
- android.graphics.Path.Direction.CW,
- )
- }
- }
-}
-
-private data class NotificationScrimClipElement(val clipParams: () -> NotificationScrimClipParams) :
- ModifierNodeElement<NotificationScrimClipNode>() {
- override fun create(): NotificationScrimClipNode {
- return NotificationScrimClipNode(clipParams)
- }
-
- override fun update(node: NotificationScrimClipNode) {
- node.clipParams = clipParams
- }
-
- override fun InspectorInfo.inspectableProperties() {
- name = "notificationScrimClip"
- with(clipParams()) {
- properties["leftInset"] = leftInset
- properties["top"] = top
- properties["rightInset"] = rightInset
- properties["bottom"] = bottom
- properties["radius"] = radius
+ return this.drawWithCache {
+ val params = clipParams()
+ val left = -params.leftInset.toFloat()
+ val right = size.width + params.rightInset.toFloat()
+ val top = params.top.toFloat()
+ val bottom = params.bottom.toFloat()
+ val graphicsLayer = obtainGraphicsLayer()
+ graphicsLayer.compositingStrategy = CompositingStrategy.Offscreen
+ graphicsLayer.record {
+ drawContent()
+ clipRect {
+ drawRoundRect(
+ color = Color.Black,
+ cornerRadius = CornerRadius(params.radius.toFloat()),
+ blendMode = BlendMode.Clear,
+ topLeft = Offset(left, top),
+ size = Size(right - left, bottom - top),
+ )
+ }
+ }
+ onDrawWithContent {
+ drawLayer(graphicsLayer)
+ }
}
- }
}
/** Params for [notificationScrimClip]. */