Revert "Add RippleRevealEffect"
This reverts commit ab7c0fee12d2efa0b5664e17508f340cdc359414.
Change-Id: Icc2f30399a9a1256f4ec9b963056b013c52a0080
diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffect.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffect.kt
deleted file mode 100644
index ffa2b46..0000000
--- a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffect.kt
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.surfaceeffects.revealeffect
-
-import android.animation.Animator
-import android.animation.AnimatorListenerAdapter
-import android.animation.ValueAnimator
-import android.graphics.RenderEffect
-import androidx.core.graphics.ColorUtils
-import com.android.systemui.surfaceeffects.RenderEffectDrawCallback
-import com.android.systemui.surfaceeffects.utils.MathUtils
-import kotlin.math.max
-import kotlin.math.min
-
-/** Creates a reveal effect with a circular ripple sparkles on top. */
-class RippleRevealEffect(
- private val config: RippleRevealEffectConfig,
- private val renderEffectCallback: RenderEffectDrawCallback,
- private val stateChangedCallback: AnimationStateChangedCallback? = null
-) {
- private val rippleRevealShader = RippleRevealShader().apply { applyConfig(config) }
- private val animator: ValueAnimator = ValueAnimator.ofFloat(0f, 1f)
-
- fun play() {
- if (animator.isRunning) {
- return
- }
-
- animator.duration = config.duration.toLong()
- animator.addUpdateListener { updateListener ->
- val playTime = updateListener.currentPlayTime.toFloat()
- rippleRevealShader.setTime(playTime * TIME_SCALE_FACTOR)
-
- // Compute radius.
- val progress = updateListener.animatedValue as Float
- val innerRad = MathUtils.lerp(config.innerRadiusStart, config.innerRadiusEnd, progress)
- val outerRad = MathUtils.lerp(config.outerRadiusStart, config.outerRadiusEnd, progress)
- rippleRevealShader.setInnerRadius(innerRad)
- rippleRevealShader.setOuterRadius(outerRad)
-
- // Compute alphas.
- val innerAlphaProgress =
- MathUtils.constrainedMap(
- 1f,
- 0f,
- config.innerFadeOutStart,
- config.duration,
- playTime
- )
- val outerAlphaProgress =
- MathUtils.constrainedMap(
- 1f,
- 0f,
- config.outerFadeOutStart,
- config.duration,
- playTime
- )
- val innerAlpha = MathUtils.lerp(0f, 255f, innerAlphaProgress)
- val outerAlpha = MathUtils.lerp(0f, 255f, outerAlphaProgress)
-
- val innerColor = ColorUtils.setAlphaComponent(config.innerColor, innerAlpha.toInt())
- val outerColor = ColorUtils.setAlphaComponent(config.outerColor, outerAlpha.toInt())
- rippleRevealShader.setInnerColor(innerColor)
- rippleRevealShader.setOuterColor(outerColor)
-
- // Pass in progresses since those functions take in normalized alpha values.
- rippleRevealShader.setBackgroundAlpha(max(innerAlphaProgress, outerAlphaProgress))
- rippleRevealShader.setSparkleAlpha(min(innerAlphaProgress, outerAlphaProgress))
-
- // Trigger draw callback.
- renderEffectCallback.onDraw(
- RenderEffect.createRuntimeShaderEffect(
- rippleRevealShader,
- RippleRevealShader.BACKGROUND_UNIFORM
- )
- )
- }
- animator.addListener(
- object : AnimatorListenerAdapter() {
- override fun onAnimationEnd(animation: Animator) {
- stateChangedCallback?.onAnimationEnd()
- }
- }
- )
- animator.start()
- stateChangedCallback?.onAnimationStart()
- }
-
- interface AnimationStateChangedCallback {
- fun onAnimationStart()
- fun onAnimationEnd()
- }
-
- private companion object {
- private const val TIME_SCALE_FACTOR = 0.00175f
- }
-}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffectConfig.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffectConfig.kt
deleted file mode 100644
index 9675f19..0000000
--- a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffectConfig.kt
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.surfaceeffects.revealeffect
-
-import android.graphics.Color
-
-/** Defines parameters needed for [RippleRevealEffect]. */
-data class RippleRevealEffectConfig(
- /** Total duration of the animation. */
- val duration: Float = 0f,
- /** Timestamp of when the inner mask starts fade out. (Linear fadeout) */
- val innerFadeOutStart: Float = 0f,
- /** Timestamp of when the outer mask starts fade out. (Linear fadeout) */
- val outerFadeOutStart: Float = 0f,
- /** Center x position of the effect. */
- val centerX: Float = 0f,
- /** Center y position of the effect. */
- val centerY: Float = 0f,
- /** Start radius of the inner circle. */
- val innerRadiusStart: Float = 0f,
- /** End radius of the inner circle. */
- val innerRadiusEnd: Float = 0f,
- /** Start radius of the outer circle. */
- val outerRadiusStart: Float = 0f,
- /** End radius of the outer circle. */
- val outerRadiusEnd: Float = 0f,
- /**
- * Pixel density of the display. Do not pass a random value. The value must come from
- * [context.resources.displayMetrics.density].
- */
- val pixelDensity: Float = 1f,
- /**
- * The amount the circle masks should be softened. Higher value will make the edge of the circle
- * mask soft.
- */
- val blurAmount: Float = 0f,
- /** Color of the inner circle mask. */
- val innerColor: Int = Color.WHITE,
- /** Color of the outer circle mask. */
- val outerColor: Int = Color.WHITE,
- /** Multiplier to make the sparkles visible. */
- val sparkleStrength: Float = SPARKLE_STRENGTH,
- /** Size of the sparkle. Expected range [0, 1]. */
- val sparkleScale: Float = SPARKLE_SCALE
-) {
- /** Default parameters. */
- companion object {
- const val SPARKLE_STRENGTH: Float = 0.3f
- const val SPARKLE_SCALE: Float = 0.8f
- }
-}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealShader.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealShader.kt
deleted file mode 100644
index a3f9795..0000000
--- a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealShader.kt
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.surfaceeffects.revealeffect
-
-import android.graphics.RuntimeShader
-import com.android.systemui.surfaceeffects.shaderutil.SdfShaderLibrary
-import com.android.systemui.surfaceeffects.shaderutil.ShaderUtilLibrary
-
-/** Circular reveal effect with sparkles. */
-class RippleRevealShader : RuntimeShader(SHADER) {
- // language=AGSL
- companion object {
- const val BACKGROUND_UNIFORM = "in_dst"
- private const val MAIN =
- """
- uniform shader ${BACKGROUND_UNIFORM};
- uniform half in_dstAlpha;
- uniform half in_time;
- uniform vec2 in_center;
- uniform half in_innerRadius;
- uniform half in_outerRadius;
- uniform half in_sparkleStrength;
- uniform half in_blur;
- uniform half in_pixelDensity;
- uniform half in_sparkleScale;
- uniform half in_sparkleAlpha;
- layout(color) uniform vec4 in_innerColor;
- layout(color) uniform vec4 in_outerColor;
-
- vec4 main(vec2 p) {
- half innerMask = soften(sdCircle(p - in_center, in_innerRadius), in_blur);
- half outerMask = soften(sdCircle(p - in_center, in_outerRadius), in_blur);
-
- // Flip it since we are interested in the circle.
- innerMask = 1.-innerMask;
- outerMask = 1.-outerMask;
-
- // Color two circles using the mask.
- vec4 inColor = vec4(in_innerColor.rgb, 1.) * in_innerColor.a;
- vec4 outColor = vec4(in_outerColor.rgb, 1.) * in_outerColor.a;
- vec4 blend = mix(inColor, outColor, innerMask);
-
- vec4 dst = vec4(in_dst.eval(p).rgb, 1.);
- dst *= in_dstAlpha;
-
- blend *= blend.a;
- // Do normal blend with the background.
- blend = blend + dst * (1. - blend.a);
-
- half sparkle =
- sparkles(p - mod(p, in_pixelDensity * in_sparkleScale), in_time);
- // Add sparkles using additive blending.
- blend += sparkle * in_sparkleStrength * in_sparkleAlpha;
-
- // Mask everything at the end.
- blend *= outerMask;
-
- return blend;
- }
- """
-
- private const val SHADER =
- ShaderUtilLibrary.SHADER_LIB +
- SdfShaderLibrary.SHADER_SDF_OPERATION_LIB +
- SdfShaderLibrary.CIRCLE_SDF +
- MAIN
- }
-
- fun applyConfig(config: RippleRevealEffectConfig) {
- setCenter(config.centerX, config.centerY)
- setInnerRadius(config.innerRadiusStart)
- setOuterRadius(config.outerRadiusStart)
- setBlurAmount(config.blurAmount)
- setPixelDensity(config.pixelDensity)
- setSparkleScale(config.sparkleScale)
- setSparkleStrength(config.sparkleStrength)
- setInnerColor(config.innerColor)
- setOuterColor(config.outerColor)
- }
-
- fun setTime(time: Float) {
- setFloatUniform("in_time", time)
- }
-
- fun setCenter(centerX: Float, centerY: Float) {
- setFloatUniform("in_center", centerX, centerY)
- }
-
- fun setInnerRadius(radius: Float) {
- setFloatUniform("in_innerRadius", radius)
- }
-
- fun setOuterRadius(radius: Float) {
- setFloatUniform("in_outerRadius", radius)
- }
-
- fun setBlurAmount(blurAmount: Float) {
- setFloatUniform("in_blur", blurAmount)
- }
-
- fun setPixelDensity(density: Float) {
- setFloatUniform("in_pixelDensity", density)
- }
-
- fun setSparkleScale(scale: Float) {
- setFloatUniform("in_sparkleScale", scale)
- }
-
- fun setSparkleStrength(strength: Float) {
- setFloatUniform("in_sparkleStrength", strength)
- }
-
- fun setInnerColor(color: Int) {
- setColorUniform("in_innerColor", color)
- }
-
- fun setOuterColor(color: Int) {
- setColorUniform("in_outerColor", color)
- }
-
- /** Sets the background alpha. Range [0,1]. */
- fun setBackgroundAlpha(alpha: Float) {
- setFloatUniform("in_dstAlpha", alpha)
- }
-
- /** Sets the sparkle alpha. Range [0,1]. */
- fun setSparkleAlpha(alpha: Float) {
- setFloatUniform("in_sparkleAlpha", alpha)
- }
-}
diff --git a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/utils/MathUtils.kt b/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/utils/MathUtils.kt
deleted file mode 100644
index 1411c32..0000000
--- a/packages/SystemUI/animation/src/com/android/systemui/surfaceeffects/utils/MathUtils.kt
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.surfaceeffects.utils
-
-/** Copied from android.utils.MathUtils */
-object MathUtils {
- fun constrainedMap(
- rangeMin: Float,
- rangeMax: Float,
- valueMin: Float,
- valueMax: Float,
- value: Float
- ): Float {
- return lerp(rangeMin, rangeMax, lerpInvSat(valueMin, valueMax, value))
- }
-
- fun lerp(start: Float, stop: Float, amount: Float): Float {
- return start + (stop - start) * amount
- }
-
- fun lerpInv(a: Float, b: Float, value: Float): Float {
- return if (a != b) (value - a) / (b - a) else 0.0f
- }
-
- fun saturate(value: Float): Float {
- return constrain(value, 0.0f, 1.0f)
- }
-
- fun lerpInvSat(a: Float, b: Float, value: Float): Float {
- return saturate(lerpInv(a, b, value))
- }
-
- fun constrain(amount: Float, low: Float, high: Float): Float {
- return if (amount < low) low else if (amount > high) high else amount
- }
-}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffectTest.kt b/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffectTest.kt
deleted file mode 100644
index b1df159..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/surfaceeffects/revealeffect/RippleRevealEffectTest.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.surfaceeffects.revealeffect
-
-import android.graphics.RenderEffect
-import android.testing.AndroidTestingRunner
-import android.testing.TestableLooper
-import androidx.test.filters.SmallTest
-import com.android.systemui.animation.AnimatorTestRule
-import com.android.systemui.model.SysUiStateTest
-import com.android.systemui.surfaceeffects.RenderEffectDrawCallback
-import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@SmallTest
-@RunWith(AndroidTestingRunner::class)
-@TestableLooper.RunWithLooper(setAsMainLooper = true)
-class RippleRevealEffectTest : SysUiStateTest() {
-
- @get:Rule val animatorTestRule = AnimatorTestRule(this)
-
- @Test
- fun play_triggersDrawCallback() {
- var effectFromCallback: RenderEffect? = null
- val revealEffectConfig = RippleRevealEffectConfig(duration = 1000f)
- val drawCallback =
- object : RenderEffectDrawCallback {
- override fun onDraw(renderEffect: RenderEffect) {
- effectFromCallback = renderEffect
- }
- }
- val revealEffect = RippleRevealEffect(revealEffectConfig, drawCallback)
- assertThat(effectFromCallback).isNull()
-
- revealEffect.play()
-
- animatorTestRule.advanceTimeBy(500L)
-
- assertThat(effectFromCallback).isNotNull()
- }
-
- @Test
- fun play_triggersStateChangedCallback() {
- val revealEffectConfig = RippleRevealEffectConfig(duration = 1000f)
- val drawCallback =
- object : RenderEffectDrawCallback {
- override fun onDraw(renderEffect: RenderEffect) {}
- }
- var animationStartedCalled = false
- var animationEndedCalled = false
- val stateChangedCallback =
- object : RippleRevealEffect.AnimationStateChangedCallback {
- override fun onAnimationStart() {
- animationStartedCalled = true
- }
-
- override fun onAnimationEnd() {
- animationEndedCalled = true
- }
- }
- val revealEffect =
- RippleRevealEffect(revealEffectConfig, drawCallback, stateChangedCallback)
-
- assertThat(animationStartedCalled).isFalse()
- assertThat(animationEndedCalled).isFalse()
-
- revealEffect.play()
-
- assertThat(animationStartedCalled).isTrue()
-
- animatorTestRule.advanceTimeBy(revealEffectConfig.duration.toLong())
-
- assertThat(animationEndedCalled).isTrue()
- }
-}