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

Commit 9af2084a authored by Jagrut Desai's avatar Jagrut Desai
Browse files

Improvements to TaskbarDividerPopupView

- Close Animation improvement for popup.
- Popup location changed to  16dp above the taskbar view.
- Support for disabled state when user is in 3-button mode. (design changes to come in separate cl)

Test: Manual
Bug: 265170176
Flag: LEGACY ENABLE_TASKBAR_PINNING DISABLED
Change-Id: I9c91e6eb2b29c85433ba1c3d34505f0519448a6f
parent 1e638585
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -386,6 +386,7 @@

    <!--- Taskbar Pinning -->
    <dimen name="taskbar_pinning_popup_menu_width">300dp</dimen>
    <dimen name="taskbar_pinning_popup_menu_vertical_margin">16dp</dimen>

    <!-- Recents overview -->
    <dimen name="recents_filter_icon_size">30dp</dimen>
+84 −9
Original line number Diff line number Diff line
@@ -15,22 +15,29 @@
 */
package com.android.launcher3.taskbar

import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Rect
import android.graphics.drawable.GradientDrawable
import android.util.AttributeSet
import android.util.Property
import android.view.Gravity
import android.view.MotionEvent
import android.view.View
import android.widget.LinearLayout
import android.widget.Switch
import androidx.core.view.postDelayed
import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE
import com.android.launcher3.R
import com.android.launcher3.popup.ArrowPopup
import com.android.launcher3.popup.RoundedArrowDrawable
import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Themes
import com.android.launcher3.views.ActivityContext

