NCI2.0 Support for registering additional power states for protocol and technology routing.

Bug: 69876039
Test: In NCI2.0 mode, Perform HCE in screen on lock;
Test: Perform CE off host in screen on lock, off lock and screen off unlock.

Change-Id: I9b628eb18e54d82257eef5944411eb343aaa2724
(cherry picked from commit fb3ba9fea56a724daea636caa9d152ad30a6288a)
diff --git a/src/include/nci_defs.h b/src/include/nci_defs.h
index 9cf7c52..67a9afb 100644
--- a/src/include/nci_defs.h
+++ b/src/include/nci_defs.h
@@ -395,10 +395,15 @@
 #define NCI_ROUTE_PWR_STATE_SWITCH_OFF 0x02
 /* The device's battery is removed */
 #define NCI_ROUTE_PWR_STATE_BATT_OFF 0x04
-/* The device is in screen off Unlock mode */
-/* The device is in screen on lock mode */
-#define NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK 0x10
-/* The device is in screen off lock mode */
+/* The device is screen off Unlock mode */
+#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK() \
+  ((NFC_GetNCIVersion() == NCI_VERSION_2_0) ? 0x08 : 0x80)
+/* The device is screen on lock mode */
+#define NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK() \
+  ((NFC_GetNCIVersion() == NCI_VERSION_2_0) ? 0x10 : 0x40)
+/* The device is screen off lock mode */
+#define NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK() \
+  ((NFC_GetNCIVersion() == NCI_VERSION_2_0) ? 0x20 : 0x00)
 
 /* Hardware / Registration Identification  */
 #define NCI_NFCEE_TAG_HW_ID 0x00
diff --git a/src/nfa/ee/nfa_ee_act.cc b/src/nfa/ee/nfa_ee_act.cc
index 4fd489e..a9d5cd6 100644
--- a/src/nfa/ee/nfa_ee_act.cc
+++ b/src/nfa/ee/nfa_ee_act.cc
@@ -158,8 +158,17 @@
       power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
     if (p_cb->tech_battery_off & nfa_ee_tech_mask_list[xx])
       power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
