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

Commit 0e0bc674 authored by Peter Kalauskas's avatar Peter Kalauskas Committed by Android (Google) Code Review
Browse files

Merge "Updates to new back indicator" into tm-qpr-dev

parents bc204078 b23ad0b6
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@
    <!-- The threshold to drag to trigger the edge action -->
    <dimen name="navigation_edge_action_drag_threshold">16dp</dimen>
    <!-- The threshold to progress back animation for edge swipe -->
    <dimen name="navigation_edge_action_progress_threshold">400dp</dimen>
    <dimen name="navigation_edge_action_progress_threshold">412dp</dimen>
    <!-- The minimum display position of the arrow on the screen -->
    <dimen name="navigation_edge_arrow_min_y">64dp</dimen>
    <!-- The amount by which the arrow is shifted to avoid the finger-->
@@ -80,13 +80,11 @@
    <dimen name="navigation_edge_active_arrow_length">8dp</dimen>
    <dimen name="navigation_edge_active_arrow_height">9dp</dimen>

    <!-- stretch @412 dp -->
    <dimen name="navigation_edge_stretch_threshold">412dp</dimen>
    <dimen name="navigation_edge_stretch_margin">18dp</dimen>
    <dimen name="navigation_edge_stretch_background_width">74dp</dimen>
    <dimen name="navigation_edge_stretch_background_height">60dp</dimen>
    <dimen name="navigation_edge_stretch_left_corners">30dp</dimen>
    <dimen name="navigation_edge_stretch_right_corners">30dp</dimen>
    <dimen name="navigation_edge_stretch_edge_corners">30dp</dimen>
    <dimen name="navigation_edge_stretch_far_corners">30dp</dimen>
    <dimen name="navigation_edge_stretched_arrow_length">7dp</dimen>
    <dimen name="navigation_edge_stretched_arrow_height">10dp</dimen>

