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

Commit 458bdffa authored by Bartosz Chomiński's avatar Bartosz Chomiński Committed by Android (Google) Code Review
Browse files

Merge "Change hover/press animation method of caption handle" into main

parents cad2b831 61f3fb61
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -447,6 +447,17 @@
        80 dp for handle + 20 dp for room to grow on the sides when hovered. -->
    <dimen name="desktop_mode_fullscreen_decor_caption_width">100dp</dimen>

    <!-- Horizontal padding for desktop mode caption in default unhovered untouched state. -->
    <dimen name="desktop_mode_fullscreen_decor_caption_horizontal_padding_default">10dp</dimen>

    <!-- Horizontal padding for desktop mode caption when hovered.
        1/2 * (100 dp of total width - 80 dp for handle * 1.2 scaling factor). -->
    <dimen name="desktop_mode_fullscreen_decor_caption_horizontal_padding_hovered">2dp</dimen>

    <!-- Horizontal padding for desktop mode caption when touched.
        1/2 * (100 dp of total width - 80 dp for handle * 0.85 scaling factor). -->
    <dimen name="desktop_mode_fullscreen_decor_caption_horizontal_padding_touched">16dp</dimen>

    <!-- Required empty space to be visible for partially offscreen tasks. -->
    <dimen name="freeform_required_visible_empty_space_in_header">48dp</dimen>

+28 −13
Original line number Diff line number Diff line
@@ -17,9 +17,12 @@
package com.android.wm.shell.windowdecor

import android.animation.ValueAnimator
import android.annotation.DimenRes
import android.content.res.Resources;
import android.content.Context
import android.util.AttributeSet
import android.widget.ImageButton
import com.android.wm.shell.R

/**
 * [ImageButton] for the handle at the top of fullscreen apps. Has custom hover
@@ -30,13 +33,23 @@ class HandleImageButton (context: Context?, attrs: AttributeSet?) :
    ImageButton(context, attrs) {
    private val handleAnimator = ValueAnimator()

    /** Final horizontal padding for hover enter. **/
    private val HANDLE_HOVER_ENTER_PADDING = loadDimensionPixelSize(
        R.dimen.desktop_mode_fullscreen_decor_caption_horizontal_padding_hovered)
    /** Final horizontal padding for press down. **/
    private val HANDLE_PRESS_DOWN_PADDING = loadDimensionPixelSize(
        R.dimen.desktop_mode_fullscreen_decor_caption_horizontal_padding_touched)
    /** Default horizontal padding. **/
    private val HANDLE_DEFAULT_PADDING = loadDimensionPixelSize(
        R.dimen.desktop_mode_fullscreen_decor_caption_horizontal_padding_default)

    override fun onHoverChanged(hovered: Boolean) {
        super.onHoverChanged(hovered)
        if (hovered) {
            animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_HOVER_ENTER_SCALE)
            animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_HOVER_ENTER_PADDING)
        } else {
            if (!isPressed) {
                animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_DEFAULT_SCALE)
                animateHandle(HANDLE_HOVER_ANIM_DURATION, HANDLE_DEFAULT_PADDING)
            }
        }
    }
@@ -45,35 +58,37 @@ class HandleImageButton (context: Context?, attrs: AttributeSet?) :
        if (isPressed != pressed) {
            super.setPressed(pressed)
            if (pressed) {
                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_PRESS_DOWN_SCALE)
                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_PRESS_DOWN_PADDING)
            } else {
                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_DEFAULT_SCALE)
                animateHandle(HANDLE_PRESS_ANIM_DURATION, HANDLE_DEFAULT_PADDING)
            }
        }
    }

    private fun animateHandle(duration: Long, endScale: Float) {
    private fun animateHandle(duration: Long, endPadding: Int) {
        if (handleAnimator.isRunning) {
            handleAnimator.cancel()
        }
        handleAnimator.duration = duration
        handleAnimator.setFloatValues(scaleX, endScale)
        handleAnimator.setIntValues(paddingLeft, endPadding)
        handleAnimator.addUpdateListener { animator ->
            scaleX = animator.animatedValue as Float
            val padding = animator.animatedValue as Int
            setPadding(padding, paddingTop, padding, paddingBottom)
        }
        handleAnimator.start()
    }

    private fun loadDimensionPixelSize(@DimenRes resourceId: Int): Int {
        if (resourceId == Resources.ID_NULL) {
            return 0
        }
        return context.resources.getDimensionPixelSize(resourceId)
    }

    companion object {
        /** The duration of animations related to hover state. **/
        private const val HANDLE_HOVER_ANIM_DURATION = 300L
        /** The duration of animations related to pressed state. **/
        private const val HANDLE_PRESS_ANIM_DURATION = 200L
        /** Ending scale for hover enter. **/
        private const val HANDLE_HOVER_ENTER_SCALE = 1.2f
        /** Ending scale for press down. **/
        private const val HANDLE_PRESS_DOWN_SCALE = 0.85f
        /** Default scale for handle. **/
        private const val HANDLE_DEFAULT_SCALE = 1f
    }
}