summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt114
1 files changed, 97 insertions, 17 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
index 54b33e931830..095d33736595 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt
@@ -60,6 +60,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
@@ -120,8 +121,9 @@ class MaximizeMenu(
/** Closes the maximize window and releases its view. */
fun close() {
- maximizeMenuView?.cancelAnimation()
- maximizeMenu?.releaseView()
+ maximizeMenuView?.animateCloseMenu {
+ maximizeMenu?.releaseView()
+ }
maximizeMenu = null
maximizeMenuView = null
}
@@ -255,7 +257,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
@@ -346,15 +348,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
@@ -367,7 +370,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
@@ -381,7 +384,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",
@@ -391,7 +394,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
@@ -403,21 +406,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
}
)
- openMenuAnimatorSet.addListener(
+ menuAnimatorSet?.addListener(
onEnd = {
maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
}
)
- openMenuAnimatorSet.start()
+ 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
+ }
+ )
+ menuAnimatorSet?.addListener(
+ onEnd = {
+ maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
+ onEnd?.invoke()
+ }
+ )
+ 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. */
@@ -645,9 +723,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
}
}