diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt index 7848b7e238..bcfc7181da 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt @@ -30,6 +30,7 @@ import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASK import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_UNPINNED import com.android.launcher3.taskbar.TaskbarDividerPopupView.Companion.createAndPopulate import java.io.PrintWriter +import kotlin.jvm.optionals.getOrNull /** Controls taskbar pinning through a popup view. */ class TaskbarPinningController(private val context: TaskbarActivityContext) : @@ -119,7 +120,11 @@ class TaskbarPinningController(private val context: TaskbarActivityContext) : taskbarViewController.taskbarIconScaleForPinning.animateToValue(animateToValue), taskbarViewController.taskbarIconTranslationXForPinning.animateToValue(animateToValue), ) - + controllers.bubbleControllers.getOrNull()?.bubbleBarViewController?.let { + // if bubble bar is not visible no need to add it`s animations + if (!it.isBubbleBarVisible) return@let + animatorSet.playTogether(it.bubbleBarPinning.animateToValue(animateToValue)) + } animatorSet.interpolator = Interpolators.EMPHASIZED return animatorSet } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java index d15fcf4e1f..d91d10a686 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java @@ -303,6 +303,17 @@ public class BubbleBarView extends FrameLayout { } } + /** + * Set the bubble icons size and spacing between the bubbles and the borders of the bubble + * bar. + */ + public void setIconSizeAndPaddingForPinning(float newIconSize, float newBubbleBarPadding) { + mBubbleBarPadding = newBubbleBarPadding; + mIconScale = newIconSize / mIconSize; + updateBubblesLayoutProperties(mBubbleBarLocation); + invalidate(); + } + /** * Sets new icon sizes and newBubbleBarPadding between icons and bubble bar borders. * diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java index e8fc625ed3..31b1ea0a19 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java @@ -18,6 +18,10 @@ package com.android.launcher3.taskbar.bubbles; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; +import static com.android.launcher3.Utilities.mapRange; +import static com.android.launcher3.taskbar.TaskbarPinningController.PINNING_PERSISTENT; +import static com.android.launcher3.taskbar.TaskbarPinningController.PINNING_TRANSIENT; + import android.animation.Animator; import android.animation.AnimatorSet; import android.content.res.Resources; @@ -42,12 +46,14 @@ import com.android.launcher3.anim.RoundedRectRevealOutlineProvider; import com.android.launcher3.taskbar.TaskbarActivityContext; import com.android.launcher3.taskbar.TaskbarControllers; import com.android.launcher3.taskbar.TaskbarInsetsController; +import com.android.launcher3.taskbar.TaskbarSharedState; import com.android.launcher3.taskbar.TaskbarStashController; import com.android.launcher3.taskbar.bubbles.animation.BubbleBarViewAnimator; import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutController; import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutPositioner; import com.android.launcher3.taskbar.bubbles.flyout.FlyoutCallbacks; import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController; +import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.MultiPropertyFactory; import com.android.launcher3.util.MultiValueAlpha; import com.android.quickstep.SystemUiProxy; @@ -106,6 +112,10 @@ public class BubbleBarViewController { this::updateTranslationY); private final AnimatedFloat mBubbleOffsetY = new AnimatedFloat( this::updateBubbleOffsetY); + private final AnimatedFloat mBubbleBarPinning = new AnimatedFloat(pinningProgress -> { + updateTranslationY(); + setBubbleBarScaleAndPadding(pinningProgress); + }); // Modified when swipe up is happening on the bubble bar or task bar. private float mBubbleBarSwipeUpTranslationY; @@ -125,8 +135,9 @@ public class BubbleBarViewController { private BubbleBarViewAnimator mBubbleBarViewAnimator; private final FrameLayout mBubbleBarContainer; private BubbleBarFlyoutController mBubbleBarFlyoutController; - + private TaskbarSharedState mTaskbarSharedState; private final TimeSource mTimeSource = System::currentTimeMillis; + private final int mTaskbarTranslationDelta; @Nullable private BubbleBarBoundsChangeListener mBoundsChangeListener; @@ -140,11 +151,13 @@ public class BubbleBarViewController { mBubbleBarAlpha = new MultiValueAlpha(mBarView, 1 /* num alpha channels */); mIconSize = activity.getResources().getDimensionPixelSize( R.dimen.bubblebar_icon_size); + mTaskbarTranslationDelta = getBubbleBarTranslationDeltaForTaskbar(activity); } /** Initializes controller. */ public void init(TaskbarControllers controllers, BubbleControllers bubbleControllers, TaskbarViewPropertiesProvider taskbarViewPropertiesProvider) { + mTaskbarSharedState = controllers.getSharedState(); mBubbleStashController = bubbleControllers.bubbleStashController; mBubbleBarController = bubbleControllers.bubbleBarController; mBubbleDragController = bubbleControllers.bubbleDragController; @@ -172,6 +185,10 @@ public class BubbleBarViewController { mBoundsChangeListener.onBoundsChanged(); } }); + float pinningValue = DisplayController.isTransientTaskbar(mActivity) + ? PINNING_TRANSIENT + : PINNING_PERSISTENT; + mBubbleBarPinning.updateValue(pinningValue); mBarView.setController(new BubbleBarView.Controller() { @Override public float getBubbleBarTranslationY() { @@ -227,6 +244,11 @@ public class BubbleBarViewController { }; } + /** Returns animated float property responsible for pinning transition animation. */ + public AnimatedFloat getBubbleBarPinning() { + return mBubbleBarPinning; + } + private BubbleBarFlyoutPositioner createFlyoutPositioner() { return new BubbleBarFlyoutPositioner() { @@ -605,9 +627,11 @@ public class BubbleBarViewController { updateBubbleBarIconSizeAndPadding(newIconSize, newPadding, animate); } - private int getBubbleBarIconSizeFromDeviceProfile(Resources res) { - DeviceProfile deviceProfile = mActivity.getDeviceProfile(); + return getBubbleBarIconSizeFromDeviceProfile(res, mActivity.getDeviceProfile()); + } + + private int getBubbleBarIconSizeFromDeviceProfile(Resources res, DeviceProfile deviceProfile) { DisplayMetrics dm = res.getDisplayMetrics(); float smallIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_SMALL_DP, dm); @@ -622,7 +646,10 @@ public class BubbleBarViewController { } private int getBubbleBarPaddingFromDeviceProfile(Resources res) { - DeviceProfile deviceProfile = mActivity.getDeviceProfile(); + return getBubbleBarPaddingFromDeviceProfile(res, mActivity.getDeviceProfile()); + } + + private int getBubbleBarPaddingFromDeviceProfile(Resources res, DeviceProfile deviceProfile) { DisplayMetrics dm = res.getDisplayMetrics(); float mediumIconSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, APP_ICON_MEDIUM_DP, dm); @@ -663,7 +690,53 @@ public class BubbleBarViewController { private void updateTranslationY() { mBarView.setTranslationY(mBubbleBarTranslationY.value + mBubbleBarSwipeUpTranslationY - + mBubbleBarStashTranslationY); + + mBubbleBarStashTranslationY + getBubbleBarTranslationYForTaskbarPinning()); + } + + /** Computes translation y for taskbar pinning. */ + private float getBubbleBarTranslationYForTaskbarPinning() { + if (mTaskbarSharedState == null) return 0f; + float pinningProgress = mBubbleBarPinning.value; + if (mTaskbarSharedState.startTaskbarVariantIsTransient) { + return mapRange(pinningProgress, /* min = */ 0f, mTaskbarTranslationDelta); + } else { + return mapRange(pinningProgress, -mTaskbarTranslationDelta, /* max = */ 0f); + } + } + + private void setBubbleBarScaleAndPadding(float pinningProgress) { + Resources res = mActivity.getResources(); + // determine icon scale for pinning + int persistentIconSize = res.getDimensionPixelSize( + R.dimen.bubblebar_icon_size_persistent_taskbar); + int transientIconSize = getBubbleBarIconSizeFromDeviceProfile(res, + mActivity.getTransientTaskbarDeviceProfile()); + float pinningIconSize = mapRange(pinningProgress, transientIconSize, persistentIconSize); + + // determine bubble bar padding for pinning + int persistentPadding = res.getDimensionPixelSize( + R.dimen.bubblebar_icon_spacing_persistent_taskbar); + int transientPadding = getBubbleBarPaddingFromDeviceProfile(res, + mActivity.getTransientTaskbarDeviceProfile()); + float pinningPadding = mapRange(pinningProgress, transientPadding, persistentPadding); + mBarView.setIconSizeAndPaddingForPinning(pinningIconSize, pinningPadding); + } + + /** + * Calculates the vertical difference in the bubble bar positions for pinned and transient + * taskbar modes. + */ + private int getBubbleBarTranslationDeltaForTaskbar(TaskbarActivityContext activity) { + Resources res = activity.getResources(); + int persistentBubbleSize = res + .getDimensionPixelSize(R.dimen.bubblebar_icon_size_persistent_taskbar); + int persistentSpacingSize = res + .getDimensionPixelSize(R.dimen.bubblebar_icon_spacing_persistent_taskbar); + int persistentBubbleBarSize = persistentBubbleSize + persistentSpacingSize * 2; + int persistentTaskbarHeight = activity.getPersistentTaskbarDeviceProfile().taskbarHeight; + int persistentBubbleBarY = (persistentTaskbarHeight - persistentBubbleBarSize) / 2; + int transientBubbleBarY = activity.getTransientTaskbarDeviceProfile().taskbarBottomMargin; + return transientBubbleBarY - persistentBubbleBarY; } private void updateScaleX(float scale) {