summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jordan Demeulenaere <jdemeulenaere@google.com> 2022-03-04 14:01:59 +0100
committer Jordan Demeulenaere <jdemeulenaere@google.com> 2022-03-07 14:14:30 +0100
commit23653cfd2006577839d7a4c597bb0820fcdbb88c (patch)
tree6efc29d8b57ce4192cb19631578aaa362a7763a0
parentf89f27e0051dac8adbe38ea1be7d51f46588545a (diff)
Find a background to animate when launching a dialog or activity
This CL makes the launch animations a bit more robust by trying to find a background in the View that is expanded into the activity/dialog instead of just taking the View background (that can sometimes be null). See b/222668708#comment1 and #comment2 for before/after videos. Bug: 222668708 Test: Manual Change-Id: I590b6d77a7c9b29a73f37e1f8072643cc8c0bcfa
-rw-r--r--packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt50
1 files changed, 40 insertions, 10 deletions
diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt
index 183584227087..3f7e0f0fb527 100644
--- a/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt
+++ b/packages/SystemUI/animation/src/com/android/systemui/animation/GhostedViewLaunchAnimatorController.kt
@@ -33,6 +33,7 @@ import android.view.ViewGroup
import android.view.ViewGroupOverlay
import android.widget.FrameLayout
import com.android.internal.jank.InteractionJankMonitor
+import java.util.LinkedList
import kotlin.math.min
private const val TAG = "GhostedViewLaunchAnimatorController"
@@ -81,21 +82,51 @@ open class GhostedViewLaunchAnimatorController(
* [backgroundView].
*/
private var backgroundDrawable: WrappedDrawable? = null
- private val backgroundInsets by lazy { getBackground()?.opticalInsets ?: Insets.NONE }
+ private val backgroundInsets by lazy { background?.opticalInsets ?: Insets.NONE }
private var startBackgroundAlpha: Int = 0xFF
private val ghostedViewLocation = IntArray(2)
private val ghostedViewState = LaunchAnimator.State()
/**
- * Return the background of the [ghostedView]. This background will be used to draw the
- * background of the background view that is expanding up to the final animation position. This
- * is called at the start of the animation.
+ * The background of the [ghostedView]. This background will be used to draw the background of
+ * the background view that is expanding up to the final animation position.
*
* Note that during the animation, the alpha value value of this background will be set to 0,
* then set back to its initial value at the end of the animation.
*/
- protected open fun getBackground(): Drawable? = ghostedView.background
+ private val background: Drawable?
+
+ init {
+ /** Find the first view with a background in [view] and its children. */
+ fun findBackground(view: View): Drawable? {
+ if (view.background != null) {
+ return view.background
+ }
+
+ // Perform a BFS to find the largest View with background.
+ val views = LinkedList<View>().apply {
+ add(view)
+ }
+
+ while (views.isNotEmpty()) {
+ val v = views.removeFirst()
+ if (v.background != null) {
+ return v.background
+ }
+
+ if (v is ViewGroup) {
+ for (i in 0 until v.childCount) {
+ views.add(v.getChildAt(i))
+ }
+ }
+ }
+
+ return null
+ }
+
+ background = findBackground(ghostedView)
+ }
/**
* Set the corner radius of [background]. The background is the one that was returned by
@@ -113,7 +144,7 @@ open class GhostedViewLaunchAnimatorController(
/** Return the current top corner radius of the background. */
protected open fun getCurrentTopCornerRadius(): Float {
- val drawable = getBackground() ?: return 0f
+ val drawable = background ?: return 0f
val gradient = findGradientDrawable(drawable) ?: return 0f
// TODO(b/184121838): Support more than symmetric top & bottom radius.
@@ -122,7 +153,7 @@ open class GhostedViewLaunchAnimatorController(
/** Return the current bottom corner radius of the background. */
protected open fun getCurrentBottomCornerRadius(): Float {
- val drawable = getBackground() ?: return 0f
+ val drawable = background ?: return 0f
val gradient = findGradientDrawable(drawable) ?: return 0f
// TODO(b/184121838): Support more than symmetric top & bottom radius.
@@ -162,9 +193,8 @@ open class GhostedViewLaunchAnimatorController(
// We wrap the ghosted view background and use it to draw the expandable background. Its
// alpha will be set to 0 as soon as we start drawing the expanding background.
- val drawable = getBackground()
- startBackgroundAlpha = drawable?.alpha ?: 0xFF
- backgroundDrawable = WrappedDrawable(drawable)
+ startBackgroundAlpha = background?.alpha ?: 0xFF
+ backgroundDrawable = WrappedDrawable(background)
backgroundView?.background = backgroundDrawable
// Create a ghost of the view that will be moving and fading out. This allows to fade out