Merge "Test: Adding test cases for PreferredSubscriptionService" into main
diff --git a/NfcNci/nci/jni/NativeNfcManager.cpp b/NfcNci/nci/jni/NativeNfcManager.cpp
index 6d4ce1d..68e9166 100644
--- a/NfcNci/nci/jni/NativeNfcManager.cpp
+++ b/NfcNci/nci/jni/NativeNfcManager.cpp
@@ -436,6 +436,7 @@
case NFA_ACTIVATED_EVT: // NFC link/protocol activated
{
+ bool notListen = !isListenMode(eventData->activated);
LOG(DEBUG) << StringPrintf(
"%s: NFA_ACTIVATED_EVT: gIsSelectingRfInterface=%d, sIsDisabling=%d",
__func__, gIsSelectingRfInterface, sIsDisabling);
@@ -458,47 +459,48 @@
nativeNfcTag_setActivatedRfProtocol(activatedProtocol);
nativeNfcTag_setActivatedRfMode(activatedMode);
}
- NfcTag::getInstance().setActive(true);
+ NfcTag::getInstance().setActive(notListen);
if (sIsDisabling || !sIsNfaEnabled) break;
gActivated = true;
- updateNfcID0Param(
- eventData->activated.activate_ntf.rf_tech_param.param.pb.nfcid0);
- NfcTag::getInstance().setActivationState();
- if (gIsSelectingRfInterface) {
- nativeNfcTag_doConnectStatus(true);
- break;
- }
-
- nativeNfcTag_resetPresenceCheck();
- if (!isListenMode(eventData->activated) &&
- (prevScreenState == NFA_SCREEN_STATE_OFF_LOCKED ||
- prevScreenState == NFA_SCREEN_STATE_OFF_UNLOCKED)) {
- if (!sIsAlwaysPolling) {
- NFA_Deactivate(FALSE);
+ if (notListen) {
+ updateNfcID0Param(
+ eventData->activated.activate_ntf.rf_tech_param.param.pb.nfcid0);
+ NfcTag::getInstance().setActivationState();
+ if (gIsSelectingRfInterface) {
+ nativeNfcTag_doConnectStatus(true);
+ break;
}
- }
- NfcTag::getInstance().connectionEventHandler(connEvent, eventData);
- if (NfcTag::getInstance().getNumDiscNtf()) {
- /*If its multiprotocol tag, deactivate tag with current selected
- protocol to sleep . Select tag with next supported protocol after
- deactivation event is received*/
- if (((tNFA_INTF_TYPE)eventData->activated.activate_ntf.intf_param
- .type == NFA_INTERFACE_FRAME)) {
- uint8_t RW_TAG_SLP_REQ[] = {0x50, 0x00};
- SyncEvent waitSome;
- SyncEventGuard g(waitSome);
- NFA_SendRawFrame(RW_TAG_SLP_REQ, sizeof(RW_TAG_SLP_REQ), 0);
- waitSome.wait(4);
+ nativeNfcTag_resetPresenceCheck();
+ if (!isListenMode(eventData->activated) &&
+ (prevScreenState == NFA_SCREEN_STATE_OFF_LOCKED ||
+ prevScreenState == NFA_SCREEN_STATE_OFF_UNLOCKED)) {
+ if (!sIsAlwaysPolling) {
+ NFA_Deactivate(FALSE);
+ }
}
- NFA_Deactivate(true);
- }
- // If it activated in
- // listen mode then it is likely for an SE transaction.
- // Send the RF Event.
- if (isListenMode(eventData->activated)) {
+ NfcTag::getInstance().connectionEventHandler(connEvent, eventData);
+ if (NfcTag::getInstance().getNumDiscNtf()) {
+ /*If its multiprotocol tag, deactivate tag with current selected
+ protocol to sleep . Select tag with next supported protocol after
+ deactivation event is received*/
+ if (((tNFA_INTF_TYPE)eventData->activated.activate_ntf.intf_param
+ .type == NFA_INTERFACE_FRAME)) {
+ uint8_t RW_TAG_SLP_REQ[] = {0x50, 0x00};
+ SyncEvent waitSome;
+ SyncEventGuard g(waitSome);
+ NFA_SendRawFrame(RW_TAG_SLP_REQ, sizeof(RW_TAG_SLP_REQ), 0);
+ waitSome.wait(4);
+ }
+ NFA_Deactivate(true);
+ }
+
+ } else {
+ // If it activated in
+ // listen mode then it is likely for an SE transaction.
+ // Send the RF Event.
sSeRfActive = true;
struct nfc_jni_native_data* nat = getNative(NULL, NULL);
if (!nat) {
@@ -2018,7 +2020,8 @@
*******************************************************************************/
static jboolean nfcManager_doDeinitialize(JNIEnv*, jobject) {
if (sIsShuttingDown) return false;
- LOG(DEBUG) << StringPrintf("%s: enter", __func__);
+ LOG(DEBUG) << StringPrintf("%s: enter, sIsRecovering=%d", __func__,
+ sIsRecovering);
if (gPartialInitMode != ENABLE_MODE_DEFAULT) {
return doPartialDeinit();
}
@@ -2039,10 +2042,13 @@
NFA_DisableDtamode();
}
- tNFA_STATUS stat = NFA_Disable(TRUE /* graceful */);
+ tNFA_STATUS stat = NFA_Disable(!sIsRecovering);
if (stat == NFA_STATUS_OK) {
LOG(DEBUG) << StringPrintf("%s: wait for completion", __func__);
- sNfaDisableEvent.wait(); // wait for NFA command to finish
+ if (!sNfaDisableEvent.wait(5000)) {
+ LOG(ERROR) << StringPrintf(
+ "%s: NFA_Disable() timeout, keep disabling anyway", __func__);
+ }
} else {
LOG(ERROR) << StringPrintf("%s: fail disable; error=0x%X", __func__,
stat);
@@ -2058,6 +2064,7 @@
sIsDisabling = false;
sReaderModeEnabled = false;
gActivated = false;
+ sRfEnabled = false;
sLfT3tMax = 0;
{
diff --git a/NfcNci/nci/jni/RoutingManager.cpp b/NfcNci/nci/jni/RoutingManager.cpp
index 37a565e..50d79f1 100755
--- a/NfcNci/nci/jni/RoutingManager.cpp
+++ b/NfcNci/nci/jni/RoutingManager.cpp
@@ -71,6 +71,8 @@
static const uint8_t AID_ROUTE_QUAL_PREFIX = 0x10;
+static Mutex sEeInfoMutex;
+static Mutex sEeInfoChangedMutex;
/*******************************************************************************
**
@@ -225,7 +227,7 @@
LOG(ERROR) << fn << ": Failed to register wildcard AID for DH";
// Trigger RT update
- mEeInfoChanged = true;
+ setEeInfoChangedFlag();
mDefaultAidRouteAdded = false;
return true;
@@ -396,13 +398,16 @@
tNFA_STATUS RoutingManager::commitRouting() {
static const char fn[] = "RoutingManager::commitRouting";
tNFA_STATUS nfaStat = 0;
- if (mAidRoutingConfigured || mEeInfoChanged) {
+ sEeInfoChangedMutex.lock();
+ bool eeChanged = mEeInfoChanged;
+ mEeInfoChanged = false;
+ sEeInfoChangedMutex.unlock();
+ if (eeChanged) {
+ clearRoutingEntry(CLEAR_PROTOCOL_ENTRIES | CLEAR_TECHNOLOGY_ENTRIES);
+ updateRoutingTable();
+ }
+ if (mAidRoutingConfigured || eeChanged) {
LOG(DEBUG) << StringPrintf("%s: RT update needed", fn);
- if (mEeInfoChanged) {
- clearRoutingEntry(CLEAR_PROTOCOL_ENTRIES | CLEAR_TECHNOLOGY_ENTRIES);
- updateRoutingTable();
- mEeInfoChanged = false;
- }
{
SyncEventGuard guard(mEeUpdateEvent);
nfaStat = NFA_EeUpdateNow();
@@ -850,7 +855,7 @@
void RoutingManager::updateIsoDepProtocolRoute(int route) {
static const char fn[] = "RoutingManager::updateIsoDepProtocolRoute";
LOG(DEBUG) << StringPrintf("%s: New default ISO-DEP route=0x%x", fn, route);
- mEeInfoChanged = true;
+ setEeInfoChangedFlag();
mDefaultIsoDepRoute = route;
}
@@ -866,7 +871,7 @@
void RoutingManager::updateSystemCodeRoute(int route) {
static const char fn[] = "RoutingManager::updateSystemCodeRoute";
LOG(DEBUG) << StringPrintf("%s: New default SC route=0x%x", fn, route);
- mEeInfoChanged = true;
+ setEeInfoChangedFlag();
mDefaultSysCodeRoute = route;
updateDefaultRoute();
}
@@ -969,20 +974,18 @@
defaultAidRoute = NFC_DH_ID;
}
- // Default AID route should be added only if different from ISO-DEP route
- if ((defaultAidRoute != mDefaultIsoDepRoute) ||
- (mDefaultIsoDepRoute == NFC_DH_ID)) {
- removeAidRouting(nullptr, 0);
- uint8_t powerState = 0x01;
- if (!mSecureNfcEnabled)
- powerState =
- (defaultAidRoute != 0x00) ? mOffHostAidRoutingPowerState : 0x11;
- nfaStat = NFA_EeAddAidRouting(defaultAidRoute, 0, NULL, powerState,
- AID_ROUTE_QUAL_PREFIX);
- if (nfaStat != NFA_STATUS_OK)
- LOG(ERROR) << fn << ": failed to register zero length AID";
- else
- mDefaultAidRouteAdded = true;
+ removeAidRouting(nullptr, 0);
+ uint8_t powerState = 0x01;
+ if (!mSecureNfcEnabled) {
+ powerState =
+ (defaultAidRoute != 0x00) ? mOffHostAidRoutingPowerState : 0x11;
+ }
+ nfaStat = NFA_EeAddAidRouting(defaultAidRoute, 0, NULL, powerState,
+ AID_ROUTE_QUAL_PREFIX);
+ if (nfaStat != NFA_STATUS_OK) {
+ LOG(ERROR) << fn << ": failed to register zero length AID";
+ } else {
+ mDefaultAidRouteAdded = true;
}
}
}
@@ -1020,7 +1023,13 @@
static const char fn[] = "RoutingManager::updateEeTechRouteSetting";
tNFA_TECHNOLOGY_MASK allSeTechMask = 0x00, hostTechMask = 0x00;
- LOG(DEBUG) << StringPrintf("%s: Default route A/B=0x%x", fn,
+ // Get content of mEeInfo as it can change if a NTF is received during update
+ // of RT
+ sEeInfoMutex.lock();
+ tNFA_EE_DISCOVER_REQ localEeInfo;
+ memcpy(&localEeInfo, &mEeInfo, sizeof(mEeInfo));
+ sEeInfoMutex.unlock();
+ LOG(DEBUG) << StringPrintf("%s: Default route A/B: 0x%x", fn,
mDefaultOffHostRoute);
LOG(DEBUG) << StringPrintf("%s: Default route F=0x%x", fn,
mDefaultFelicaRoute);
@@ -1029,31 +1038,31 @@
tNFA_STATUS nfaStat;
- for (uint8_t i = 0; i < mEeInfo.num_ee; i++) {
- tNFA_HANDLE eeHandle = mEeInfo.ee_disc_info[i].ee_handle;
+ for (uint8_t i = 0; i < localEeInfo.num_ee; i++) {
+ tNFA_HANDLE eeHandle = localEeInfo.ee_disc_info[i].ee_handle;
tNFA_TECHNOLOGY_MASK seTechMask = 0;
LOG(DEBUG) << StringPrintf(
- "%s EE[%u] Handle=0x%04x techA=0x%02x techB=0x%02x techF=0x%02x "
- "techBprime=0x%02x",
- fn, i, eeHandle, mEeInfo.ee_disc_info[i].la_protocol,
- mEeInfo.ee_disc_info[i].lb_protocol,
- mEeInfo.ee_disc_info[i].lf_protocol,
- mEeInfo.ee_disc_info[i].lbp_protocol);
+ "%s: EE[%u] Handle=0x%04x techA=0x%02x techB="
+ "0x%02x techF=0x%02x techBprime=0x%02x",
+ fn, i, eeHandle, localEeInfo.ee_disc_info[i].la_protocol,
+ localEeInfo.ee_disc_info[i].lb_protocol,
+ localEeInfo.ee_disc_info[i].lf_protocol,
+ localEeInfo.ee_disc_info[i].lbp_protocol);
if ((mDefaultOffHostRoute != NFC_DH_ID) &&
(eeHandle == (mDefaultOffHostRoute | NFA_HANDLE_GROUP_EE))) {
- if (mEeInfo.ee_disc_info[i].la_protocol != 0) {
+ if (localEeInfo.ee_disc_info[i].la_protocol != 0) {
seTechMask |= NFA_TECHNOLOGY_MASK_A;
}
- if (mEeInfo.ee_disc_info[i].lb_protocol != 0) {
+ if (localEeInfo.ee_disc_info[i].lb_protocol != 0) {
seTechMask |= NFA_TECHNOLOGY_MASK_B;
}
}
if ((mDefaultFelicaRoute != NFC_DH_ID) &&
(eeHandle == (mDefaultFelicaRoute | NFA_HANDLE_GROUP_EE))) {
- if (mEeInfo.ee_disc_info[i].lf_protocol != 0) {
+ if (localEeInfo.ee_disc_info[i].lf_protocol != 0) {
seTechMask |= NFA_TECHNOLOGY_MASK_F;
}
}
@@ -1216,20 +1225,22 @@
case NFA_EE_DISCOVER_REQ_EVT: {
SyncEventGuard guard(routingManager.mEeInfoEvent);
+ sEeInfoMutex.lock();
memcpy(&routingManager.mEeInfo, &eventData->discover_req,
sizeof(routingManager.mEeInfo));
for (int i = 0; i < eventData->discover_req.num_ee; i++) {
LOG(DEBUG) << StringPrintf(
- "%s; NFA_EE_DISCOVER_REQ_EVT; nfceeId=0x%X; la_proto=0x%X, "
+ "%s: NFA_EE_DISCOVER_REQ_EVT; nfceeId=0x%X; la_proto=0x%X, "
"lb_proto=0x%x, lf_proto=0x%x",
fn, eventData->discover_req.ee_disc_info[i].ee_handle,
eventData->discover_req.ee_disc_info[i].la_protocol,
eventData->discover_req.ee_disc_info[i].lb_protocol,
eventData->discover_req.ee_disc_info[i].lf_protocol);
}
+ sEeInfoMutex.unlock();
if (!routingManager.mIsRFDiscoveryOptimized) {
if (routingManager.mReceivedEeInfo && !routingManager.mDeinitializing) {
- routingManager.mEeInfoChanged = true;
+ routingManager.setEeInfoChangedFlag();
routingManager.notifyEeUpdated();
}
}
@@ -1243,7 +1254,7 @@
eventData->discover_req.status, eventData->discover_req.num_ee);
if (routingManager.mIsRFDiscoveryOptimized) {
if (routingManager.mReceivedEeInfo && !routingManager.mDeinitializing) {
- routingManager.mEeInfoChanged = true;
+ routingManager.setEeInfoChangedFlag();
routingManager.notifyEeUpdated();
}
}
@@ -1365,7 +1376,7 @@
return NFA_HANDLE_INVALID;
}
LOG(DEBUG) << StringPrintf("%s: Succeed to register system code on DH", fn);
- mEeInfoChanged = true;
+ setEeInfoChangedFlag();
// add handle and system code pair to the map
mMapScbrHandle.emplace(mNfcFOnDhHandle, systemCode);
} else {
@@ -1411,7 +1422,7 @@
tNFA_STATUS nfaStat = NFA_EeRemoveSystemCodeRouting(systemCode);
if (nfaStat == NFA_STATUS_OK) {
mRoutingEvent.wait();
- mEeInfoChanged = true;
+ setEeInfoChangedFlag();
LOG(DEBUG) << StringPrintf(
"%s: Succeeded in deregistering system Code on DH", fn);
} else {
@@ -1579,7 +1590,7 @@
// Setting flag for Ee info changed so that
// routing table can be updated
- mEeInfoChanged = true;
+ setEeInfoChangedFlag();
}
/*******************************************************************************
@@ -1598,6 +1609,23 @@
/*******************************************************************************
**
+** Function: setEeInfoChangedFlag
+**
+** Description: .
+**
+** Returns: None
+**
+*******************************************************************************/
+void RoutingManager::setEeInfoChangedFlag() {
+ static const char fn[] = "RoutingManager::setEeInfoChangedFlag";
+ LOG(DEBUG) << StringPrintf("%s", fn);
+ sEeInfoChangedMutex.lock();
+ mEeInfoChanged = true;
+ sEeInfoChangedMutex.unlock();
+}
+
+/*******************************************************************************
+**
** Function: registerJniFunctions
**
** Description: called at object creation to register JNI function
diff --git a/NfcNci/nci/jni/RoutingManager.h b/NfcNci/nci/jni/RoutingManager.h
index d38343c..d72351e 100755
--- a/NfcNci/nci/jni/RoutingManager.h
+++ b/NfcNci/nci/jni/RoutingManager.h
@@ -54,6 +54,7 @@
void notifyEeProtocolSelected(uint8_t protocol, tNFA_HANDLE ee_handle);
void notifyEeTechSelected(uint8_t tech, tNFA_HANDLE ee_handle);
bool getNameOfEe(tNFA_HANDLE ee_handle, std::string& eeName);
+ void setEeInfoChangedFlag();
static const int CLEAR_AID_ENTRIES = 0x01;
static const int CLEAR_PROTOCOL_ENTRIES = 0x02;
diff --git a/NfcNci/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java b/NfcNci/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
index 77e81a5..d525e8a 100644
--- a/NfcNci/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
+++ b/NfcNci/nci/src/com/android/nfc/dhimpl/NativeNfcManager.java
@@ -532,21 +532,21 @@
Log.i(TAG, "notifyEeAidSelected: AID= " + HexFormat.of().formatHex(aid) + " selected by "
+ eventSrc);
if (com.android.nfc.flags.Flags.eeAidSelect()) {
- mListener.onSeSelected();
+ mListener.onSeSelected(NfcService.SE_SELECTED_AID);
}
}
private void notifyEeProtocolSelected(int protocol, String eventSrc) {
Log.i(TAG, "notifyEeProtocolSelected: Protocol: " + protocol + " selected by " + eventSrc);
if (com.android.nfc.flags.Flags.eeAidSelect()) {
- mListener.onSeSelected();
+ mListener.onSeSelected(NfcService.SE_SELECTED_PROTOCOL);
}
}
private void notifyEeTechSelected(int tech, String eventSrc) {
Log.i(TAG, "notifyEeTechSelected: Tech: " + tech + " selected by " + eventSrc);
if (com.android.nfc.flags.Flags.eeAidSelect()) {
- mListener.onSeSelected();
+ mListener.onSeSelected(NfcService.SE_SELECTED_TECH);
}
}
diff --git a/NfcNci/src/com/android/nfc/DeviceHost.java b/NfcNci/src/com/android/nfc/DeviceHost.java
index 35df1bc..815bd90 100644
--- a/NfcNci/src/com/android/nfc/DeviceHost.java
+++ b/NfcNci/src/com/android/nfc/DeviceHost.java
@@ -64,7 +64,7 @@
public void onEeListenActivated(boolean isActivated);
- public void onSeSelected();
+ public void onSeSelected(int type);
public void onCommandTimeout();
diff --git a/NfcNci/src/com/android/nfc/NfcService.java b/NfcNci/src/com/android/nfc/NfcService.java
index 91833d9..f79c7ee 100644
--- a/NfcNci/src/com/android/nfc/NfcService.java
+++ b/NfcNci/src/com/android/nfc/NfcService.java
@@ -257,6 +257,11 @@
static final int TASK_ENABLE_ALWAYS_ON = 4;
static final int TASK_DISABLE_ALWAYS_ON = 5;
+ // SE selected types
+ public static final int SE_SELECTED_AID = 0x01;
+ public static final int SE_SELECTED_TECH = 0x02;
+ public static final int SE_SELECTED_PROTOCOL = 0x04;
+
// Polling technology masks
static final int NFC_POLL_A = 0x01;
static final int NFC_POLL_B = 0x02;
@@ -777,8 +782,10 @@
mRtUpdateScheduledTask =
mRtUpdateScheduler.schedule(
() -> {
- if (DBG) Log.d(TAG, "onEeUpdated: ApplyRoutingTask");
- new ApplyRoutingTask().execute();
+ if (mIsHceCapable) {
+ if (DBG) Log.d(TAG, "onEeUpdated: trigger routing table update");
+ mCardEmulationManager.onTriggerRoutingTableUpdate();
+ }
},
50,
TimeUnit.MILLISECONDS);
@@ -885,8 +892,8 @@
}
@Override
- public void onSeSelected() {
- sendMessage(MSG_SE_SELECTED_EVENT, null);
+ public void onSeSelected(int type) {
+ sendMessage(MSG_SE_SELECTED_EVENT, type);
}
@Override
@@ -2515,7 +2522,7 @@
}
if (mIsHceCapable) {
// update HCE/HCEF routing and commitRouting if Nfc is enabled
- mCardEmulationManager.onSecureNfcToggled();
+ mCardEmulationManager.onTriggerRoutingTableUpdate();
} else if (isNfcEnabled()) {
// commit only tech/protocol route without HCE support
mDeviceHost.commitRouting();
@@ -5241,7 +5248,8 @@
case MSG_SE_SELECTED_EVENT:
Log.d(TAG, "handleMessage: MSG_SE_SELECTED_EVENT");
- if (mCardEmulationManager != null) {
+ int type = (int) msg.obj;
+ if (mCardEmulationManager != null && type == SE_SELECTED_AID) {
mCardEmulationManager.onOffHostAidSelected();
}
break;
diff --git a/NfcNci/src/com/android/nfc/cardemulation/AidRoutingManager.java b/NfcNci/src/com/android/nfc/cardemulation/AidRoutingManager.java
index d7250e0..fc8b688 100644
--- a/NfcNci/src/com/android/nfc/cardemulation/AidRoutingManager.java
+++ b/NfcNci/src/com/android/nfc/cardemulation/AidRoutingManager.java
@@ -443,41 +443,34 @@
}
}
- // register default route in below cases:
- // 1. mDefaultRoute is different with mDefaultIsoDepRoute
- // 2. mDefaultRoute and mDefaultIsoDepRoute all equal to ROUTE_HOST
- // , which is used for screen off HCE scenarios
- if (mDefaultRoute != mDefaultIsoDepRoute || mDefaultIsoDepRoute == ROUTE_HOST) {
- if (NfcService.getInstance().getNciVersion()
- >= NfcService.getInstance().NCI_VERSION_2_0) {
- String emptyAid = "";
- AidEntry entry = new AidEntry();
- int default_route_power_state;
- entry.route = mDefaultRoute;
- if (mDefaultRoute == ROUTE_HOST) {
- entry.isOnHost = true;
- default_route_power_state = RegisteredAidCache.POWER_STATE_SWITCH_ON
- | RegisteredAidCache.POWER_STATE_SCREEN_ON_LOCKED;
- Set<String> aidsForDefaultRoute = mAidRoutingTable.get(mDefaultRoute);
- if (aidsForDefaultRoute != null) {
- for (String aid : aidsForDefaultRoute) {
- default_route_power_state |= aidMap.get(aid).power;
- }
+ if (NfcService.getInstance().getNciVersion()
+ >= NfcService.getInstance().NCI_VERSION_2_0) {
+ String emptyAid = "";
+ AidEntry entry = new AidEntry();
+ int default_route_power_state;
+ entry.route = mDefaultRoute;
+ if (mDefaultRoute == ROUTE_HOST) {
+ entry.isOnHost = true;
+ default_route_power_state = RegisteredAidCache.POWER_STATE_SWITCH_ON
+ | RegisteredAidCache.POWER_STATE_SCREEN_ON_LOCKED;
+ Set<String> aidsForDefaultRoute = mAidRoutingTable.get(mDefaultRoute);
+ if (aidsForDefaultRoute != null) {
+ for (String aid : aidsForDefaultRoute) {
+ default_route_power_state |= aidMap.get(aid).power;
}
- } else {
- entry.isOnHost = false;
- default_route_power_state = RegisteredAidCache.POWER_STATE_ALL;
}
- if (mPowerEmptyAid != default_route_power_state) {
- isPowerStateUpdated = true;
- }
- mPowerEmptyAid = default_route_power_state;
- entry.aidInfo = RegisteredAidCache.AID_ROUTE_QUAL_PREFIX;
- entry.power = default_route_power_state;
-
- aidRoutingTableCache.put(emptyAid, entry);
- if (DBG) Log.d(TAG, "configureRouting: Add emptyAid into AidRoutingTable");
+ } else {
+ entry.isOnHost = false;
+ default_route_power_state = RegisteredAidCache.POWER_STATE_ALL;
}
+ if (mPowerEmptyAid != default_route_power_state) {
+ isPowerStateUpdated = true;
+ }
+ mPowerEmptyAid = default_route_power_state;
+ entry.aidInfo = RegisteredAidCache.AID_ROUTE_QUAL_PREFIX;
+ entry.power = default_route_power_state;
+ aidRoutingTableCache.put(emptyAid, entry);
+ if (DBG) Log.d(TAG, "configureRouting: Add emptyAid into AidRoutingTable");
}
// Register additional offhost AIDs when their support power states are
diff --git a/NfcNci/src/com/android/nfc/cardemulation/CardEmulationManager.java b/NfcNci/src/com/android/nfc/cardemulation/CardEmulationManager.java
index fea52e8..67ab85c 100644
--- a/NfcNci/src/com/android/nfc/cardemulation/CardEmulationManager.java
+++ b/NfcNci/src/com/android/nfc/cardemulation/CardEmulationManager.java
@@ -404,9 +404,10 @@
mEnabledNfcFServices.onNfcDisabled();
}
- public void onSecureNfcToggled() {
- mAidCache.onSecureNfcToggled();
- mT3tIdentifiersCache.onSecureNfcToggled();
+ public void onTriggerRoutingTableUpdate() {
+ if (DBG) Log.d(TAG, "onTriggerRoutingTableUpdate");
+ mAidCache.onTriggerRoutingTableUpdate();
+ mT3tIdentifiersCache.onTriggerRoutingTableUpdate();
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
diff --git a/NfcNci/src/com/android/nfc/cardemulation/RegisteredAidCache.java b/NfcNci/src/com/android/nfc/cardemulation/RegisteredAidCache.java
index 3082c8c..500b3a6 100644
--- a/NfcNci/src/com/android/nfc/cardemulation/RegisteredAidCache.java
+++ b/NfcNci/src/com/android/nfc/cardemulation/RegisteredAidCache.java
@@ -1516,7 +1516,7 @@
}
}
- public void onSecureNfcToggled() {
+ public void onTriggerRoutingTableUpdate() {
synchronized (mLock) {
updateRoutingLocked(true, false);
}
diff --git a/NfcNci/src/com/android/nfc/cardemulation/RegisteredT3tIdentifiersCache.java b/NfcNci/src/com/android/nfc/cardemulation/RegisteredT3tIdentifiersCache.java
index 1f2cb08..41e8866 100644
--- a/NfcNci/src/com/android/nfc/cardemulation/RegisteredT3tIdentifiersCache.java
+++ b/NfcNci/src/com/android/nfc/cardemulation/RegisteredT3tIdentifiersCache.java
@@ -181,10 +181,10 @@
mRoutingManager.configureRouting(t3tIdentifiers);
}
- public void onSecureNfcToggled() {
+ public void onTriggerRoutingTableUpdate() {
synchronized(mLock) {
updateRoutingLocked(true);
- }
+ }
}
public void onServicesUpdated(int userId, List<NfcFServiceInfo> services) {
diff --git a/NfcNci/tests/unit/src/com/android/nfc/NfcServiceTest.java b/NfcNci/tests/unit/src/com/android/nfc/NfcServiceTest.java
index 22b18a9..6bafec4 100644
--- a/NfcNci/tests/unit/src/com/android/nfc/NfcServiceTest.java
+++ b/NfcNci/tests/unit/src/com/android/nfc/NfcServiceTest.java
@@ -1375,7 +1375,7 @@
@Test
public void testOnSeSelected() {
- mNfcService.onSeSelected();
+ mNfcService.onSeSelected(NfcService.SE_SELECTED_AID);
mLooper.dispatchAll();
verify(mCardEmulationManager).onOffHostAidSelected();
}
@@ -2068,7 +2068,7 @@
verify(mBackupManager).dataChanged();
verify(mDeviceHost).setNfcSecure(true);
verify(mNfcEventLog, times(2)).logEvent(any());
- verify(mCardEmulationManager).onSecureNfcToggled();
+ verify(mCardEmulationManager).onTriggerRoutingTableUpdate();
}
@Test
diff --git a/NfcNci/tests/unit/src/com/android/nfc/cardemulation/CardEmulationManagerTest.java b/NfcNci/tests/unit/src/com/android/nfc/cardemulation/CardEmulationManagerTest.java
index fbf52a7..574ad68 100644
--- a/NfcNci/tests/unit/src/com/android/nfc/cardemulation/CardEmulationManagerTest.java
+++ b/NfcNci/tests/unit/src/com/android/nfc/cardemulation/CardEmulationManagerTest.java
@@ -78,7 +78,6 @@
import com.android.nfc.NfcInjector;
import com.android.nfc.NfcPermissions;
import com.android.nfc.NfcService;
-import com.android.nfc.R;
import com.android.nfc.cardemulation.util.StatsdUtils;
import com.android.nfc.cardemulation.util.TelephonyUtils;
import com.android.nfc.flags.Flags;
@@ -436,10 +435,10 @@
@Test
public void testOnSecureNfcToggled() {
- mCardEmulationManager.onSecureNfcToggled();
+ mCardEmulationManager.onTriggerRoutingTableUpdate();
- verify(mRegisteredAidCache).onSecureNfcToggled();
- verify(mRegisteredT3tIdentifiersCache).onSecureNfcToggled();
+ verify(mRegisteredAidCache).onTriggerRoutingTableUpdate();
+ verify(mRegisteredT3tIdentifiersCache).onTriggerRoutingTableUpdate();
}
@Test
diff --git a/NfcNci/tests/unit/src/com/android/nfc/cardemulation/RegisteredT3tIdentifiersCacheTest.java b/NfcNci/tests/unit/src/com/android/nfc/cardemulation/RegisteredT3tIdentifiersCacheTest.java
index b9f6f1e..63e04aa 100644
--- a/NfcNci/tests/unit/src/com/android/nfc/cardemulation/RegisteredT3tIdentifiersCacheTest.java
+++ b/NfcNci/tests/unit/src/com/android/nfc/cardemulation/RegisteredT3tIdentifiersCacheTest.java
@@ -38,11 +38,6 @@
import com.android.dx.mockito.inline.extended.ExtendedMockito;
import com.android.nfc.cardemulation.RegisteredT3tIdentifiersCache.T3tIdentifier;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -50,11 +45,15 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
import org.mockito.quality.Strictness;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
@RunWith(AndroidJUnit4.class)
public class RegisteredT3tIdentifiersCacheTest {
@@ -155,7 +154,7 @@
cache = new RegisteredT3tIdentifiersCache(mContext, mRoutingManager);
cache.mNfcEnabled = false;
- cache.onSecureNfcToggled();
+ cache.onTriggerRoutingTableUpdate();
verify(mRoutingManager, never()).configureRouting(any());
}
@@ -166,7 +165,7 @@
cache.mNfcEnabled = true;
cache.mForegroundT3tIdentifiersCache.put(NFCID2, mNfcFServiceInfo);
- cache.onSecureNfcToggled();
+ cache.onTriggerRoutingTableUpdate();
verify(mRoutingManager, times(2)).configureRouting(identifiersCaptor.capture());
List<T3tIdentifier> firstList = identifiersCaptor.getAllValues().get(0);
@@ -331,4 +330,4 @@
list.add(mNfcFServiceInfo);
return list;
}
-}
\ No newline at end of file
+}
diff --git a/libnfc-nci/src/nfc/nfc/nfc_ncif.cc b/libnfc-nci/src/nfc/nfc/nfc_ncif.cc
index a1595ca..47be304 100644
--- a/libnfc-nci/src/nfc/nfc/nfc_ncif.cc
+++ b/libnfc-nci/src/nfc/nfc/nfc_ncif.cc
@@ -1775,7 +1775,10 @@
data_cevt.p_data = p_evt;
/* adjust payload, if needed */
- if (p_cb->conn_id == NFC_RF_CONN_ID && p_evt->len) {
+ // On RF raw fragmented frames, data status is present
+ // only on last fragment
+ if ((p_cb->conn_id == NFC_RF_CONN_ID) &&
+ (p_evt->layer_specific & NFC_RAS_FRAGMENTED) && p_evt->len) {
/* if NCI_PROTOCOL_T1T/NCI_PROTOCOL_T2T/NCI_PROTOCOL_T3T, the status
* byte needs to be removed
*/