OSDN Git Service

Store notification keys in a List instead of a Set.
authorTony Wickham <twickham@google.com>
Thu, 26 Jan 2017 17:54:48 +0000 (09:54 -0800)
committerTony Wickham <twickham@google.com>
Thu, 26 Jan 2017 19:28:43 +0000 (11:28 -0800)
This will preserve the order when iterating over the notifications to
populate the popup container.

Bug: 34735689
Change-Id: Ic390ffef140e454566ffc6ab1763950349df25ce

src/com/android/launcher3/badge/BadgeInfo.java
src/com/android/launcher3/notification/NotificationFooterLayout.java
src/com/android/launcher3/notification/NotificationItemView.java
src/com/android/launcher3/popup/PopupDataProvider.java

index 673c297..77355c7 100644 (file)
@@ -19,8 +19,8 @@ package com.android.launcher3.badge;
 import com.android.launcher3.notification.NotificationInfo;
 import com.android.launcher3.util.PackageUserKey;
 
-import java.util.HashSet;
-import java.util.Set;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Contains data to be used in an icon badge.
@@ -33,17 +33,20 @@ public class BadgeInfo {
      * The keys of the notifications that this badge represents. These keys can later be
      * used to retrieve {@link NotificationInfo}'s.
      */
-    private Set<String> mNotificationKeys;
+    private List<String> mNotificationKeys;
 
     public BadgeInfo(PackageUserKey packageUserKey) {
         mPackageUserKey = packageUserKey;
-        mNotificationKeys = new HashSet<>();
+        mNotificationKeys = new ArrayList<>();
     }
 
     /**
      * Returns whether the notification was added (false if it already existed).
      */
-    public boolean addNotificationKey(String notificationKey) {
+    public boolean addNotificationKeyIfNotExists(String notificationKey) {
+        if (mNotificationKeys.contains(notificationKey)) {
+            return false;
+        }
         return mNotificationKeys.add(notificationKey);
     }
 
@@ -54,7 +57,7 @@ public class BadgeInfo {
         return mNotificationKeys.remove(notificationKey);
     }
 
-    public Set<String> getNotificationKeys() {
+    public List<String> getNotificationKeys() {
         return mNotificationKeys;
     }
 
index 2965e4a..eef1d61 100644 (file)
@@ -40,7 +40,6 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * A {@link LinearLayout} that contains icons of notifications. If there is only one icon,
@@ -191,7 +190,7 @@ public class NotificationFooterLayout extends LinearLayout {
         animation.start();
     }
 
-    public void trimNotifications(Set<String> notifications) {
+    public void trimNotifications(List<String> notifications) {
         if (!isAttachedToWindow() || mIconRow.getChildCount() == 0) {
             return;
         }
index f388382..b74cd4e 100644 (file)
@@ -34,9 +34,8 @@ import com.android.launcher3.R;
 import com.android.launcher3.graphics.IconPalette;
 import com.android.launcher3.popup.PopupItemView;
 
-import java.util.HashSet;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Set;
 
 import static com.android.launcher3.LauncherAnimUtils.animateViewHeight;
 
@@ -122,7 +121,7 @@ public class NotificationItemView extends PopupItemView {
         mFooter.applyColors(iconPalette);
     }
 
-    public void trimNotifications(final Set<String> notificationKeys) {
+    public void trimNotifications(final List<String> notificationKeys) {
         boolean dismissedMainNotification = !notificationKeys.contains(
                 mMainView.getNotificationInfo().notificationKey);
         if (dismissedMainNotification && !mAnimatingNextIcon) {
@@ -137,7 +136,10 @@ public class NotificationItemView extends PopupItemView {
                 public void onIconAnimationEnd(NotificationInfo newMainNotification) {
                     if (newMainNotification != null) {
                         mMainView.applyNotificationInfo(newMainNotification, mIconView, mIconPalette);
-                        Set<String> footerNotificationKeys = new HashSet<>(notificationKeys);
+                        // 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);
index f6fdb76..c773079 100644 (file)
@@ -33,7 +33,6 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * Provides data for the popup menu that appears after long-clicking on apps.
@@ -59,10 +58,10 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan
         BadgeInfo oldBadgeInfo = mPackageUserToBadgeInfos.get(postedPackageUserKey);
         if (oldBadgeInfo == null) {
             BadgeInfo newBadgeInfo = new BadgeInfo(postedPackageUserKey);
-            newBadgeInfo.addNotificationKey(notificationKey);
+            newBadgeInfo.addNotificationKeyIfNotExists(notificationKey);
             mPackageUserToBadgeInfos.put(postedPackageUserKey, newBadgeInfo);
             mLauncher.updateIconBadges(Collections.singleton(postedPackageUserKey));
-        } else if (oldBadgeInfo.addNotificationKey(notificationKey)) {
+        } else if (oldBadgeInfo.addNotificationKeyIfNotExists(notificationKey)) {
             mLauncher.updateIconBadges(Collections.singleton(postedPackageUserKey));
         }
     }
@@ -96,7 +95,7 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan
                 badgeInfo = new BadgeInfo(packageUserKey);
                 mPackageUserToBadgeInfos.put(packageUserKey, badgeInfo);
             }
-            badgeInfo.addNotificationKey(notification.getKey());
+            badgeInfo.addNotificationKeyIfNotExists(notification.getKey());
         }
 
         // Add and remove from updatedBadges so it contains the PackageUserKeys of updated badges.
@@ -151,7 +150,7 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan
     public String[] getNotificationKeysForItem(ItemInfo info) {
         BadgeInfo badgeInfo = mPackageUserToBadgeInfos.get(PackageUserKey.fromItemInfo(info));
         if (badgeInfo == null) { return new String[0]; }
-        Set<String> notificationKeys = badgeInfo.getNotificationKeys();
+        List<String> notificationKeys = badgeInfo.getNotificationKeys();
         return notificationKeys.toArray(new String[notificationKeys.size()]);
     }