+    if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+        (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+      if (p_cb->tech_screen_lock & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+      if (p_cb->tech_screen_off & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+      if (p_cb->tech_screen_off_lock & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+    }
     if (power_cfg) {
-      /* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (techonogy) */
+      /* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (technology) */
       p_cb->size_mask += 5;
     }
   }
@@ -173,6 +182,15 @@
       power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
     if (p_cb->proto_battery_off & nfa_ee_proto_mask_list[xx])
       power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
+    if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+        (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+      if (p_cb->proto_screen_lock & nfa_ee_proto_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+      if (p_cb->proto_screen_off & nfa_ee_proto_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+      if (p_cb->proto_screen_off_lock & nfa_ee_proto_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+    }
     if (power_cfg) {
       /* 5 = 1 (tag) + 1 (len) + 1(nfcee_id) + 1(power cfg) + 1 (protocol) */
       p_cb->size_mask += 5;
@@ -290,6 +308,15 @@
       power_cfg |= NCI_ROUTE_PWR_STATE_SWITCH_OFF;
     if (p_cb->tech_battery_off & nfa_ee_tech_mask_list[xx])
       power_cfg |= NCI_ROUTE_PWR_STATE_BATT_OFF;
+    if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+        (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+      if (p_cb->tech_screen_lock & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+      if (p_cb->tech_screen_off & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+      if (p_cb->tech_screen_off_lock & nfa_ee_tech_mask_list[xx])
+        power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+    }
     if (power_cfg) {
       add_route_tech_proto_tlv(&pp, NFC_ROUTE_TAG_TECH, p_cb->nfcee_id,
                                power_cfg, nfa_ee_tech_list[xx]);
@@ -327,8 +354,15 @@
 
         /* Enable screen on lock power state for ISO-DEP protocol to
            enable HCE screen lock */
-        if (NFC_GetNCIVersion() == NCI_VERSION_2_0)
-          power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK;
+        if ((power_cfg & NCI_ROUTE_PWR_STATE_ON) &&
+            (NFC_GetNCIVersion() == NCI_VERSION_2_0)) {
+          if (p_cb->proto_screen_lock & nfa_ee_proto_mask_list[xx])
+            power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_ON_LOCK();
+          if (p_cb->proto_screen_off & nfa_ee_proto_mask_list[xx])
+            power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_UNLOCK();
+          if (p_cb->proto_screen_off_lock & nfa_ee_proto_mask_list[xx])
+            power_cfg |= NCI_ROUTE_PWR_STATE_SCREEN_OFF_LOCK();
+        }
       } else {
         proto_tag = NFC_ROUTE_TAG_PROTO;
       }
@@ -833,11 +867,18 @@
   tNFA_TECHNOLOGY_MASK old_tech_switch_on = p_cb->tech_switch_on;
   tNFA_TECHNOLOGY_MASK old_tech_switch_off = p_cb->tech_switch_off;
   tNFA_TECHNOLOGY_MASK old_tech_battery_off = p_cb->tech_battery_off;
+  tNFA_TECHNOLOGY_MASK old_tech_screen_lock = p_cb->tech_screen_lock;
+  tNFA_TECHNOLOGY_MASK old_tech_screen_off = p_cb->tech_screen_off;
+  tNFA_TECHNOLOGY_MASK old_tech_screen_off_lock = p_cb->tech_screen_off_lock;
   uint8_t old_size_mask = p_cb->size_mask;
 
   if ((p_cb->tech_switch_on == p_data->set_tech.technologies_switch_on) &&
       (p_cb->tech_switch_off == p_data->set_tech.technologies_switch_off) &&
-      (p_cb->tech_battery_off == p_data->set_tech.technologies_battery_off)) {
+      (p_cb->tech_battery_off == p_data->set_tech.technologies_battery_off) &&
+      (p_cb->tech_screen_lock == p_data->set_tech.technologies_screen_lock) &&
+      (p_cb->tech_screen_off == p_data->set_tech.technologies_screen_off) &&
+      (p_cb->tech_screen_off_lock ==
+       p_data->set_tech.technologies_screen_off_lock)) {
     /* nothing to change */
     evt_data.status = NFA_STATUS_OK;
     nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_SET_TECH_CFG_EVT, &evt_data);
@@ -847,6 +888,9 @@
   p_cb->tech_switch_on = p_data->set_tech.technologies_switch_on;
   p_cb->tech_switch_off = p_data->set_tech.technologies_switch_off;
   p_cb->tech_battery_off = p_data->set_tech.technologies_battery_off;
+  p_cb->tech_screen_lock = p_data->set_tech.technologies_screen_lock;
+  p_cb->tech_screen_off = p_data->set_tech.technologies_screen_off;
+  p_cb->tech_screen_off_lock = p_data->set_tech.technologies_screen_off_lock;
   nfa_ee_update_route_size(p_cb);
   if (nfa_ee_total_lmrt_size() > NFC_GetLmrtSize()) {
     LOG(ERROR) << StringPrintf("nfa_ee_api_set_tech_cfg Exceed LMRT size");
@@ -854,10 +898,15 @@
     p_cb->tech_switch_on = old_tech_switch_on;
     p_cb->tech_switch_off = old_tech_switch_off;
     p_cb->tech_battery_off = old_tech_battery_off;
+    p_cb->tech_screen_lock = old_tech_screen_lock;
+    p_cb->tech_screen_off = old_tech_screen_off;
+    p_cb->tech_screen_off_lock = old_tech_screen_off_lock;
     p_cb->size_mask = old_size_mask;
   } else {
     p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_TECH;
-    if (p_cb->tech_switch_on | p_cb->tech_switch_off | p_cb->tech_battery_off) {
+    if (p_cb->tech_switch_on | p_cb->tech_switch_off | p_cb->tech_battery_off |
+        p_cb->tech_screen_lock | p_cb->tech_screen_off |
+        p_cb->tech_screen_off_lock) {
       /* if any technology in any power mode is configured, mark this entry as
        * configured */
       nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
@@ -884,11 +933,18 @@
   tNFA_PROTOCOL_MASK old_proto_switch_on = p_cb->proto_switch_on;
   tNFA_PROTOCOL_MASK old_proto_switch_off = p_cb->proto_switch_off;
   tNFA_PROTOCOL_MASK old_proto_battery_off = p_cb->proto_battery_off;
+  tNFA_PROTOCOL_MASK old_proto_screen_lock = p_cb->proto_screen_lock;
+  tNFA_PROTOCOL_MASK old_proto_screen_off = p_cb->proto_screen_off;
+  tNFA_PROTOCOL_MASK old_proto_screen_off_lock = p_cb->proto_screen_off_lock;
   uint8_t old_size_mask = p_cb->size_mask;
 
   if ((p_cb->proto_switch_on == p_data->set_proto.protocols_switch_on) &&
       (p_cb->proto_switch_off == p_data->set_proto.protocols_switch_off) &&
-      (p_cb->proto_battery_off == p_data->set_proto.protocols_battery_off)) {
+      (p_cb->proto_battery_off == p_data->set_proto.protocols_battery_off) &&
+      (p_cb->proto_screen_lock == p_data->set_proto.protocols_screen_lock) &&
+      (p_cb->proto_screen_off == p_data->set_proto.protocols_screen_off) &&
+      (p_cb->proto_screen_off_lock ==
+       p_data->set_proto.protocols_screen_off_lock)) {
     /* nothing to change */
     evt_data.status = NFA_STATUS_OK;
     nfa_ee_report_event(p_cb->p_ee_cback, NFA_EE_SET_PROTO_CFG_EVT, &evt_data);
@@ -898,6 +954,9 @@
   p_cb->proto_switch_on = p_data->set_proto.protocols_switch_on;
   p_cb->proto_switch_off = p_data->set_proto.protocols_switch_off;
   p_cb->proto_battery_off = p_data->set_proto.protocols_battery_off;
+  p_cb->proto_screen_lock = p_data->set_proto.protocols_screen_lock;
+  p_cb->proto_screen_off = p_data->set_proto.protocols_screen_off;
+  p_cb->proto_screen_off_lock = p_data->set_proto.protocols_screen_off_lock;
   nfa_ee_update_route_size(p_cb);
   if (nfa_ee_total_lmrt_size() > NFC_GetLmrtSize()) {
     LOG(ERROR) << StringPrintf("nfa_ee_api_set_proto_cfg Exceed LMRT size");
@@ -905,11 +964,15 @@
     p_cb->proto_switch_on = old_proto_switch_on;
     p_cb->proto_switch_off = old_proto_switch_off;
     p_cb->proto_battery_off = old_proto_battery_off;
+    p_cb->proto_screen_lock = old_proto_screen_lock;
+    p_cb->proto_screen_off = old_proto_screen_off;
+    p_cb->proto_screen_off_lock = old_proto_screen_off_lock;
     p_cb->size_mask = old_size_mask;
   } else {
     p_cb->ecb_flags |= NFA_EE_ECB_FLAGS_PROTO;
     if (p_cb->proto_switch_on | p_cb->proto_switch_off |
-        p_cb->proto_battery_off) {
+        p_cb->proto_battery_off | p_cb->proto_screen_lock |
+        p_cb->proto_screen_off | p_cb->proto_screen_off_lock) {
       /* if any protocol in any power mode is configured, mark this entry as
        * configured */
       nfa_ee_cb.ee_cfged |= nfa_ee_ecb_to_mask(p_cb);
diff --git a/src/nfa/ee/nfa_ee_api.cc b/src/nfa/ee/nfa_ee_api.cc
index 0de659e..af99a7d 100644
--- a/src/nfa/ee/nfa_ee_api.cc
+++ b/src/nfa/ee/nfa_ee_api.cc
@@ -291,7 +291,10 @@
 tNFA_STATUS NFA_EeSetDefaultTechRouting(
     tNFA_HANDLE ee_handle, tNFA_TECHNOLOGY_MASK technologies_switch_on,
     tNFA_TECHNOLOGY_MASK technologies_switch_off,
-    tNFA_TECHNOLOGY_MASK technologies_battery_off) {
+    tNFA_TECHNOLOGY_MASK technologies_battery_off,
+    tNFA_TECHNOLOGY_MASK technologies_screen_lock,
+    tNFA_TECHNOLOGY_MASK technologies_screen_off,
+    tNFA_TECHNOLOGY_MASK technologies_screen_off_lock) {
   tNFA_EE_API_SET_TECH_CFG* p_msg;
   tNFA_STATUS status = NFA_STATUS_FAILED;
   uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
@@ -299,9 +302,10 @@
 
   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
       ""
-      "handle:<0x%x>technology_mask:<0x%x>/<0x%x>/<0x%x>",
+      "handle:<0x%x>technology_mask:<0x%x>/<0x%x>/<0x%x><0x%x><0x%x><0x%x>",
       ee_handle, technologies_switch_on, technologies_switch_off,
-      technologies_battery_off);
+      technologies_battery_off, technologies_screen_lock,
+      technologies_screen_off, technologies_screen_off_lock);
   p_cb = nfa_ee_find_ecb(nfcee_id);
 
   if (p_cb == NULL) {
@@ -317,6 +321,9 @@
       p_msg->technologies_switch_on = technologies_switch_on;
       p_msg->technologies_switch_off = technologies_switch_off;
       p_msg->technologies_battery_off = technologies_battery_off;
+      p_msg->technologies_screen_lock = technologies_screen_lock;
+      p_msg->technologies_screen_off = technologies_screen_off;
+      p_msg->technologies_screen_off_lock = technologies_screen_off_lock;
 
       nfa_sys_sendmsg(p_msg);
 
@@ -351,16 +358,20 @@
 tNFA_STATUS NFA_EeSetDefaultProtoRouting(
     tNFA_HANDLE ee_handle, tNFA_PROTOCOL_MASK protocols_switch_on,
     tNFA_PROTOCOL_MASK protocols_switch_off,
-    tNFA_PROTOCOL_MASK protocols_battery_off) {
+    tNFA_PROTOCOL_MASK protocols_battery_off,
+    tNFA_PROTOCOL_MASK protocols_screen_lock,
+    tNFA_PROTOCOL_MASK protocols_screen_off,
+    tNFA_PROTOCOL_MASK protocols_screen_off_lock) {
   tNFA_EE_API_SET_PROTO_CFG* p_msg;
   tNFA_STATUS status = NFA_STATUS_FAILED;
   uint8_t nfcee_id = (uint8_t)(ee_handle & 0xFF);
   tNFA_EE_ECB* p_cb;
 
   DLOG_IF(INFO, nfc_debug_enabled) << StringPrintf(
-      "handle:<0x%x>protocol_mask:<0x%x>/<0x%x>/<0x%x>",
+      "handle:<0x%x>protocol_mask:<0x%x>/<0x%x>/<0x%x><0x%x><0x%x><0x%x>",
       ee_handle, protocols_switch_on, protocols_switch_off,
-      protocols_battery_off);
+      protocols_battery_off, protocols_screen_lock, protocols_screen_off,
+      protocols_screen_off_lock);
   p_cb = nfa_ee_find_ecb(nfcee_id);
 
   if (p_cb == NULL) {
@@ -376,6 +387,9 @@
       p_msg->protocols_switch_on = protocols_switch_on;
       p_msg->protocols_switch_off = protocols_switch_off;
       p_msg->protocols_battery_off = protocols_battery_off;
+      p_msg->protocols_screen_lock = protocols_screen_lock;
+      p_msg->protocols_screen_off = protocols_screen_off;
+      p_msg->protocols_screen_off_lock = protocols_screen_off_lock;
 
       nfa_sys_sendmsg(p_msg);
 
diff --git a/src/nfa/include/nfa_ee_api.h b/src/nfa/include/nfa_ee_api.h
index 7df0df4..78d0fe7 100644
--- a/src/nfa/include/nfa_ee_api.h
+++ b/src/nfa/include/nfa_ee_api.h
@@ -306,7 +306,10 @@
 extern tNFA_STATUS NFA_EeSetDefaultTechRouting(
     tNFA_HANDLE ee_handle, tNFA_TECHNOLOGY_MASK technologies_switch_on,
     tNFA_TECHNOLOGY_MASK technologies_switch_off,
-    tNFA_TECHNOLOGY_MASK technologies_battery_off);
+    tNFA_TECHNOLOGY_MASK technologies_battery_off,
+    tNFA_TECHNOLOGY_MASK technologies_screen_lock,
+    tNFA_TECHNOLOGY_MASK technologies_screen_off,
+    tNFA_TECHNOLOGY_MASK technologies_screen_off_lock);
 
 /*******************************************************************************
 **
@@ -332,7 +335,10 @@
 extern tNFA_STATUS NFA_EeSetDefaultProtoRouting(
     tNFA_HANDLE ee_handle, tNFA_PROTOCOL_MASK protocols_switch_on,
     tNFA_PROTOCOL_MASK protocols_switch_off,
-    tNFA_PROTOCOL_MASK protocols_battery_off);
+    tNFA_PROTOCOL_MASK protocols_battery_off,
+    tNFA_PROTOCOL_MASK technologies_screen_lock,
+    tNFA_PROTOCOL_MASK technologies_screen_off,
+    tNFA_PROTOCOL_MASK technologies_screen_off_lock);
 
 /*******************************************************************************
 **
diff --git a/src/nfa/include/nfa_ee_int.h b/src/nfa/include/nfa_ee_int.h
index c700027..2cd0507 100644
--- a/src/nfa/include/nfa_ee_int.h
+++ b/src/nfa/include/nfa_ee_int.h
@@ -149,12 +149,24 @@
       tech_switch_off; /* default routing - technologies switch_off */
   tNFA_TECHNOLOGY_MASK
       tech_battery_off; /* default routing - technologies battery_off*/
+  tNFA_TECHNOLOGY_MASK
+      tech_screen_lock; /* default routing - technologies screen_lock*/
+  tNFA_TECHNOLOGY_MASK
+      tech_screen_off; /* default routing - technologies screen_off*/
+  tNFA_TECHNOLOGY_MASK
+      tech_screen_off_lock; /* default routing - technologies screen_off_lock*/
   tNFA_PROTOCOL_MASK
       proto_switch_on; /* default routing - protocols switch_on     */
   tNFA_PROTOCOL_MASK
       proto_switch_off; /* default routing - protocols switch_off    */
   tNFA_PROTOCOL_MASK
       proto_battery_off;     /* default routing - protocols battery_off   */
+  tNFA_PROTOCOL_MASK
+      proto_screen_lock; /* default routing - protocols screen_lock    */
+  tNFA_PROTOCOL_MASK
+      proto_screen_off; /* default routing - protocols screen_off  */
+  tNFA_PROTOCOL_MASK
+      proto_screen_off_lock; /* default routing - protocols screen_off_lock  */
   tNFA_EE_CONN_ST conn_st;   /* connection status */
   uint8_t conn_id;           /* connection id */
   tNFA_EE_CBACK* p_ee_cback; /* the callback function */
@@ -235,6 +247,9 @@
   tNFA_TECHNOLOGY_MASK technologies_switch_on;
   tNFA_TECHNOLOGY_MASK technologies_switch_off;
   tNFA_TECHNOLOGY_MASK technologies_battery_off;
+  tNFA_TECHNOLOGY_MASK technologies_screen_lock;
+  tNFA_TECHNOLOGY_MASK technologies_screen_off;
+  tNFA_TECHNOLOGY_MASK technologies_screen_off_lock;
 } tNFA_EE_API_SET_TECH_CFG;
 
 /* data type for NFA_EE_API_SET_PROTO_CFG_EVT */
@@ -245,6 +260,9 @@
   tNFA_PROTOCOL_MASK protocols_switch_on;
   tNFA_PROTOCOL_MASK protocols_switch_off;
   tNFA_PROTOCOL_MASK protocols_battery_off;
+  tNFA_PROTOCOL_MASK protocols_screen_lock;
+  tNFA_PROTOCOL_MASK protocols_screen_off;
+  tNFA_PROTOCOL_MASK protocols_screen_off_lock;
 } tNFA_EE_API_SET_PROTO_CFG;
 
 /* data type for NFA_EE_API_ADD_AID_EVT */