From 678a7025ddb250de2a26cabc51402ff4e67752a8 Mon Sep 17 00:00:00 2001 From: Nick Pelly Date: Mon, 14 Nov 2011 14:22:52 -0800 Subject: Enforce 1-1 relationship between context and NfcAdapterExtras. This fixes a bug where NfcExecutionEnvironment.close() would NPE if you called it on a different EE to the one you opened. We now always return the same EE in the same contet. Change-Id: I949998dc2ee738527ee281cae46ae50ea6950a2c --- .../com/android/nfc_extras/NfcAdapterExtras.java | 39 +++++++++++----------- 1 file changed, 20 insertions(+), 19 deletions(-) (limited to 'nfc-extras') diff --git a/nfc-extras/java/com/android/nfc_extras/NfcAdapterExtras.java b/nfc-extras/java/com/android/nfc_extras/NfcAdapterExtras.java index 62213de..9c87c22 100644 --- a/nfc-extras/java/com/android/nfc_extras/NfcAdapterExtras.java +++ b/nfc-extras/java/com/android/nfc_extras/NfcAdapterExtras.java @@ -16,6 +16,8 @@ package com.android.nfc_extras; +import java.util.HashMap; + import android.content.Context; import android.nfc.INfcAdapterExtras; import android.nfc.NfcAdapter; @@ -57,20 +59,22 @@ public final class NfcAdapterExtras { // protected by NfcAdapterExtras.class, and final after first construction, // except for attemptDeadServiceRecovery() when NFC crashes - we accept a // best effort recovery - private static NfcAdapter sAdapter; private static INfcAdapterExtras sService; private static final CardEmulationRoute ROUTE_OFF = new CardEmulationRoute(CardEmulationRoute.ROUTE_OFF, null); + // contents protected by NfcAdapterExtras.class + private static final HashMap sNfcExtras = new HashMap(); + private final NfcExecutionEnvironment mEmbeddedEe; private final CardEmulationRoute mRouteOnWhenScreenOn; - final Context mContext; + private final NfcAdapter mAdapter; final String mPackageName; /** get service handles */ - private static void initService() { - final INfcAdapterExtras service = sAdapter.getNfcAdapterExtrasInterface(); + private static void initService(NfcAdapter adapter) { + final INfcAdapterExtras service = adapter.getNfcAdapterExtrasInterface(); if (service != null) { // Leave stale rather than receive a null value. sService = service; @@ -95,23 +99,20 @@ public final class NfcAdapterExtras { synchronized (NfcAdapterExtras.class) { if (sService == null) { - try { - sAdapter = adapter; - initService(); - } finally { - if (sService == null) { - sAdapter = null; - } - } + initService(adapter); } + NfcAdapterExtras extras = sNfcExtras.get(adapter); + if (extras == null) { + extras = new NfcAdapterExtras(adapter); + sNfcExtras.put(adapter, extras); + } + return extras; } - - return new NfcAdapterExtras(context); } - private NfcAdapterExtras(Context context) { - mContext = context.getApplicationContext(); - mPackageName = context.getPackageName(); + private NfcAdapterExtras(NfcAdapter adapter) { + mAdapter = adapter; + mPackageName = adapter.getContext().getPackageName(); mEmbeddedEe = new NfcExecutionEnvironment(this); mRouteOnWhenScreenOn = new CardEmulationRoute(CardEmulationRoute.ROUTE_ON_WHEN_SCREEN_ON, mEmbeddedEe); @@ -160,8 +161,8 @@ public final class NfcAdapterExtras { */ void attemptDeadServiceRecovery(Exception e) { Log.e(TAG, "NFC Adapter Extras dead - attempting to recover"); - sAdapter.attemptDeadServiceRecovery(e); - initService(); + mAdapter.attemptDeadServiceRecovery(e); + initService(mAdapter); } INfcAdapterExtras getService() { -- cgit v1.1