summaryrefslogtreecommitdiff
path: root/core/java/android/widget/RemoteViewsService.java
diff options
context:
space:
mode:
authorWinson Chung <winsonc@google.com>2010-09-16 14:45:32 -0700
committerWinson Chung <winsonc@google.com>2010-09-16 16:59:56 -0700
commit9b3a2cf2a0a482ce8212eb2775176dd4c23e8e9a (patch)
tree85565b55b92b3a0d18064815c6f73a6880d8d8d7 /core/java/android/widget/RemoteViewsService.java
parentc5958f8a659969b40aa624043264aee32c3c61af (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.java27
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);
}
}
}