OSDN Git Service

Fixing potential ConcurrentModificationException
authorSunny Goyal <sunnygoyal@google.com>
Mon, 8 Aug 2016 17:10:01 +0000 (10:10 -0700)
committerSunny Goyal <sunnygoyal@google.com>
Mon, 8 Aug 2016 17:13:33 +0000 (10:13 -0700)
mBgDeepShortcutMap is only accessed on the background thread. But
the same instance of list of values was getting passed to the UI
thread, instead of being cloned.

Change-Id: Ie7d0442d895304489ce9323ea872b9091d668ae5

src/com/android/launcher3/LauncherModel.java
src/com/android/launcher3/util/MultiHashMap.java

index a51fd07..34660ac 100644 (file)
@@ -2849,8 +2849,7 @@ public class LauncherModel extends BroadcastReceiver
     }
 
     public void bindDeepShortcuts() {
-        final MultiHashMap<ComponentKey, String> shortcutMapCopy = new MultiHashMap<>();
-        shortcutMapCopy.putAll(mBgDeepShortcutMap);
+        final MultiHashMap<ComponentKey, String> shortcutMapCopy = mBgDeepShortcutMap.clone();
         Runnable r = new Runnable() {
             @Override
             public void run() {
index f54ab88..b7275c1 100644 (file)
@@ -1,3 +1,19 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
 package com.android.launcher3.util;
 
 import java.util.ArrayList;
@@ -7,6 +23,13 @@ import java.util.HashMap;
  * A utility map from keys to an ArrayList of values.
  */
 public class MultiHashMap<K, V> extends HashMap<K, ArrayList<V>> {
+
+    public MultiHashMap() { }
+
+    public MultiHashMap(int size) {
+        super(size);
+    }
+
     public void addToList(K key, V value) {
         ArrayList<V> list = get(key);
         if (list == null) {
@@ -17,4 +40,13 @@ public class MultiHashMap<K, V> extends HashMap<K, ArrayList<V>> {
             list.add(value);
         }
     }
+
+    @Override
+    public MultiHashMap<K, V> clone() {
+        MultiHashMap<K, V> map = new MultiHashMap<>(size());
+        for (Entry<K, ArrayList<V>> entry : entrySet()) {
+            map.put(entry.getKey(), new ArrayList<V>(entry.getValue()));
+        }
+        return map;
+    }
 }