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
          */