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

Commit 61526a74 authored by Jagrut Desai's avatar Jagrut Desai Committed by Android (Google) Code Review
Browse files

Merge "Improvements to TaskbarDividerPopupView" into main

parents 0531f1f6 9af2084a
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 = {}
@@ -96,11 +106,15 @@ constructor(
        val alwaysShowTaskbarSwitch = requireViewById<Switch>(R.id.taskbar_pinning_switch)
        val taskbarVisibilityIcon = requireViewById<View>(R.id.taskbar_pinning_visibility_icon)
        alwaysShowTaskbarSwitch.isChecked = alwaysShowTaskbarOn
        if (ActivityContext.lookupContext<TaskbarActivityContext>(context).isGestureNav) {
            taskbarSwitchOption.setOnClickListener {
                alwaysShowTaskbarSwitch.isClickable = true
                alwaysShowTaskbarSwitch.isChecked = !alwaysShowTaskbarOn
                onClickAlwaysShowTaskbarSwitchOption()
            }
        } else {
            alwaysShowTaskbarSwitch.isEnabled = false
        }

        if (!alwaysShowTaskbarSwitch.isEnabled) {
            taskbarVisibilityIcon.background.setTint(
@@ -178,10 +192,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() {
@@ -189,7 +264,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) {