diff options
author | Martijn Coenen <maco@google.com> | 2014-09-24 03:37:21 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-09-24 03:37:21 +0000 |
commit | d7de1b6cdf389ae5d4dc28152a0938a52d77ab2a (patch) | |
tree | 19f79772e94326a2aada3fbc2d845853c6c2b18e /nci | |
parent | 337da15e07004f83aec15ba9bc703bcccfc859cb (diff) | |
parent | 269280d26f6a21f08c6dec7fd9a82eaa48d11d14 (diff) | |
download | android_packages_apps_Nfc-d7de1b6cdf389ae5d4dc28152a0938a52d77ab2a.tar.gz android_packages_apps_Nfc-d7de1b6cdf389ae5d4dc28152a0938a52d77ab2a.tar.bz2 android_packages_apps_Nfc-d7de1b6cdf389ae5d4dc28152a0938a52d77ab2a.zip |
am 269280d2: am f863f79a: Merge "Shutdown EEs when NFC is disabled." into lmp-dev
* commit '269280d26f6a21f08c6dec7fd9a82eaa48d11d14':
Shutdown EEs when NFC is disabled.
Diffstat (limited to 'nci')
-rwxr-xr-x | nci/jni/NativeNfcManager.cpp | 1 | ||||
-rw-r--r-- | nci/jni/RoutingManager.cpp | 46 | ||||
-rw-r--r-- | nci/jni/RoutingManager.h | 2 |
3 files changed, 49 insertions, 0 deletions
diff --git a/nci/jni/NativeNfcManager.cpp b/nci/jni/NativeNfcManager.cpp index 57dcb809..5001ee7e 100755 --- a/nci/jni/NativeNfcManager.cpp +++ b/nci/jni/NativeNfcManager.cpp @@ -1210,6 +1210,7 @@ static jboolean nfcManager_doDeinitialize (JNIEnv*, jobject) sIsDisabling = true; pn544InteropAbortNow (); + RoutingManager::getInstance().onNfccShutdown(); PowerSwitch::getInstance ().initialize (PowerSwitch::UNKNOWN_LEVEL); if (sIsNfaEnabled) diff --git a/nci/jni/RoutingManager.cpp b/nci/jni/RoutingManager.cpp index 79b417e8..c0827ca9 100644 --- a/nci/jni/RoutingManager.cpp +++ b/nci/jni/RoutingManager.cpp @@ -41,6 +41,8 @@ const JNINativeMethod RoutingManager::sMethods [] = {"doGetAidMatchingMode", "()I", (void*) RoutingManager::com_android_nfc_cardemulation_doGetAidMatchingMode} }; +static const int MAX_NUM_EE = 5; + RoutingManager::RoutingManager () { static const char fn [] = "RoutingManager::RoutingManager()"; @@ -259,6 +261,48 @@ bool RoutingManager::commitRouting() return (nfaStat == NFA_STATUS_OK); } +void RoutingManager::onNfccShutdown () +{ + static const char fn [] = "RoutingManager:onNfccShutdown"; + if (mActiveSe == 0x00) return; + + tNFA_STATUS nfaStat = NFA_STATUS_FAILED; + UINT8 actualNumEe = MAX_NUM_EE; + tNFA_EE_INFO eeInfo[MAX_NUM_EE]; + + memset (&eeInfo, 0, sizeof(eeInfo)); + if ((nfaStat = NFA_EeGetInfo (&actualNumEe, eeInfo)) != NFA_STATUS_OK) + { + ALOGE ("%s: fail get info; error=0x%X", fn, nfaStat); + return; + } + if (actualNumEe != 0) + { + for (UINT8 xx = 0; xx < actualNumEe; xx++) + { + if ((eeInfo[xx].num_interface != 0) + && (eeInfo[xx].ee_interface[0] != NCI_NFCEE_INTERFACE_HCI_ACCESS) + && (eeInfo[xx].ee_status == NFA_EE_STATUS_ACTIVE)) + { + ALOGD ("%s: Handle: 0x%04x Change Status Active to Inactive", fn, eeInfo[xx].ee_handle); + SyncEventGuard guard (mEeSetModeEvent); + if ((nfaStat = NFA_EeModeSet (eeInfo[xx].ee_handle, NFA_EE_MD_DEACTIVATE)) == NFA_STATUS_OK) + { + mEeSetModeEvent.wait (); //wait for NFA_EE_MODE_SET_EVT + } + else + { + ALOGE ("Failed to set EE inactive"); + } + } + } + } + else + { + ALOGD ("%s: No active EEs found", fn); + } +} + void RoutingManager::notifyActivated () { JNIEnv* e = NULL; @@ -433,8 +477,10 @@ void RoutingManager::nfaEeCallback (tNFA_EE_EVT event, tNFA_EE_CBACK_DATA* event case NFA_EE_MODE_SET_EVT: { + SyncEventGuard guard (routingManager.mEeSetModeEvent); ALOGD ("%s: NFA_EE_MODE_SET_EVT; status: 0x%04X handle: 0x%04X ", fn, eventData->mode_set.status, eventData->mode_set.ee_handle); + routingManager.mEeSetModeEvent.notifyOne(); } break; diff --git a/nci/jni/RoutingManager.h b/nci/jni/RoutingManager.h index 65ea3edb..ea04066d 100644 --- a/nci/jni/RoutingManager.h +++ b/nci/jni/RoutingManager.h @@ -38,6 +38,7 @@ public: bool addAidRouting(const UINT8* aid, UINT8 aidLen, int route); bool removeAidRouting(const UINT8* aid, UINT8 aidLen); bool commitRouting(); + void onNfccShutdown(); int registerJniFunctions (JNIEnv* e); private: RoutingManager(); @@ -81,5 +82,6 @@ private: SyncEvent mRoutingEvent; SyncEvent mEeUpdateEvent; SyncEvent mEeInfoEvent; + SyncEvent mEeSetModeEvent; }; |