+97 −40
Original line number Diff line number Diff line
@@ -58,14 +58,16 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :
        SpringForce().apply {
            stiffness = 600f
            dampingRatio = 0.65f
        })
        }
    )

    private val backgroundHeight = AnimatedFloat(
        name = "backgroundHeight",
        SpringForce().apply {
            stiffness = 600f
            dampingRatio = 0.65f
        })
        }
    )

    /**
     * Corners of the background closer to the edge of the screen (where the arrow appeared from).
@@ -76,18 +78,20 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :
        SpringForce().apply {
            stiffness = 400f
            dampingRatio = SpringForce.DAMPING_RATIO_MEDIUM_BOUNCY
        })
        }
    )

    /**
     * Corners of the background further from the edge of the screens (toward the direction the
     * arrow is being dragged). Used for animating [arrowBackgroundRect]
     */
    private val backgroundDragCornerRadius = AnimatedFloat(
    private val backgroundFarCornerRadius = AnimatedFloat(
        name = "backgroundDragCornerRadius",
        SpringForce().apply {
            stiffness = 2200f
            dampingRatio = SpringForce.DAMPING_RATIO_NO_BOUNCY
        })
        }
    )

    /**
     * Left/right position of the background relative to the canvas. Also corresponds with the
@@ -96,14 +100,32 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :
     */
    private var horizontalTranslation = AnimatedFloat("horizontalTranslation", SpringForce())

    private val currentAlpha: FloatPropertyCompat<BackPanel> =
        object : FloatPropertyCompat<BackPanel>("currentAlpha") {
            override fun setValue(panel: BackPanel, value: Float) {
                panel.alpha = value
            }

            override fun getValue(panel: BackPanel): Float = panel.alpha
        }

    private val alphaAnimation = SpringAnimation(this, currentAlpha)
        .setSpring(
            SpringForce()
                .setStiffness(60f)
                .setDampingRatio(SpringForce.DAMPING_RATIO_NO_BOUNCY)
        )

    /**
     * Canvas vertical translation. How far up/down the arrow and background appear relative to the
     * canvas.
     */
    private var verticalTranslation: AnimatedFloat =
        AnimatedFloat("verticalTranslation", SpringForce().apply {
    private var verticalTranslation: AnimatedFloat = AnimatedFloat(
        name = "verticalTranslation",
        SpringForce().apply {
            stiffness = SpringForce.STIFFNESS_MEDIUM
        })
        }
    )

    /**
     * Use for drawing debug info. Can only be set if [DEBUG]=true
@@ -160,6 +182,17 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :
            animation.animateToFinalPosition(restingPosition + stretchAmount)
        }

        /**
         * Animates to a new position ([finalPosition]) that is the given fraction ([amount])
         * between the existing [restingPosition] and the new [finalPosition].
         *
         * The [restingPosition] will remain unchanged. Only the animation is updated.
         */
        fun stretchBy(finalPosition: Float, amount: Float) {
            val stretchedAmount = amount * (finalPosition - restingPosition)
            animation.animateToFinalPosition(restingPosition + stretchedAmount)
        }

        fun updateRestingPosition(pos: Float, animated: Boolean) {
            restingPosition = pos
            if (animated)
@@ -192,7 +225,10 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :
    }

    fun addEndListener(endListener: DelayedOnAnimationEndListener): Boolean {
        return if (horizontalTranslation.animation.isRunning) {
        return if (alphaAnimation.isRunning) {
            alphaAnimation.addEndListener(endListener)
            true
        } else if (horizontalTranslation.animation.isRunning) {
            horizontalTranslation.animation.addEndListener(endListener)
            true
        } else {
@@ -202,47 +238,59 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :
    }

    fun setStretch(
        arrowLengthStretch: Float,
        arrowHeightStretch: Float,
        backgroundWidthStretch: Float,
        backgroundHeightStretch: Float,
        backgroundEdgeCornerRadiusStretch: Float,
        backgroundDragCornerRadiusStretch: Float,
        horizontalTranslationStretch: Float
        horizontalTranslationStretchAmount: Float,
        arrowStretchAmount: Float,
        backgroundWidthStretchAmount: Float,
        fullyStretchedDimens: EdgePanelParams.BackIndicatorDimens
    ) {
        arrowLength.stretchTo(arrowLengthStretch)
        arrowHeight.stretchTo(arrowHeightStretch)
        backgroundWidth.stretchTo(backgroundWidthStretch)
        backgroundHeight.stretchTo(backgroundHeightStretch)
        backgroundEdgeCornerRadius.stretchTo(backgroundEdgeCornerRadiusStretch)
        backgroundDragCornerRadius.stretchTo(backgroundDragCornerRadiusStretch)
        horizontalTranslation.stretchTo(horizontalTranslationStretch)
        horizontalTranslation.stretchBy(
            finalPosition = fullyStretchedDimens.horizontalTranslation,
            amount = horizontalTranslationStretchAmount
        )
        arrowLength.stretchBy(
            finalPosition = fullyStretchedDimens.arrowDimens.length,
            amount = arrowStretchAmount
        )
        arrowHeight.stretchBy(
            finalPosition = fullyStretchedDimens.arrowDimens.height,
            amount = arrowStretchAmount
        )
        backgroundWidth.stretchBy(
            finalPosition = fullyStretchedDimens.backgroundDimens.width,
            amount = backgroundWidthStretchAmount
        )
    }

    fun resetStretch() {
        setStretch(0f, 0f, 0f, 0f, 0f, 0f, 0f)
        horizontalTranslation.stretchTo(0f)
        arrowLength.stretchTo(0f)
        arrowHeight.stretchTo(0f)
        backgroundWidth.stretchTo(0f)
        backgroundHeight.stretchTo(0f)
        backgroundEdgeCornerRadius.stretchTo(0f)
        backgroundFarCornerRadius.stretchTo(0f)
    }

    /**
     * Updates resting arrow and background size not accounting for stretch
     */
    internal fun updateRestingArrowDimens(
        backgroundWidth: Float,
        backgroundHeight: Float,
        backgroundEdgeCornerRadius: Float,
        backgroundDragCornerRadius: Float,
        arrowLength: Float,
        arrowHeight: Float,
        horizontalTranslation: Float,
    internal fun setRestingDimens(
        restingParams: EdgePanelParams.BackIndicatorDimens,
        animate: Boolean
    ) {
        this.arrowLength.updateRestingPosition(arrowLength, animate)
        this.arrowHeight.updateRestingPosition(arrowHeight, animate)
        this.backgroundWidth.updateRestingPosition(backgroundWidth, animate)
        this.backgroundHeight.updateRestingPosition(backgroundHeight, animate)
        this.backgroundEdgeCornerRadius.updateRestingPosition(backgroundEdgeCornerRadius, animate)
        this.backgroundDragCornerRadius.updateRestingPosition(backgroundDragCornerRadius, animate)
        this.horizontalTranslation.updateRestingPosition(horizontalTranslation, animate)
        horizontalTranslation.updateRestingPosition(restingParams.horizontalTranslation, animate)
        arrowLength.updateRestingPosition(restingParams.arrowDimens.length, animate)
        arrowHeight.updateRestingPosition(restingParams.arrowDimens.height, animate)
        backgroundWidth.updateRestingPosition(restingParams.backgroundDimens.width, animate)
        backgroundHeight.updateRestingPosition(restingParams.backgroundDimens.height, animate)
        backgroundEdgeCornerRadius.updateRestingPosition(
            restingParams.backgroundDimens.edgeCornerRadius,
            animate
        )
        backgroundFarCornerRadius.updateRestingPosition(
            restingParams.backgroundDimens.farCornerRadius,
            animate
        )
    }

    fun animateVertically(yPos: Float) = verticalTranslation.stretchTo(yPos)
@@ -262,7 +310,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :

    override fun onDraw(canvas: Canvas) {
        var edgeCorner = backgroundEdgeCornerRadius.pos
        val farCorner = backgroundDragCornerRadius.pos
        val farCorner = backgroundFarCornerRadius.pos
        val halfHeight = backgroundHeight.pos / 2

        canvas.save()
@@ -337,4 +385,13 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) :
        )
        addRoundRect(this@toPathWithRoundCorners, corners, Path.Direction.CW)
    }

    fun cancelAlphaAnimations() {
        alphaAnimation.cancel()
        alpha = 1f
    }

    fun fadeOut() {
        alphaAnimation.animateToFinalPosition(0f)
    }
}
+134 −143

