Animate bubble badge scale
When a bubble is added or removed while we're collapsed, animate the
badge scale to make sure that only the badge for the top bubble is
visible.
Flag: com.android.wm.shell.enable_bubble_bar
Fixes: 360652359
Test: manual
- add bubble while collapsed
- observe that badge only shows for top bubble
- remove bubble while collapsed
- observe that badge only shows for top bubble
Change-Id: I91472bb2ddeeeebd33ca64e20e065b2336c08589
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
index 30e4e47..334ba6e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
@@ -297,9 +297,7 @@
Log.e(TAG, "Could not instantiate BubbleBarBubble for " + bubbleInfos.get(i));
continue;
}
- addBubbleInternally(bubble, /* showAppBadge = */
- mBubbleBarViewController.isExpanded() || i == 0,
- /* isExpanding = */ false, /* suppressAnimation = */ true);
+ addBubbleInternally(bubble, /* isExpanding= */ false, /* suppressAnimation= */ true);
}
}
@@ -390,8 +388,7 @@
for (int i = update.currentBubbles.size() - 1; i >= 0; i--) {
BubbleBarBubble bubble = update.currentBubbles.get(i);
if (bubble != null) {
- addBubbleInternally(bubble, /* showAppBadge = */ !isCollapsed || i == 0,
- isExpanding, suppressAnimation);
+ addBubbleInternally(bubble, isExpanding, suppressAnimation);
if (isCollapsed) {
// If we're collapsed, the most recently added bubble will be selected.
bubbleToSelect = bubble;
@@ -563,10 +560,8 @@
}
}
- private void addBubbleInternally(BubbleBarBubble bubble, boolean showAppBadge,
- boolean isExpanding, boolean suppressAnimation) {
- //TODO(b/360652359): remove setting scale to the app badge once issue is fixed
- bubble.getView().setBadgeScale(showAppBadge ? 1 : 0);
+ private void addBubbleInternally(BubbleBarBubble bubble, boolean isExpanding,
+ boolean suppressAnimation) {
mBubbles.put(bubble.getKey(), bubble);
mBubbleBarViewController.addBubble(bubble, isExpanding, suppressAnimation);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
index d91d10a..c0a76a8 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
@@ -791,6 +791,7 @@
updateLayoutParams();
updateBubbleAccessibilityStates();
updateContentDescription();
+ updateDotsAndBadgesIfCollapsed();
}
/** Removes the given bubble from the bubble bar. */
@@ -856,7 +857,7 @@
updateBubbleAccessibilityStates();
updateContentDescription();
mDismissedByDragBubbleView = null;
- updateNotificationDotsIfCollapsed();
+ updateDotsAndBadgesIfCollapsed();
}
/**
@@ -886,17 +887,23 @@
return childViews;
}
- private void updateNotificationDotsIfCollapsed() {
+ private void updateDotsAndBadgesIfCollapsed() {
if (isExpanded()) {
return;
}
for (int i = 0; i < getChildCount(); i++) {
BubbleView bubbleView = (BubbleView) getChildAt(i);
- // when we're collapsed, the first bubble should show the dot if it has it. the rest of
- // the bubbles should hide their dots.
- if (i == 0 && bubbleView.hasUnseenContent()) {
- bubbleView.showDotIfNeeded(/* animate= */ true);
+ // when we're collapsed, the first bubble should show the badge and the dot if it has
+ // it. the rest of the bubbles should hide their badges and dots.
+ if (i == 0) {
+ bubbleView.showBadge();
+ if (bubbleView.hasUnseenContent()) {
+ bubbleView.showDotIfNeeded(/* animate= */ true);
+ } else {
+ bubbleView.hideDot();
+ }
} else {
+ bubbleView.hideBadge();
bubbleView.hideDot();
}
}
@@ -1100,7 +1107,7 @@
}
updateBubblesLayoutProperties(mBubbleBarLocation);
updateContentDescription();
- updateNotificationDotsIfCollapsed();
+ updateDotsAndBadgesIfCollapsed();
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleView.java
index 114edf4..0ea4222 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleView.java
@@ -49,6 +49,8 @@
public class BubbleView extends ConstraintLayout {
public static final int DEFAULT_PATH_SIZE = 100;
+ /** Duration for animating the scale of the dot and badge. */
+ private static final int SCALE_ANIMATION_DURATION_MS = 200;
private final ImageView mBubbleIcon;
private final ImageView mAppIcon;
@@ -316,12 +318,37 @@
}
void setBadgeScale(float fraction) {
- if (mAppIcon.getVisibility() == VISIBLE) {
+ if (hasBadge()) {
mAppIcon.setScaleX(fraction);
mAppIcon.setScaleY(fraction);
}
}
+ void showBadge() {
+ animateBadgeScale(1);
+ }
+
+ void hideBadge() {
+ animateBadgeScale(0);
+ }
+
+ private boolean hasBadge() {
+ return mAppIcon.getVisibility() == VISIBLE;
+ }
+
+ private void animateBadgeScale(float scale) {
+ if (!hasBadge()) {
+ return;
+ }
+ mAppIcon.clearAnimation();
+ mAppIcon.animate()
+ .setDuration(SCALE_ANIMATION_DURATION_MS)
+ .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
+ .scaleX(scale)
+ .scaleY(scale)
+ .start();
+ }
+
/** Suppresses or un-suppresses drawing the dot due to an update for this bubble. */
public void suppressDotForBubbleUpdate(boolean suppress) {
mDotSuppressedForBubbleUpdate = suppress;
@@ -409,7 +436,7 @@
clearAnimation();
animate()
- .setDuration(200)
+ .setDuration(SCALE_ANIMATION_DURATION_MS)
.setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
.setUpdateListener((valueAnimator) -> {
float fraction = valueAnimator.getAnimatedFraction();