OSDN Git Service

Create a singleton HashMap instead of using Collections.singleton()
authorTony Wickham <twickham@google.com>
Thu, 9 Feb 2017 16:28:52 +0000 (08:28 -0800)
committerTony Wickham <twickham@google.com>
Thu, 9 Feb 2017 18:30:06 +0000 (10:30 -0800)
The Set returned by Collections.singleton() doesn't support all
operations, causing crashes in certain situations (namely, whenever
a notification is updated rather than added or removed).

Change-Id: Ie104b7f99c4a32db5f1f7e43ec3775d34dc26ce1

src/com/android/launcher3/Utilities.java
src/com/android/launcher3/popup/PopupDataProvider.java

index 267cb2a..be3297c 100644 (file)
@@ -60,6 +60,7 @@ import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.Locale;
 import java.util.Set;
 import java.util.concurrent.Executor;
@@ -648,4 +649,14 @@ public final class Utilities {
             throw new RuntimeException(e);
         }
     }
+
+    /**
+     * Returns a HashSet with a single element. We use this instead of Collections.singleton()
+     * because HashSet ensures all operations, such as remove, are supported.
+     */
+    public static <T> HashSet<T> singletonHashSet(T elem) {
+        HashSet<T> hashSet = new HashSet<>(1);
+        hashSet.add(elem);
+        return hashSet;
+    }
 }
index 4f3b8a6..c754fda 100644 (file)
@@ -22,6 +22,7 @@ import android.util.Log;
 
 import com.android.launcher3.ItemInfo;
 import com.android.launcher3.Launcher;
+import com.android.launcher3.Utilities;
 import com.android.launcher3.badge.BadgeInfo;
 import com.android.launcher3.notification.NotificationInfo;
 import com.android.launcher3.notification.NotificationListener;
@@ -68,7 +69,8 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan
         } else {
             notificationWasAdded = badgeInfo.addNotificationKeyIfNotExists(notificationKey);
         }
-        updateLauncherIconBadges(Collections.singleton(postedPackageUserKey), notificationWasAdded);
+        updateLauncherIconBadges(Utilities.singletonHashSet(postedPackageUserKey),
+                notificationWasAdded);
     }
 
     @Override
@@ -78,7 +80,7 @@ public class PopupDataProvider implements NotificationListener.NotificationsChan
             if (oldBadgeInfo.getNotificationCount() == 0) {
                 mPackageUserToBadgeInfos.remove(removedPackageUserKey);
             }
-            updateLauncherIconBadges(Collections.singleton(removedPackageUserKey));
+            updateLauncherIconBadges(Utilities.singletonHashSet(removedPackageUserKey));
 
             PopupContainerWithArrow openContainer = PopupContainerWithArrow.getOpen(mLauncher);
             if (openContainer != null) {