File changed.

Preview size limit exceeded, changes collapsed.

+86 −85
Original line number Diff line number Diff line
@@ -4,66 +4,36 @@ import android.content.res.Resources
import com.android.systemui.R

data class EdgePanelParams(private var resources: Resources) {

    data class ArrowDimens(
        val length: Float = 0f,
        val height: Float = 0f
    )

    data class BackgroundDimens(
        val width: Float = 0f,
        val height: Float = 0f,
        val edgeCornerRadius: Float = 0f,
        val farCornerRadius: Float = 0f
    )

    data class BackIndicatorDimens(
        val horizontalTranslation: Float = 0f,
        val arrowDimens: ArrowDimens = ArrowDimens(),
        val backgroundDimens: BackgroundDimens = BackgroundDimens()
    )

    var arrowThickness: Float = 0f
        private set
    var entryArrowLength: Float = 0f
        private set
    var entryArrowHeight: Float = 0f
        private set
    var activeArrowLength: Float = 0f
        private set
    var activeArrowHeight: Float = 0f
        private set
    var stretchedArrowLength: Float = 0f
        private set
    var stretchedArrowHeight: Float = 0f
        private set
    var cancelledArrowLength: Float = 0f
        private set
    var cancelledArrowHeight: Float = 0f
        private set
    var entryMargin: Float = 0f
        private set
    var entryBackgroundWidth: Float = 0f
        private set
    var entryBackgroundHeight: Float = 0f
        private set
    var entryEdgeCorners: Float = 0f
        private set
    var entryFarCorners: Float = 0f
        private set
    var preThresholdMargin: Float = 0f
        private set
    var preThresholdBackgroundWidth: Float = 0f
    var entryIndicator = BackIndicatorDimens()
        private set
    var preThresholdBackgroundHeight: Float = 0f
    var activeIndicator = BackIndicatorDimens()
        private set
    var preThresholdEdgeCorners: Float = 0f
    var preThresholdIndicator = BackIndicatorDimens()
        private set
    var preThresholdFarCorners: Float = 0f
        private set
    var activeMargin: Float = 0f
        private set
    var activeBackgroundWidth: Float = 0f
        private set
    var activeBackgroundHeight: Float = 0f
        private set
    var activeEdgeCorners: Float = 0f
        private set
    var activeFarCorners: Float = 0f
        private set
    var fullyStretchedThreshold: Float = 0f
        private set
    var stretchMargin: Float = 0f
        private set
    var stretchBackgroundWidth: Float = 0f
        private set
    var stretchBackgroundHeight: Float = 0f
        private set
    var stretchEdgeCorners: Float = 0f
        private set
    var stretchFarCorners: Float = 0f
    var fullyStretchedIndicator = BackIndicatorDimens()
        private set
    var cancelledArrowDimens = ArrowDimens()

