From 172a21697dca96c7665f0c36e27a05f8ed00e81a Mon Sep 17 00:00:00 2001 From: Kenny Guy Date: Fri, 19 Jun 2015 17:21:28 +0100 Subject: [PATCH] Fix LauncherApps registerCallback adding duplicate callbacks. LauncherApps wraps the callback passed so checking using List.contains isn't valid. Bug: 21947184 Change-Id: Ice0973935574adda15e295073faedb62374ff627 --- core/java/android/content/pm/LauncherApps.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java index 5c21c8ee15699..e9ec77103b1f6 100644 --- a/core/java/android/content/pm/LauncherApps.java +++ b/core/java/android/content/pm/LauncherApps.java @@ -294,7 +294,7 @@ public class LauncherApps { */ public void registerCallback(Callback callback, Handler handler) { synchronized (this) { - if (callback != null && !mCallbacks.contains(callback)) { + if (callback != null && findCallbackLocked(callback) < 0) { boolean addedFirstCallback = mCallbacks.size() == 0; addCallbackLocked(callback, handler); if (addedFirstCallback) { @@ -325,17 +325,25 @@ public class LauncherApps { } } - private void removeCallbackLocked(Callback callback) { + /** @return position in mCallbacks for callback or -1 if not present. */ + private int findCallbackLocked(Callback callback) { if (callback == null) { throw new IllegalArgumentException("Callback cannot be null"); } final int size = mCallbacks.size(); for (int i = 0; i < size; ++i) { if (mCallbacks.get(i).mCallback == callback) { - mCallbacks.remove(i); - return; + return i; } } + return -1; + } + + private void removeCallbackLocked(Callback callback) { + int pos = findCallbackLocked(callback); + if (pos >= 0) { + mCallbacks.remove(pos); + } } private void addCallbackLocked(Callback callback, Handler handler) {