Merge "Add separate checks for Tag Reading and Card Emulation is enabled." into main
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index b749d69..7d0cf9c 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -642,6 +642,7 @@
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 @@
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 @@
// 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 @@
* @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 @@
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());
}
/**