diff --git a/quickstep/res/layout/transient_taskbar.xml b/quickstep/res/layout/transient_taskbar.xml index bf4b811bb3..7a6d16a083 100644 --- a/quickstep/res/layout/transient_taskbar.xml +++ b/quickstep/res/layout/transient_taskbar.xml @@ -44,7 +44,6 @@ android:layout_height="@dimen/bubblebar_size" android:layout_gravity="bottom|end" android:layout_marginEnd="@dimen/transient_taskbar_bottom_margin" - android:layout_marginBottom="@dimen/transient_taskbar_bottom_margin" android:paddingEnd="@dimen/taskbar_icon_spacing" android:paddingStart="@dimen/taskbar_icon_spacing" android:visibility="gone" diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt index 07cd8ff1de..2062e2cb11 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt @@ -123,9 +123,11 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas val taskbarTouchableHeight = controllers.taskbarStashController.touchableHeight val bubblesTouchableHeight = - if (controllers.bubbleControllers.isPresent) + if (controllers.bubbleControllers.isPresent) { controllers.bubbleControllers.get().bubbleStashController.touchableHeight - else 0 + } else { + 0 + } val touchableHeight = Math.max(taskbarTouchableHeight, bubblesTouchableHeight) if ( diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java index 0b336450c4..563ba02a42 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java @@ -72,7 +72,11 @@ public class BubbleBarView extends FrameLayout { private final BubbleBarBackground mBubbleBarBackground; - // The current bounds of all the bubble bar. + /** + * The current bounds of all the bubble bar. Note that these bounds may not account for + * translation. The bounds should be retrieved using {@link #getBubbleBarBounds()} which + * updates the bounds and accounts for translation. + */ private final Rect mBubbleBarBounds = new Rect(); // The amount the bubbles overlap when they are stacked in the bubble bar private final float mIconOverlapAmount; @@ -186,9 +190,11 @@ public class BubbleBarView extends FrameLayout { } /** - * Returns the bounds of the bubble bar. + * Updates the bounds with translation that may have been applied and returns the result. */ public Rect getBubbleBarBounds() { + mBubbleBarBounds.top = getTop() + (int) getTranslationY(); + mBubbleBarBounds.bottom = getBottom() + (int) getTranslationY(); return mBubbleBarBounds; } diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashController.java index b3c7d41e37..5177d932f1 100644 --- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashController.java @@ -15,6 +15,8 @@ */ package com.android.launcher3.taskbar.bubbles; +import static java.lang.Math.abs; + import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; @@ -125,6 +127,16 @@ public class BubbleStashController { mBubblesShowingOnHome = onHome; if (mBubblesShowingOnHome) { showBubbleBar(/* expanded= */ false); + // When transitioning from app to home the stash animator may already have been + // created, so we need to animate the bubble bar here to align with hotseat. + if (!mIsStashed) { + mIconTranslationYForStash.animateToValue(getBubbleBarTranslationYForHotseat()) + .start(); + } + // If the bubble bar is already unstashed, the taskbar touchable region won't be + // updated correctly, so force an update here. + mControllers.runAfterInit(() -> + mTaskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged()); } else if (!mBarViewController.isExpanded()) { stashBubbleBar(); } @@ -143,6 +155,11 @@ public class BubbleStashController { mBubblesShowingOnOverview = onOverview; if (!mBubblesShowingOnOverview && !mBarViewController.isExpanded()) { stashBubbleBar(); + } else { + // When transitioning to overview the stash animator may already have been + // created, so we need to animate the bubble bar here to align with taskbar. + mIconTranslationYForStash.animateToValue(getBubbleBarTranslationYForTaskbar()) + .start(); } } } @@ -234,8 +251,11 @@ public class BubbleStashController { secondHalfDurationScale = 0.75f; // If we're on home, adjust the translation so the bubble bar aligns with hotseat. - final float hotseatTransY = mActivity.getDeviceProfile().getTaskbarOffsetY(); - final float translationY = mBubblesShowingOnHome ? hotseatTransY : 0; + // Otherwise we're either showing in an app or in overview. In either case adjust it so + // the bubble bar aligns with the taskbar. + final float translationY = mBubblesShowingOnHome ? getBubbleBarTranslationYForHotseat() + : getBubbleBarTranslationYForTaskbar(); + fullLengthAnimatorSet.playTogether( mIconScaleForStash.animateToValue(1), mIconTranslationYForStash.animateToValue(translationY)); @@ -265,6 +285,7 @@ public class BubbleStashController { if (isStashed) { mBarViewController.setExpanded(false); } + mTaskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged(); }); } }); @@ -277,4 +298,15 @@ public class BubbleStashController { mTaskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged(); }); } + + private float getBubbleBarTranslationYForTaskbar() { + return -mActivity.getDeviceProfile().taskbarBottomMargin; + } + + private float getBubbleBarTranslationYForHotseat() { + final float hotseatBottomSpace = mActivity.getDeviceProfile().hotseatBarBottomSpacePx; + final float hotseatCellHeight = mActivity.getDeviceProfile().hotseatCellHeightPx; + return -hotseatBottomSpace - hotseatCellHeight + mUnstashedHeight - abs( + hotseatCellHeight - mUnstashedHeight) / 2; + } }