    // navigation bar edge constants
    var arrowPaddingEnd: Int = 0
@@ -98,42 +68,73 @@ data class EdgePanelParams(private var resources: Resources) {
    fun update(resources: Resources) {
        this.resources = resources
        arrowThickness = getDimen(R.dimen.navigation_edge_arrow_thickness)
        entryArrowLength = getDimen(R.dimen.navigation_edge_entry_arrow_length)
        entryArrowHeight = getDimen(R.dimen.navigation_edge_entry_arrow_height)
        activeArrowLength = getDimen(R.dimen.navigation_edge_active_arrow_length)
        activeArrowHeight = getDimen(R.dimen.navigation_edge_active_arrow_height)
        stretchedArrowLength = getDimen(R.dimen.navigation_edge_stretched_arrow_length)
        stretchedArrowHeight = getDimen(R.dimen.navigation_edge_stretched_arrow_height)
        cancelledArrowLength = getDimen(R.dimen.navigation_edge_cancelled_arrow_length)
        cancelledArrowHeight = getDimen(R.dimen.navigation_edge_cancelled_arrow_height)
        entryMargin = getDimen(R.dimen.navigation_edge_entry_margin)
        entryBackgroundWidth = getDimen(R.dimen.navigation_edge_entry_background_width)
        entryBackgroundHeight = getDimen(R.dimen.navigation_edge_entry_background_height)
        entryEdgeCorners = getDimen(R.dimen.navigation_edge_entry_edge_corners)
        entryFarCorners = getDimen(R.dimen.navigation_edge_entry_far_corners)
        preThresholdMargin = getDimen(R.dimen.navigation_edge_pre_threshold_margin)
        preThresholdBackgroundWidth =
            getDimen(R.dimen.navigation_edge_pre_threshold_background_width)
        preThresholdBackgroundHeight =
            getDimen(R.dimen.navigation_edge_pre_threshold_background_height)
        preThresholdEdgeCorners = getDimen(R.dimen.navigation_edge_pre_threshold_edge_corners)
        preThresholdFarCorners = getDimen(R.dimen.navigation_edge_pre_threshold_far_corners)
        activeMargin = getDimen(R.dimen.navigation_edge_active_margin)
        activeBackgroundWidth = getDimen(R.dimen.navigation_edge_active_background_width)
        activeBackgroundHeight = getDimen(R.dimen.navigation_edge_active_background_height)
        activeEdgeCorners = getDimen(R.dimen.navigation_edge_active_edge_corners)
        activeFarCorners = getDimen(R.dimen.navigation_edge_active_far_corners)
        fullyStretchedThreshold = getDimen(R.dimen.navigation_edge_stretch_threshold)
        stretchMargin = getDimen(R.dimen.navigation_edge_stretch_margin)
        stretchBackgroundWidth = getDimen(R.dimen.navigation_edge_stretch_background_width)
        stretchBackgroundHeight = getDimen(R.dimen.navigation_edge_stretch_background_height)
        stretchEdgeCorners = getDimen(R.dimen.navigation_edge_stretch_left_corners)
        stretchFarCorners = getDimen(R.dimen.navigation_edge_stretch_right_corners)
        arrowPaddingEnd = getPx(R.dimen.navigation_edge_panel_padding)
        minArrowYPosition = getPx(R.dimen.navigation_edge_arrow_min_y)
        fingerOffset = getPx(R.dimen.navigation_edge_finger_offset)
        swipeTriggerThreshold = getDimen(R.dimen.navigation_edge_action_drag_threshold)
        swipeProgressThreshold = getDimen(R.dimen.navigation_edge_action_progress_threshold)
        minDeltaForSwitch = getPx(R.dimen.navigation_edge_minimum_x_delta_for_switch)

        entryIndicator = BackIndicatorDimens(
            horizontalTranslation = getDimen(R.dimen.navigation_edge_entry_margin),
            arrowDimens = ArrowDimens(
                length = getDimen(R.dimen.navigation_edge_entry_arrow_length),
                height = getDimen(R.dimen.navigation_edge_entry_arrow_height),
            ),
            backgroundDimens = BackgroundDimens(
                width = getDimen(R.dimen.navigation_edge_entry_background_width),
                height = getDimen(R.dimen.navigation_edge_entry_background_height),
                edgeCornerRadius = getDimen(R.dimen.navigation_edge_entry_edge_corners),
                farCornerRadius = getDimen(R.dimen.navigation_edge_entry_far_corners)
            )
        )

        activeIndicator = BackIndicatorDimens(
            horizontalTranslation = getDimen(R.dimen.navigation_edge_active_margin),
            arrowDimens = ArrowDimens(
                length = getDimen(R.dimen.navigation_edge_active_arrow_length),
                height = getDimen(R.dimen.navigation_edge_active_arrow_height),
            ),
            backgroundDimens = BackgroundDimens(
                width = getDimen(R.dimen.navigation_edge_active_background_width),
                height = getDimen(R.dimen.navigation_edge_active_background_height),
                edgeCornerRadius = getDimen(R.dimen.navigation_edge_active_edge_corners),
                farCornerRadius = getDimen(R.dimen.navigation_edge_active_far_corners)

            )
        )

        preThresholdIndicator = BackIndicatorDimens(
            horizontalTranslation = getDimen(R.dimen.navigation_edge_pre_threshold_margin),
            arrowDimens = ArrowDimens(
                length = entryIndicator.arrowDimens.length,
                height = entryIndicator.arrowDimens.height,
            ),
            backgroundDimens = BackgroundDimens(
                width = getDimen(R.dimen.navigation_edge_pre_threshold_background_width),
                height = getDimen(R.dimen.navigation_edge_pre_threshold_background_height),
                edgeCornerRadius = getDimen(R.dimen.navigation_edge_pre_threshold_edge_corners),
                farCornerRadius = getDimen(R.dimen.navigation_edge_pre_threshold_far_corners)
            )
        )

        fullyStretchedIndicator = BackIndicatorDimens(
            horizontalTranslation = getDimen(R.dimen.navigation_edge_stretch_margin),
            arrowDimens = ArrowDimens(
                length = getDimen(R.dimen.navigation_edge_stretched_arrow_length),
                height = getDimen(R.dimen.navigation_edge_stretched_arrow_height),
            ),
            backgroundDimens = BackgroundDimens(
                width = getDimen(R.dimen.navigation_edge_stretch_background_width),
                height = getDimen(R.dimen.navigation_edge_stretch_background_height),
                edgeCornerRadius = getDimen(R.dimen.navigation_edge_stretch_edge_corners),
                farCornerRadius = getDimen(R.dimen.navigation_edge_stretch_far_corners)
            )
        )

        cancelledArrowDimens = ArrowDimens(
            length = getDimen(R.dimen.navigation_edge_cancelled_arrow_length),
            height = getDimen(R.dimen.navigation_edge_cancelled_arrow_height)
        )
    }
}