diff options
| author | Winson Chung <winsonc@google.com> | 2010-09-16 14:45:32 -0700 |
|---|---|---|
| committer | Winson Chung <winsonc@google.com> | 2010-09-16 16:59:56 -0700 |
| commit | 9b3a2cf2a0a482ce8212eb2775176dd4c23e8e9a (patch) | |
| tree | 85565b55b92b3a0d18064815c6f73a6880d8d8d7 /core/java/android/widget/RemoteViewsService.java | |
| parent | c5958f8a659969b40aa624043264aee32c3c61af (diff) | |
Prevent multiple RemoteViewAdapters from being set for the same intent.
Fixing issue where we were comparing and storing intents incorrectly in the RemoteViewsService reference counting scheme.
Change-Id: Iedf5997ed3a3ee7f8729cf8689121913196571f8
Diffstat (limited to 'core/java/android/widget/RemoteViewsService.java')
| -rw-r--r-- | core/java/android/widget/RemoteViewsService.java | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/core/java/android/widget/RemoteViewsService.java b/core/java/android/widget/RemoteViewsService.java index 584fa25f4145..4548ff49e55a 100644 --- a/core/java/android/widget/RemoteViewsService.java +++ b/core/java/android/widget/RemoteViewsService.java @@ -36,7 +36,7 @@ public abstract class RemoteViewsService extends Service { private static final String LOG_TAG = "RemoteViewsService"; // multimap implementation for reference counting - private HashMap<Intent, Pair<RemoteViewsFactory, Integer>> mRemoteViewFactories; + private HashMap<Intent.FilterComparison, Pair<RemoteViewsFactory, Integer>> mRemoteViewFactories; private final Object mLock = new Object(); /** @@ -108,26 +108,28 @@ public abstract class RemoteViewsService extends Service { } public RemoteViewsService() { - mRemoteViewFactories = new HashMap<Intent, Pair<RemoteViewsFactory, Integer>>(); + mRemoteViewFactories = + new HashMap<Intent.FilterComparison, Pair<RemoteViewsFactory, Integer>>(); } @Override public IBinder onBind(Intent intent) { synchronized (mLock) { // increment the reference count to the particular factory associated with this intent + Intent.FilterComparison fc = new Intent.FilterComparison(intent); Pair<RemoteViewsFactory, Integer> factoryRef = null; RemoteViewsFactory factory = null; - if (!mRemoteViewFactories.containsKey(intent)) { + if (!mRemoteViewFactories.containsKey(fc)) { factory = onGetViewFactory(intent); factoryRef = new Pair<RemoteViewsFactory, Integer>(factory, 1); - mRemoteViewFactories.put(intent, factoryRef); + mRemoteViewFactories.put(fc, factoryRef); factory.onCreate(); } else { - Pair<RemoteViewsFactory, Integer> oldFactoryRef = mRemoteViewFactories.get(intent); + Pair<RemoteViewsFactory, Integer> oldFactoryRef = mRemoteViewFactories.get(fc); factory = oldFactoryRef.first; int newRefCount = oldFactoryRef.second.intValue() + 1; factoryRef = new Pair<RemoteViewsFactory, Integer>(oldFactoryRef.first, newRefCount); - mRemoteViewFactories.put(intent, factoryRef); + mRemoteViewFactories.put(fc, factoryRef); } return new RemoteViewsFactoryAdapter(factory); } @@ -136,16 +138,19 @@ public abstract class RemoteViewsService extends Service { @Override public boolean onUnbind(Intent intent) { synchronized (mLock) { - if (mRemoteViewFactories.containsKey(intent)) { + Intent.FilterComparison fc = new Intent.FilterComparison(intent); + if (mRemoteViewFactories.containsKey(fc)) { // this alleviates the user's responsibility of having to clear all factories - Pair<RemoteViewsFactory, Integer> oldFactoryRef = mRemoteViewFactories.get(intent); + Pair<RemoteViewsFactory, Integer> oldFactoryRef = + mRemoteViewFactories.get(fc); int newRefCount = oldFactoryRef.second.intValue() - 1; if (newRefCount <= 0) { oldFactoryRef.first.onDestroy(); - mRemoteViewFactories.remove(intent); + mRemoteViewFactories.remove(fc); } else { - Pair<RemoteViewsFactory, Integer> factoryRef = new Pair<RemoteViewsFactory, Integer>(oldFactoryRef.first, newRefCount); - mRemoteViewFactories.put(intent, factoryRef); + Pair<RemoteViewsFactory, Integer> factoryRef = + new Pair<RemoteViewsFactory, Integer>(oldFactoryRef.first, newRefCount); + mRemoteViewFactories.put(fc, factoryRef); } } } |
