Loading quickstep/res/values/dimens.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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> Loading quickstep/src/com/android/launcher3/taskbar/TaskbarDividerPopupView.kt +84 −9 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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( Loading @@ -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) Loading @@ -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 = {} Loading @@ -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( Loading Loading @@ -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() { Loading @@ -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) } } } Loading src/com/android/launcher3/popup/ArrowPopup.java +5 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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) { Loading Loading
quickstep/res/values/dimens.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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> Loading
quickstep/src/com/android/launcher3/taskbar/TaskbarDividerPopupView.kt +84 −9 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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( Loading @@ -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) Loading @@ -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 = {} Loading @@ -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( Loading Loading @@ -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() { Loading @@ -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) } } } Loading
src/com/android/launcher3/popup/ArrowPopup.java +5 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading Loading @@ -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) { Loading