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

Commit f3831dbb authored by Maryam Dehaini's avatar Maryam Dehaini
Browse files

Animate open maximize menu

Animates the following during opening:
1. Menu height to start at .8 and expand to full height.
2. Menu and menu's elements fade in.
3. Use elevation to fade shadows in.
4. Animate menu's element's y position to animate the elements to the
   correct position.
Animation Demo: http://recall/clips/11f1a05f-ccda-4e64-9be2-7bec0a049b67

Bug: 316187209
Test: Manual Testing
Change-Id: Ia45cac30c3203464a6c5315513d812d9af14f63f
parent eea67acf
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -23,7 +23,8 @@
    android:orientation="horizontal"
    android:gravity="center"
    android:padding="16dp"
    android:background="@drawable/desktop_mode_maximize_menu_background">
    android:background="@drawable/desktop_mode_maximize_menu_background"
    android:elevation="1dp">

    <LinearLayout
        android:layout_width="wrap_content"
@@ -37,7 +38,8 @@
            android:background="@drawable/desktop_mode_maximize_menu_layout_background"
            android:padding="4dp"
            android:layout_marginRight="8dp"
            android:layout_marginBottom="4dp">
            android:layout_marginBottom="4dp"
            android:alpha="0">
            <Button
                android:id="@+id/maximize_menu_maximize_button"
                style="?android:attr/buttonBarButtonStyle"
@@ -48,6 +50,7 @@
        </FrameLayout>

        <TextView
            android:id="@+id/maximize_menu_maximize_window_text"
            android:layout_width="94dp"
            android:layout_height="18dp"
            android:textSize="11sp"
@@ -55,7 +58,8 @@
            android:gravity="center"
            android:fontFamily="google-sans-text"
            android:text="@string/desktop_mode_maximize_menu_maximize_text"
            android:textColor="?androidprv:attr/materialColorOnSurface"/>
            android:textColor="?androidprv:attr/materialColorOnSurface"
            android:alpha="0"/>
    </LinearLayout>

    <LinearLayout
@@ -69,7 +73,8 @@
            android:orientation="horizontal"
            android:padding="4dp"
            android:background="@drawable/desktop_mode_maximize_menu_layout_background"
            android:layout_marginBottom="4dp">
            android:layout_marginBottom="4dp"
            android:alpha="0">
            <Button
                android:id="@+id/maximize_menu_snap_left_button"
                style="?android:attr/buttonBarButtonStyle"
@@ -88,6 +93,7 @@
                android:stateListAnimator="@null"/>
        </LinearLayout>
        <TextView
            android:id="@+id/maximize_menu_snap_window_text"
            android:layout_width="94dp"
            android:layout_height="18dp"
            android:textSize="11sp"
@@ -96,6 +102,8 @@
            android:gravity="center"
            android:fontFamily="google-sans-text"
            android:text="@string/desktop_mode_maximize_menu_snap_text"
            android:textColor="?androidprv:attr/materialColorOnSurface"/>
            android:textColor="?androidprv:attr/materialColorOnSurface"
            android:alpha="0"/>
    </LinearLayout>
</LinearLayout>
+3 −0
Original line number Diff line number Diff line
@@ -461,6 +461,9 @@
    <!-- The height of the maximize menu in desktop mode. -->
    <dimen name="desktop_mode_maximize_menu_height">114dp</dimen>

    <!-- The padding of the maximize menu in desktop mode. -->
    <dimen name="desktop_mode_menu_padding">16dp</dimen>

    <!-- The height of the buttons in the maximize menu. -->
    <dimen name="desktop_mode_maximize_menu_button_height">52dp</dimen>

+91 −5
Original line number Diff line number Diff line
@@ -16,6 +16,9 @@

package com.android.wm.shell.windowdecor

import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.annotation.IdRes
import android.app.ActivityManager.RunningTaskInfo
import android.content.Context
@@ -30,16 +33,21 @@ import android.view.SurfaceControlViewHost
import android.view.View.OnClickListener
import android.view.View.OnGenericMotionListener
import android.view.View.OnTouchListener
import android.view.View.SCALE_Y
import android.view.View.TRANSLATION_Y
import android.view.View.TRANSLATION_Z
import android.view.WindowManager
import android.view.WindowlessWindowManager
import android.widget.Button
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
import android.window.TaskConstants
import androidx.core.content.withStyledAttributes
import com.android.internal.R.attr.colorAccentPrimary
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.common.DisplayController
import com.android.wm.shell.common.SyncTransactionQueue
import com.android.wm.shell.windowdecor.WindowDecoration.AdditionalWindow
@@ -65,14 +73,13 @@ class MaximizeMenu(
    private var maximizeMenu: AdditionalWindow? = null
    private lateinit var viewHost: SurfaceControlViewHost
    private lateinit var leash: SurfaceControl
    private val shadowRadius = loadDimensionPixelSize(
            R.dimen.desktop_mode_maximize_menu_shadow_radius
    ).toFloat()
    private val openMenuAnimatorSet = AnimatorSet()
    private val cornerRadius = loadDimensionPixelSize(
            R.dimen.desktop_mode_maximize_menu_corner_radius
    ).toFloat()
    private val menuWidth = loadDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_width)
    private val menuHeight = loadDimensionPixelSize(R.dimen.desktop_mode_maximize_menu_height)
    private val menuPadding = loadDimensionPixelSize(R.dimen.desktop_mode_menu_padding)

    private lateinit var snapRightButton: Button
    private lateinit var snapLeftButton: Button
