summaryrefslogtreecommitdiffstats
path: root/nci
diff options
context:
space:
mode:
authorMartijn Coenen <maco@google.com>2014-09-24 03:37:21 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-09-24 03:37:21 +0000
commitd7de1b6cdf389ae5d4dc28152a0938a52d77ab2a (patch)
tree19f79772e94326a2aada3fbc2d845853c6c2b18e /nci
parent337da15e07004f83aec15ba9bc703bcccfc859cb (diff)
parent269280d26f6a21f08c6dec7fd9a82eaa48d11d14 (diff)
downloadandroid_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-xnci/jni/NativeNfcManager.cpp1
-rw-r--r--nci/jni/RoutingManager.cpp46
-rw-r--r--nci/jni/RoutingManager.h2
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;
};