/** Popup view with arrow for taskbar pinning */
class TaskbarDividerPopupView<T : TaskbarActivityContext>
@@ -42,7 +49,8 @@ constructor(
) : ArrowPopup<T>(context, attrs, defStyleAttr) {
    companion object {
        private const val TAG = "TaskbarDividerPopupView"
        private const val DIVIDER_POPUP_CLOSING_DELAY = 500L
        private const val DIVIDER_POPUP_CLOSING_DELAY = 333L
        private const val DIVIDER_POPUP_CLOSING_ANIMATION_DURATION = 83L

        @JvmStatic
        fun createAndPopulate(
@@ -63,7 +71,7 @@ constructor(
    private lateinit var dividerView: View

    private val menuWidth =
        context.resources.getDimensionPixelSize(R.dimen.taskbar_pinning_popup_menu_width)
        resources.getDimensionPixelSize(R.dimen.taskbar_pinning_popup_menu_width)
    private val popupCornerRadius = Themes.getDialogCornerRadius(context)
    private val arrowWidth = resources.getDimension(R.dimen.popup_arrow_width)
    private val arrowHeight = resources.getDimension(R.dimen.popup_arrow_height)
@@ -71,6 +79,8 @@ constructor(

    private var alwaysShowTaskbarOn = !DisplayController.isTransientTaskbar(context)
    private var didPreferenceChange = false
    private var verticalOffsetForPopupView =
        resources.getDimensionPixelSize(R.dimen.taskbar_pinning_popup_menu_vertical_margin)

    /** Callback invoked when the pinning popup view is closing. */
    var onCloseCallback: (preferenceChanged: Boolean) -> Unit = {}
@@ -95,11 +105,15 @@ constructor(
        val taskbarSwitchOption = requireViewById<LinearLayout>(R.id.taskbar_switch_option)
        val alwaysShowTaskbarSwitch = requireViewById<Switch>(R.id.taskbar_pinning_switch)
        alwaysShowTaskbarSwitch.isChecked = alwaysShowTaskbarOn
        if (ActivityContext.lookupContext<TaskbarActivityContext>(context).isGestureNav) {
            taskbarSwitchOption.setOnClickListener {
                alwaysShowTaskbarSwitch.isClickable = true
                alwaysShowTaskbarSwitch.isChecked = !alwaysShowTaskbarOn
                onClickAlwaysShowTaskbarSwitchOption()
            }
        } else {
            alwaysShowTaskbarSwitch.isEnabled = false
        }
    }

    /** Orient object as usual and then center object horizontally. */
@@ -171,10 +185,71 @@ constructor(
        }
    }

    override fun closeComplete() {
    override fun getExtraVerticalOffset(): Int {
        return (mActivityContext.deviceProfile.taskbarHeight -
            mActivityContext.deviceProfile.taskbarIconSize) / 2 + verticalOffsetForPopupView
    }

    override fun animateClose() {
        if (!mIsOpen) {
            return
        }
        if (mOpenCloseAnimator != null) {
            mOpenCloseAnimator.cancel()
        }
        mIsOpen = false

        mOpenCloseAnimator = getCloseAnimator()

        mOpenCloseAnimator.addListener(
            object : AnimatorListenerAdapter() {
                override fun onAnimationEnd(animation: Animator) {
                    mOpenCloseAnimator = null
                    if (mDeferContainerRemoval) {
                        setVisibility(INVISIBLE)
                    } else {
                        closeComplete()
                    }
                }
            }
        )
        onCloseCallback(didPreferenceChange)
        onCloseCallback = {}
        super.closeComplete()
        mOpenCloseAnimator.start()
    }

    private fun getCloseAnimator(): AnimatorSet {
        val alphaValues = floatArrayOf(1f, 0f)
        val translateYValue =
            if (!alwaysShowTaskbarOn) verticalOffsetForPopupView else -verticalOffsetForPopupView
        val alpha = getAnimatorOfFloat(this, ALPHA, *alphaValues)
        val arrowAlpha = getAnimatorOfFloat(mArrow, ALPHA, *alphaValues)
        val translateY =
            ObjectAnimator.ofFloat(
                this,
                TRANSLATION_Y,
                *floatArrayOf(this.translationY, this.translationY + translateYValue)
            )
        val arrowTranslateY =
            ObjectAnimator.ofFloat(
                mArrow,
                TRANSLATION_Y,
                *floatArrayOf(mArrow.translationY, mArrow.translationY + translateYValue)
            )
        val animatorSet = AnimatorSet()
        animatorSet.playTogether(alpha, arrowAlpha, translateY, arrowTranslateY)
        return animatorSet
    }

    private fun getAnimatorOfFloat(
        view: View,
        property: Property<View, Float>,
        vararg values: Float
    ): Animator {
        val animator: Animator = ObjectAnimator.ofFloat(view, property, *values)
        animator.setDuration(DIVIDER_POPUP_CLOSING_ANIMATION_DURATION)
        animator.interpolator = EMPHASIZED_ACCELERATE
        return animator
    }

    private fun onClickAlwaysShowTaskbarSwitchOption() {
@@ -182,7 +257,7 @@ constructor(
        // Allow switch animation to finish and then close the popup.
        postDelayed(DIVIDER_POPUP_CLOSING_DELAY) {
            if (isOpen) {
                close(false)
                close(true)
            }
        }
    }
+5 −2
Original line number Diff line number Diff line
@@ -415,8 +415,7 @@ public abstract class ArrowPopup<T extends Context & ActivityContext>
    private void orientAboutObject(boolean allowAlignLeft, boolean allowAlignRight) {
        measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);

        int extraVerticalSpace = mArrowHeight + mArrowOffsetVertical
                + getResources().getDimensionPixelSize(R.dimen.popup_vertical_padding);
        int extraVerticalSpace = mArrowHeight + mArrowOffsetVertical + getExtraVerticalOffset();
        // The margins are added after we call this method, so we need to account for them here.
        int numVisibleChildren = 0;
        for (int i = getChildCount() - 1; i >= 0; --i) {
@@ -632,6 +631,10 @@ public abstract class ArrowPopup<T extends Context & ActivityContext>
        mOpenCloseAnimator.start();
    }

    public int getExtraVerticalOffset() {
        return getResources().getDimensionPixelSize(R.dimen.popup_vertical_padding);
    }

    protected AnimatorSet getOpenCloseAnimator(boolean isOpening, int scaleDuration,
            int fadeStartDelay, int fadeDuration, int childFadeStartDelay, int childFadeDuration,
            Interpolator interpolator) {