Snap for 4706961 from 641314c190b224db4de3557a9e86c840b3e16bb4 to pi-release

Change-Id: I6cb35c925b24bc678586c17eb228ba6b39d4ac91
diff --git a/src/nfa/ce/nfa_ce_act.cc b/src/nfa/ce/nfa_ce_act.cc
index d737a07..ad39aed 100644
--- a/src/nfa/ce/nfa_ce_act.cc
+++ b/src/nfa/ce/nfa_ce_act.cc
@@ -58,7 +58,17 @@
 
   DLOG_IF(INFO, nfc_debug_enabled)
       << StringPrintf("nfa_ce_handle_t3t_evt: event 0x%x", event);
-
+  /* For the felica on host for nfcFcallback */
+  for (uint8_t idx = 0; idx < NFA_CE_LISTEN_INFO_IDX_INVALID; idx++) {
+    if ((p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_IN_USE) &&
+        (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_FELICA) &&
+        (p_cb->listen_info[idx].flags & NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) {
+      p_cb->idx_cur_active = idx;
+      p_cb->p_active_conn_cback =
+          p_cb->listen_info[p_cb->idx_cur_active].p_conn_cback;
+      break;
+    }
+  }
   switch (event) {
     case CE_T3T_NDEF_UPDATE_START_EVT:
       /* Notify app using callback associated with the active ndef */
@@ -94,6 +104,21 @@
         conn_evt.data.len = p_ce_data->raw_frame.p_data->len;
         (*p_cb->p_active_conn_cback)(NFA_DATA_EVT, &conn_evt);
       } else {
+        /* If we have not notified the app of activation, do so now */
+        if (p_cb->listen_info[p_cb->idx_cur_active].flags &
+            NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND) {
+          p_cb->listen_info[p_cb->idx_cur_active].flags &=
+              ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
+
+          conn_evt.ce_activated.handle =
+              NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active);
+          memcpy(&(conn_evt.ce_activated.activate_ntf),
+                 &p_cb->activation_params, sizeof(tNFC_ACTIVATE_DEVT));
+          conn_evt.ce_activated.status = NFA_STATUS_OK;
+
+          (*p_cb->p_active_conn_cback)(NFA_CE_ACTIVATED_EVT, &conn_evt);
+        }
+        /* Notify app of t3t raw data */
         conn_evt.ce_data.status = p_ce_data->raw_frame.status;
         conn_evt.ce_data.handle =
             (NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)p_cb->idx_cur_active));
@@ -785,6 +810,11 @@
   uint8_t i;
   bool t4t_activate_pending = false;
 
+  bool t3t_activate_pending = false;
+  bool t3t_offhost_entry_found = false;
+  uint8_t t3t_activate_idx = 0;
+  uint8_t t3t_offhost_idx = 0;
+
   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       "protocol=%d", p_ce_msg->activate_ntf.p_activation_params->protocol);
 
@@ -816,8 +846,10 @@
                       p_cb->activation_params.rf_tech_param.param.lf.nfcid2,
                       NCI_RF_F_UID_LEN) == 0)
               /* && (t3t_system_code == p_ce_msg->activation.p_activate_info->rf_tech_param.param.lf.system_code) */) {
-            /* Found listen_info corresponding to this activation */
-            break;
+            p_cb->listen_info[listen_info_idx].flags |=
+                NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
+            t3t_activate_pending = true;
+            t3t_activate_idx = listen_info_idx;
           }
         }
 
@@ -826,12 +858,24 @@
              NFA_CE_LISTEN_INFO_UICC) &&
             (p_cb->listen_info[listen_info_idx].tech_mask &
              NFA_TECHNOLOGY_MASK_F)) {
-          break;
+          t3t_offhost_entry_found = true;
+          t3t_offhost_idx = listen_info_idx;
         }
       }
     }
 
     p_ce_cback = nfa_ce_handle_t3t_evt;
+    /* If listening for PROTO_T3T on DH and eSE/UICC, then notify CE module
+     * now and wait for reader/writer to SELECT a target */
+    if (t3t_activate_pending && t3t_offhost_entry_found) {
+      CE_SetActivatedTagType(&p_cb->activation_params, t3t_system_code,
+                             p_ce_cback);
+      return true;
+    } else if (t3t_activate_pending) {
+      listen_info_idx = t3t_activate_idx;
+    } else if (t3t_offhost_entry_found) {
+      listen_info_idx = t3t_offhost_idx;
+    }
   } else if (p_cb->activation_params.protocol == NFA_PROTOCOL_ISO_DEP) {
     p_ce_cback = nfa_ce_handle_t4t_evt;
 
@@ -904,6 +948,8 @@
 
   p_cb->listen_info[listen_info_idx].flags &=
       ~NFA_CE_LISTEN_INFO_T4T_ACTIVATE_PND;
+  p_cb->listen_info[listen_info_idx].flags &=
+      ~NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND;
 
   /* Get CONN_CBACK for this activation */
   p_cb->p_active_conn_cback = p_cb->listen_info[listen_info_idx].p_conn_cback;
@@ -1013,14 +1059,18 @@
         }
       } else if ((p_cb->activation_params.protocol == NFA_PROTOCOL_T3T) &&
                  (p_cb->listen_info[i].protocol_mask & NFA_PROTOCOL_MASK_T3T)) {
-        if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
-          conn_evt.deactivated.type = deact_type;
-          (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
-        } else {
-          conn_evt.ce_deactivated.handle =
-              NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i);
-          conn_evt.ce_deactivated.type = deact_type;
-          (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
+        /* Don't send NFA_DEACTIVATED_EVT if NFA_ACTIVATED_EVT wasn't sent */
+        if (!(p_cb->listen_info[i].flags &
+              NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND)) {
+          if (i == NFA_CE_LISTEN_INFO_IDX_NDEF) {
+            conn_evt.deactivated.type = deact_type;
+            (*p_cb->p_active_conn_cback)(NFA_DEACTIVATED_EVT, &conn_evt);
+          } else {
+            conn_evt.ce_deactivated.handle =
+                NFA_HANDLE_GROUP_CE | ((tNFA_HANDLE)i);
+            conn_evt.ce_deactivated.type = deact_type;
+            (*p_cb->p_active_conn_cback)(NFA_CE_DEACTIVATED_EVT, &conn_evt);
+          }
         }
       }
     }
diff --git a/src/nfa/include/nfa_ce_int.h b/src/nfa/include/nfa_ce_int.h
index 24025ad..d113cd3 100644
--- a/src/nfa/include/nfa_ce_int.h
+++ b/src/nfa/include/nfa_ce_int.h
@@ -128,6 +128,8 @@
 #define NFA_CE_LISTEN_INFO_FELICA 0x00000200
 /* This is a listen_info for UICC                                   */
 #define NFA_CE_LISTEN_INFO_UICC 0x00000400
+/* App has not been notified of ACTIVATE_EVT yet for this HCEF NFCID2 */
+#define NFA_CE_LISTEN_INFO_T3T_ACTIVATE_PND 0x00010000
 
 /* Structure for listen look up table */
 typedef struct {