Remove first icon from notification footer after it animates.
Before, we had a hack where the notifation view would tell the
footer to trim its notifications, which is inefficient and ugly
since we already know exactly what notification to remove. So
now we move the relevant removal logic (keeping things like the
overflow text in sync) to a removeViewFromIconRow() that is
used after the icon animates as well as when trimming notifications.
Bug: 32410600
Change-Id: I19e54e0c28daea869b45649c7f5c74843412bb86
diff --git a/src/com/android/launcher3/notification/NotificationFooterLayout.java b/src/com/android/launcher3/notification/NotificationFooterLayout.java
index 57ec5d1..9686ae0 100644
--- a/src/com/android/launcher3/notification/NotificationFooterLayout.java
+++ b/src/com/android/launcher3/notification/NotificationFooterLayout.java
@@ -61,6 +61,7 @@
private LinearLayout mIconRow;
private int mBackgroundColor;
private int mTextColor;
+ private TextView mOverflowView;
public NotificationFooterLayout(Context context) {
this(context, null, 0);
@@ -120,10 +121,10 @@
}
if (!mOverflowNotifications.isEmpty()) {
- TextView overflowText = new TextView(getContext());
- overflowText.setTextColor(mTextColor);
- updateOverflowText(overflowText);
- mIconRow.addView(overflowText, mIconLayoutParams);
+ mOverflowView = new TextView(getContext());
+ mOverflowView.setTextColor(mTextColor);
+ updateOverflowText();
+ mIconRow.addView(mOverflowView, mIconLayoutParams);
}
}
@@ -142,8 +143,8 @@
mIconRow.addView(icon, addIndex, mIconLayoutParams);
}
- private void updateOverflowText(TextView overflowTextView) {
- overflowTextView.setText(getResources().getString(R.string.deep_notifications_overflow,
+ private void updateOverflowText() {
+ mOverflowView.setText(getResources().getString(R.string.deep_notifications_overflow,
mOverflowNotifications.size()));
}
@@ -162,6 +163,7 @@
@Override
public void onAnimationEnd(Animator animation) {
callback.onIconAnimationEnd((NotificationInfo) firstNotification.getTag());
+ removeViewFromIconRow(firstNotification);
}
});
animation.play(moveAndScaleIcon);
@@ -178,7 +180,6 @@
public void onAnimationEnd(Animator animation) {
// We have to set the translation X to 0 when the new main notification
// is removed from the footer.
- // TODO: remove it here instead of expecting trimNotifications to do so.
child.setTranslationX(0);
}
});
@@ -187,6 +188,38 @@
animation.start();
}
+ private void removeViewFromIconRow(View child) {
+ mIconRow.removeView(child);
+ mNotifications.remove((NotificationInfo) child.getTag());
+ if (!mOverflowNotifications.isEmpty()) {
+ NotificationInfo notification = mOverflowNotifications.remove(0);
+ mNotifications.add(notification);
+ addNotificationIconForInfo(notification, true /* fromOverflow */);
+ }
+ if (mOverflowView != null) {
+ if (mOverflowNotifications.isEmpty()) {
+ mIconRow.removeView(mOverflowView);
+ mOverflowView = null;
+ } else {
+ updateOverflowText();
+ }
+ }
+ if (mIconRow.getChildCount() == 0) {
+ // There are no more icons in the secondary view, so hide it.
+ PopupContainerWithArrow popup = PopupContainerWithArrow.getOpen(
+ Launcher.getLauncher(getContext()));
+ int newHeight = getResources().getDimensionPixelSize(
+ R.dimen.notification_footer_collapsed_height);
+ AnimatorSet collapseSecondary = LauncherAnimUtils.createAnimatorSet();
+ collapseSecondary.play(popup.animateTranslationYBy(getHeight() - newHeight, 0));
+ collapseSecondary.play(LauncherAnimUtils.animateViewHeight(
+ this, getHeight(), newHeight));
+ collapseSecondary.setDuration(getResources().getInteger(
+ R.integer.config_removeNotificationViewDuration));
+ collapseSecondary.start();
+ }
+ }
+
public void trimNotifications(List<String> notifications) {
if (!isAttachedToWindow() || mIconRow.getChildCount() == 0) {
return;
@@ -205,35 +238,9 @@
} else {
NotificationInfo childInfo = (NotificationInfo) child.getTag();
if (!notifications.contains(childInfo.notificationKey)) {
- mIconRow.removeView(child);
- mNotifications.remove(childInfo);
- if (!mOverflowNotifications.isEmpty()) {
- NotificationInfo notification = mOverflowNotifications.remove(0);
- mNotifications.add(notification);
- addNotificationIconForInfo(notification, true /* fromOverflow */);
- }
+ removeViewFromIconRow(child);
}
}
}
- if (overflowView != null) {
- if (mOverflowNotifications.isEmpty()) {
- mIconRow.removeView(overflowView);
- } else {
- updateOverflowText(overflowView);
- }
- }
- if (mIconRow.getChildCount() == 0) {
- // There are no more icons in the secondary view, so hide it.
- PopupContainerWithArrow popup = PopupContainerWithArrow.getOpen(
- Launcher.getLauncher(getContext()));
- int newHeight = getResources().getDimensionPixelSize(
- R.dimen.notification_footer_collapsed_height);
- AnimatorSet collapseSecondary = LauncherAnimUtils.createAnimatorSet();
- collapseSecondary.play(popup.animateTranslationYBy(getHeight() - newHeight,
- getResources().getInteger(R.integer.config_removeNotificationViewDuration)));
- collapseSecondary.play(LauncherAnimUtils.animateViewHeight(
- this, getHeight(), newHeight));
- collapseSecondary.start();
- }
}
}
diff --git a/src/com/android/launcher3/notification/NotificationItemView.java b/src/com/android/launcher3/notification/NotificationItemView.java
index c9b3940..d58bef6 100644
--- a/src/com/android/launcher3/notification/NotificationItemView.java
+++ b/src/com/android/launcher3/notification/NotificationItemView.java
@@ -37,7 +37,6 @@
import com.android.launcher3.popup.PopupItemView;
import com.android.launcher3.userevent.nano.LauncherLogProto;
-import java.util.ArrayList;
import java.util.List;
import static com.android.launcher3.LauncherAnimUtils.animateViewHeight;
@@ -145,12 +144,6 @@
public void onIconAnimationEnd(NotificationInfo newMainNotification) {
if (newMainNotification != null) {
mMainView.applyNotificationInfo(newMainNotification, mIconView, true);
- // Remove the animated notification from the footer by calling trim
- // TODO: Remove the notification in NotificationFooterLayout directly
- // instead of relying on this hack.
- List<String> footerNotificationKeys = new ArrayList<>(notificationKeys);
- footerNotificationKeys.remove(newMainNotification.notificationKey);
- mFooter.trimNotifications(footerNotificationKeys);
mMainView.setVisibility(VISIBLE);
}
mAnimatingNextIcon = false;