diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java index b749d695bdc8d..7d0cf9c7e4584 100644 --- a/core/java/android/nfc/NfcAdapter.java +++ b/core/java/android/nfc/NfcAdapter.java @@ -642,6 +642,7 @@ public static synchronized NfcAdapter getNfcAdapter(Context context) { try { sTagService = sService.getNfcTagInterface(); } catch (RemoteException e) { + sTagService = null; Log.e(TAG, "could not retrieve NFC Tag service"); throw new UnsupportedOperationException(); } @@ -650,12 +651,14 @@ public static synchronized NfcAdapter getNfcAdapter(Context context) { try { sNfcFCardEmulationService = sService.getNfcFCardEmulationInterface(); } catch (RemoteException e) { + sNfcFCardEmulationService = null; Log.e(TAG, "could not retrieve NFC-F card emulation service"); throw new UnsupportedOperationException(); } try { sCardEmulationService = sService.getNfcCardEmulationInterface(); } catch (RemoteException e) { + sCardEmulationService = null; Log.e(TAG, "could not retrieve card emulation service"); throw new UnsupportedOperationException(); } @@ -838,30 +841,54 @@ public void attemptDeadServiceRecovery(Exception e) { // assigning to sService is not thread-safe, but this is best-effort code // and on a well-behaved system should never happen sService = service; - try { - sTagService = service.getNfcTagInterface(); - } catch (RemoteException ee) { - Log.e(TAG, "could not retrieve NFC tag service during service recovery"); - // nothing more can be done now, sService is still stale, we'll hit - // this recovery path again later - return; + if (sHasNfcFeature) { + try { + sTagService = service.getNfcTagInterface(); + } catch (RemoteException ee) { + sTagService = null; + Log.e(TAG, "could not retrieve NFC tag service during service recovery"); + // nothing more can be done now, sService is still stale, we'll hit + // this recovery path again later + return; + } } - try { - sCardEmulationService = service.getNfcCardEmulationInterface(); - } catch (RemoteException ee) { - Log.e(TAG, "could not retrieve NFC card emulation service during service recovery"); - } + if (sHasCeFeature) { + try { + sCardEmulationService = service.getNfcCardEmulationInterface(); + } catch (RemoteException ee) { + sCardEmulationService = null; + Log.e(TAG, + "could not retrieve NFC card emulation service during service recovery"); + } - try { - sNfcFCardEmulationService = service.getNfcFCardEmulationInterface(); - } catch (RemoteException ee) { - Log.e(TAG, "could not retrieve NFC-F card emulation service during service recovery"); + try { + sNfcFCardEmulationService = service.getNfcFCardEmulationInterface(); + } catch (RemoteException ee) { + sNfcFCardEmulationService = null; + Log.e(TAG, + "could not retrieve NFC-F card emulation service during service recovery"); + } } return; } + private boolean isCardEmulationEnabled() { + if (sHasCeFeature) { + return (sCardEmulationService != null || sNfcFCardEmulationService != null); + } + return false; + } + + private boolean isTagReadingEnabled() { + if (sHasNfcFeature) { + return sTagService != null; + } + return false; + } + + /** * Return true if this NFC Adapter has any features enabled. * @@ -875,8 +902,9 @@ public void attemptDeadServiceRecovery(Exception e) { * @return true if this NFC Adapter has any features enabled */ public boolean isEnabled() { + boolean serviceState = false; try { - return sService.getState() == STATE_ON; + serviceState = sService.getState() == STATE_ON; } catch (RemoteException e) { attemptDeadServiceRecovery(e); // Try one more time @@ -885,12 +913,12 @@ public boolean isEnabled() { return false; } try { - return sService.getState() == STATE_ON; + serviceState = sService.getState() == STATE_ON; } catch (RemoteException ee) { Log.e(TAG, "Failed to recover NFC Service."); } - return false; } + return serviceState && (isTagReadingEnabled() || isCardEmulationEnabled()); } /**