@@ -91,10 +98,12 @@ class MaximizeMenu(
        if (maximizeMenu != null) return
        createMaximizeMenu()
        setupMaximizeMenu()
        animateOpenMenu()
    }

    /** Closes the maximize window and releases its view. */
    fun close() {
        openMenuAnimatorSet.cancel()
        maximizeMenu?.releaseView()
        maximizeMenu = null
    }
@@ -134,8 +143,6 @@ class MaximizeMenu(
        // Bring menu to front when open
        t.setLayer(leash, TaskConstants.TASK_CHILD_LAYER_FLOATING_MENU)
                .setPosition(leash, menuPosition.x, menuPosition.y)
                .setWindowCrop(leash, menuWidth, menuHeight)
                .setShadowRadius(leash, shadowRadius)
                .setCornerRadius(leash, cornerRadius)
                .show(leash)
        maximizeMenu = AdditionalWindow(leash, viewHost, transactionSupplier)
@@ -146,6 +153,77 @@ class MaximizeMenu(
        }
    }

    private fun animateOpenMenu() {
        val viewHost = maximizeMenu?.mWindowViewHost
        val maximizeMenuView = viewHost?.view ?: return
        val maximizeWindowText = maximizeMenuView.requireViewById<TextView>(
                R.id.maximize_menu_maximize_window_text)
        val snapWindowText = maximizeMenuView.requireViewById<TextView>(
                R.id.maximize_menu_snap_window_text)

        openMenuAnimatorSet.playTogether(
                ObjectAnimator.ofFloat(maximizeMenuView, SCALE_Y, STARTING_MENU_HEIGHT_SCALE, 1f)
                        .apply {
                            duration = MENU_HEIGHT_ANIMATION_DURATION_MS
                            interpolator = EMPHASIZED_DECELERATE
                        },
                ValueAnimator.ofFloat(STARTING_MENU_HEIGHT_SCALE, 1f)
                        .apply {
                            duration = MENU_HEIGHT_ANIMATION_DURATION_MS
                            interpolator = EMPHASIZED_DECELERATE
                            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()
                                maximizeMenuView.setPadding(menuPadding, topPadding,
                                        menuPadding, menuPadding)
                            }
                        },
                ValueAnimator.ofFloat(1 / STARTING_MENU_HEIGHT_SCALE, 1f).apply {
                            duration = MENU_HEIGHT_ANIMATION_DURATION_MS
                            interpolator = EMPHASIZED_DECELERATE
                            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
                                maximizeButtonLayout.scaleY = value
                                snapButtonsLayout.scaleY = value
                                maximizeWindowText.scaleY = value
                                snapWindowText.scaleY = value
                            }
                        },
                ObjectAnimator.ofFloat(maximizeMenuView, TRANSLATION_Y,
                        (STARTING_MENU_HEIGHT_SCALE - 1) * menuHeight, 0f).apply {
                    duration = MENU_HEIGHT_ANIMATION_DURATION_MS
                    interpolator = EMPHASIZED_DECELERATE
                },
                ObjectAnimator.ofInt(maximizeMenuView.background, "alpha",
                        MAX_DRAWABLE_ALPHA_VALUE).apply {
                    duration = ALPHA_ANIMATION_DURATION_MS
                },
                ValueAnimator.ofFloat(0f, 1f)
                        .apply {
                            duration = ALPHA_ANIMATION_DURATION_MS
                            startDelay = CONTROLS_ALPHA_ANIMATION_DELAY_MS
                            addUpdateListener {
                                val value = animatedValue as Float
                                maximizeButtonLayout.alpha = value
                                snapButtonsLayout.alpha = value
                                maximizeWindowText.alpha = value
                                snapWindowText.alpha = value
                            }
                        },
                ObjectAnimator.ofFloat(maximizeMenuView, TRANSLATION_Z, MENU_Z_TRANSLATION)
                        .apply {
                            duration = ELEVATION_ANIMATION_DURATION_MS
                            startDelay = CONTROLS_ALPHA_ANIMATION_DELAY_MS
                        }
        )
        openMenuAnimatorSet.start()
    }

    private fun loadDimensionPixelSize(resourceId: Int): Int {
        return if (resourceId == Resources.ID_NULL) {
            0
@@ -263,6 +341,14 @@ class MaximizeMenu(
    }

    companion object {
        // Open menu animation constants
        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 ELEVATION_ANIMATION_DURATION_MS = 50L
        private const val CONTROLS_ALPHA_ANIMATION_DELAY_MS = 33L
        private const val MENU_Z_TRANSLATION = 1f
        fun isMaximizeMenuView(@IdRes viewId: Int): Boolean {
            return viewId == R.id.maximize_menu ||
                    viewId == R.id.maximize_menu_maximize_button ||