Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 03eac16d authored by Maryam Dehaini's avatar Maryam Dehaini
Browse files

Add animation for closing maximize window

Animation Recording: http://recall/-/eGdpGnUt88r9C5smXKbq4a/gTSp3a9UNK6WEzC1sIS1Nu
Spec: https://www.figma.com/design/flC1tPqknJnIVa8m5fhUQv/App-Headers-%26-Menus-(V)?node-id=5791-138691&t=L66oyXPlyre3h5XN-0
Bug: 316187209
Test: Open/close maximize menu
Flag: EXEMPT small change

Change-Id: I9c0d84c0ec34acb98ee3c44e0d5f146ef8feb4bc
parent df7e8839
Loading
Loading
Loading
Loading
+97 −17
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@ import androidx.core.animation.addListener
import com.android.wm.shell.R
import com.android.wm.shell.RootTaskDisplayAreaOrganizer
import com.android.wm.shell.animation.Interpolators.EMPHASIZED_DECELERATE
import com.android.wm.shell.animation.Interpolators.FAST_OUT_LINEAR_IN
import com.android.wm.shell.common.DisplayController
import com.android.wm.shell.common.SyncTransactionQueue
import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer
@@ -118,8 +119,9 @@ class MaximizeMenu(

    /** Closes the maximize window and releases its view. */
    fun close() {
        maximizeMenuView?.cancelAnimation()
        maximizeMenuView?.animateCloseMenu {
            maximizeMenu?.releaseView()
        }
        maximizeMenu = null
        maximizeMenuView = null
    }
@@ -256,7 +258,7 @@ class MaximizeMenu(
            .getDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_buttons_fill_radius)

        private val hoverTempRect = Rect()
        private val openMenuAnimatorSet = AnimatorSet()
        private var menuAnimatorSet: AnimatorSet? = null
        private lateinit var taskInfo: RunningTaskInfo
        private lateinit var style: MenuStyle

@@ -338,15 +340,16 @@ class MaximizeMenu(
        fun animateOpenMenu() {
            maximizeButton.setLayerType(View.LAYER_TYPE_HARDWARE, null)
            maximizeText.setLayerType(View.LAYER_TYPE_HARDWARE, null)
            openMenuAnimatorSet.playTogether(
            menuAnimatorSet = AnimatorSet()
            menuAnimatorSet?.playTogether(
                ObjectAnimator.ofFloat(rootView, SCALE_Y, STARTING_MENU_HEIGHT_SCALE, 1f)
                    .apply {
                        duration = MENU_HEIGHT_ANIMATION_DURATION_MS
                        duration = OPEN_MENU_HEIGHT_ANIMATION_DURATION_MS
                        interpolator = EMPHASIZED_DECELERATE
                    },
                ValueAnimator.ofFloat(STARTING_MENU_HEIGHT_SCALE, 1f)
                    .apply {
                        duration = MENU_HEIGHT_ANIMATION_DURATION_MS
                        duration = OPEN_MENU_HEIGHT_ANIMATION_DURATION_MS
                        interpolator = EMPHASIZED_DECELERATE
                        addUpdateListener {
                            // Animate padding so that controls stay pinned to the bottom of
@@ -359,7 +362,7 @@ class MaximizeMenu(
                        }
                    },
                ValueAnimator.ofFloat(1 / STARTING_MENU_HEIGHT_SCALE, 1f).apply {
                    duration = MENU_HEIGHT_ANIMATION_DURATION_MS
                    duration = OPEN_MENU_HEIGHT_ANIMATION_DURATION_MS
                    interpolator = EMPHASIZED_DECELERATE
                    addUpdateListener {
                        // Scale up the children of the maximize menu so that the menu
@@ -373,7 +376,7 @@ class MaximizeMenu(
                },
                ObjectAnimator.ofFloat(rootView, TRANSLATION_Y,
                    (STARTING_MENU_HEIGHT_SCALE - 1) * menuHeight, 0f).apply {
                    duration = MENU_HEIGHT_ANIMATION_DURATION_MS
                    duration = OPEN_MENU_HEIGHT_ANIMATION_DURATION_MS
                    interpolator = EMPHASIZED_DECELERATE
                },
                ObjectAnimator.ofInt(rootView.background, "alpha",
@@ -383,7 +386,7 @@ class MaximizeMenu(
                ValueAnimator.ofFloat(0f, 1f)
                    .apply {
                        duration = ALPHA_ANIMATION_DURATION_MS
                        startDelay = CONTROLS_ALPHA_ANIMATION_DELAY_MS
                        startDelay = CONTROLS_ALPHA_OPEN_MENU_ANIMATION_DELAY_MS
                        addUpdateListener {
                            val value = animatedValue as Float
                            maximizeButton.alpha = value
@@ -395,21 +398,96 @@ class MaximizeMenu(
                ObjectAnimator.ofFloat(rootView, TRANSLATION_Z, MENU_Z_TRANSLATION)
                    .apply {
                        duration = ELEVATION_ANIMATION_DURATION_MS
                        startDelay = CONTROLS_ALPHA_ANIMATION_DELAY_MS
                        startDelay = CONTROLS_ALPHA_OPEN_MENU_ANIMATION_DELAY_MS
                    }
            )
            menuAnimatorSet?.addListener(
                onEnd = {
                    maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
                    maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
                }
            )
            menuAnimatorSet?.start()
        }

        /** Animate the closing of the menu */
        fun animateCloseMenu(onEnd: (() -> Unit)) {
            maximizeButton.setLayerType(View.LAYER_TYPE_HARDWARE, null)
            maximizeText.setLayerType(View.LAYER_TYPE_HARDWARE, null)
            cancelAnimation()
            menuAnimatorSet = AnimatorSet()
            menuAnimatorSet?.playTogether(
                    ObjectAnimator.ofFloat(rootView, SCALE_Y, 1f, STARTING_MENU_HEIGHT_SCALE)
                            .apply {
                                duration = CLOSE_MENU_HEIGHT_ANIMATION_DURATION_MS
                                interpolator = FAST_OUT_LINEAR_IN
                            },
                    ValueAnimator.ofFloat(1f, STARTING_MENU_HEIGHT_SCALE)
                            .apply {
                                duration = CLOSE_MENU_HEIGHT_ANIMATION_DURATION_MS
                                interpolator = FAST_OUT_LINEAR_IN
                                addUpdateListener {
                                    // Animate padding so that controls stay pinned to the bottom of
                                    // the menu.
                                    val value = animatedValue as Float
                                    val topPadding = menuPadding -
                                            ((1 - value) * menuHeight).toInt()
                                    container.setPadding(menuPadding, topPadding,
                                            menuPadding, menuPadding)
                                }
                            },
                    ValueAnimator.ofFloat(1f, 1 / STARTING_MENU_HEIGHT_SCALE).apply {
                        duration = CLOSE_MENU_HEIGHT_ANIMATION_DURATION_MS
                        interpolator = FAST_OUT_LINEAR_IN
                        addUpdateListener {
                            // Scale up the children of the maximize menu so that the menu
                            // scale is cancelled out and only the background is scaled.
                            val value = animatedValue as Float
                            maximizeButton.scaleY = value
                            snapButtonsLayout.scaleY = value
                            maximizeText.scaleY = value
                            snapWindowText.scaleY = value
                        }
                    },
                    ObjectAnimator.ofFloat(rootView, TRANSLATION_Y,
                            0f, (STARTING_MENU_HEIGHT_SCALE - 1) * menuHeight).apply {
                        duration = CLOSE_MENU_HEIGHT_ANIMATION_DURATION_MS
                        interpolator = FAST_OUT_LINEAR_IN
                    },
                    ObjectAnimator.ofInt(rootView.background, "alpha",
                            MAX_DRAWABLE_ALPHA_VALUE, 0).apply {
                        startDelay = CONTAINER_ALPHA_CLOSE_MENU_ANIMATION_DELAY_MS
                        duration = ALPHA_ANIMATION_DURATION_MS
                    },
                    ValueAnimator.ofFloat(1f, 0f)
                            .apply {
                                duration = ALPHA_ANIMATION_DURATION_MS
                                addUpdateListener {
                                    val value = animatedValue as Float
                                    maximizeButton.alpha = value
                                    snapButtonsLayout.alpha = value
                                    maximizeText.alpha = value
                                    snapWindowText.alpha = value
                                }
                            },
                    ObjectAnimator.ofFloat(rootView, TRANSLATION_Z, MENU_Z_TRANSLATION, 0f)
                            .apply {
                                duration = ELEVATION_ANIMATION_DURATION_MS
                            }
            )
            openMenuAnimatorSet.addListener(
            menuAnimatorSet?.addListener(
                    onEnd = {
                        maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
                        maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
                        onEnd?.invoke()
                    }
            )
            openMenuAnimatorSet.start()
            menuAnimatorSet?.start()
        }

        /** Cancel the open menu animation. */
        fun cancelAnimation() {
            openMenuAnimatorSet.cancel()
        /** Cancel the menu animation. */
        private fun cancelAnimation() {
            menuAnimatorSet?.cancel()
        }

        /** Update the view state to a new snap to half selection. */
@@ -637,9 +715,11 @@ class MaximizeMenu(
        private const val ALPHA_ANIMATION_DURATION_MS = 50L
        private const val MAX_DRAWABLE_ALPHA_VALUE = 255
        private const val STARTING_MENU_HEIGHT_SCALE = 0.8f
        private const val MENU_HEIGHT_ANIMATION_DURATION_MS = 300L
        private const val OPEN_MENU_HEIGHT_ANIMATION_DURATION_MS = 300L
        private const val CLOSE_MENU_HEIGHT_ANIMATION_DURATION_MS = 200L
        private const val ELEVATION_ANIMATION_DURATION_MS = 50L
        private const val CONTROLS_ALPHA_ANIMATION_DELAY_MS = 33L
        private const val CONTROLS_ALPHA_OPEN_MENU_ANIMATION_DELAY_MS = 33L
        private const val CONTAINER_ALPHA_CLOSE_MENU_ANIMATION_DELAY_MS = 33L
        private const val MENU_Z_TRANSLATION = 1f
    }
}