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;
