summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2011-09-02 12:50:27 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-09-02 12:50:27 -0700
commit0c8d57d124d917721890b0aa4a152f9c9c7d317f (patch)
tree1e866eba8f2b8c28b2b0468540548713ec0cdbc8 /core
parent5afd2bd02ae44d5a38f9e560047723ddab176405 (diff)
parent3433a8ae5abf7c518277e2e00c141e1dec83600c (diff)
downloadframeworks_base-0c8d57d124d917721890b0aa4a152f9c9c7d317f.zip
frameworks_base-0c8d57d124d917721890b0aa4a152f9c9c7d317f.tar.gz
frameworks_base-0c8d57d124d917721890b0aa4a152f9c9c7d317f.tar.bz2
Merge "Fix Activity ref-leak in NFC dispatch API."
Diffstat (limited to 'core')
-rw-r--r--core/java/android/nfc/NfcActivityManager.java14
-rw-r--r--core/java/android/nfc/NfcFragment.java10
2 files changed, 21 insertions, 3 deletions
diff --git a/core/java/android/nfc/NfcActivityManager.java b/core/java/android/nfc/NfcActivityManager.java
index 3cc6820..da878d4 100644
--- a/core/java/android/nfc/NfcActivityManager.java
+++ b/core/java/android/nfc/NfcActivityManager.java
@@ -20,7 +20,7 @@ import android.app.Activity;
import android.os.RemoteException;
import android.util.Log;
-import java.util.HashMap;
+import java.util.WeakHashMap;
/**
* Manages NFC API's that are coupled to the life-cycle of an Activity.
@@ -38,7 +38,7 @@ public final class NfcActivityManager extends INdefPushCallback.Stub {
static final Boolean DBG = false;
final NfcAdapter mAdapter;
- final HashMap<Activity, NfcActivityState> mNfcState; // contents protected by this
+ final WeakHashMap<Activity, NfcActivityState> mNfcState; // contents protected by this
final NfcEvent mDefaultEvent; // can re-use one NfcEvent because it just contains adapter
/**
@@ -60,7 +60,7 @@ public final class NfcActivityManager extends INdefPushCallback.Stub {
public NfcActivityManager(NfcAdapter adapter) {
mAdapter = adapter;
- mNfcState = new HashMap<Activity, NfcActivityState>();
+ mNfcState = new WeakHashMap<Activity, NfcActivityState>();
mDefaultEvent = new NfcEvent(mAdapter);
}
@@ -88,6 +88,13 @@ public final class NfcActivityManager extends INdefPushCallback.Stub {
}
}
+ /**
+ * onDestroy hook from fragment attached to activity
+ */
+ public void onDestroy(Activity activity) {
+ mNfcState.remove(activity);
+ }
+
public synchronized void setNdefPushMessage(Activity activity, NdefMessage message) {
NfcActivityState state = getOrCreateState(activity, message != null);
if (state == null || state.ndefMessage == message) {
@@ -214,4 +221,5 @@ public final class NfcActivityManager extends INdefPushCallback.Stub {
callback.onNdefPushComplete(mDefaultEvent);
}
}
+
}
diff --git a/core/java/android/nfc/NfcFragment.java b/core/java/android/nfc/NfcFragment.java
index c48859b..17278dc 100644
--- a/core/java/android/nfc/NfcFragment.java
+++ b/core/java/android/nfc/NfcFragment.java
@@ -80,4 +80,14 @@ public final class NfcFragment extends Fragment {
sNfcActivityManager.onPause(getActivity());
}
}
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (sNfcActivityManager != null) {
+ sNfcActivityManager.onDestroy(getActivity());
+ }
+ }
+
+
}