Add support for getConfig() from NFC HAL 1.1

Test: Boots, Nfc initialized, Nfc enable/disable
Bug: 72080121
Change-Id: I13cf70d67bcddb0a6a0d5db143c789d0223ad804
(cherry picked from commit 6a09eef919906286b90ec33e9e1625f9c876067d)
diff --git a/src/adaptation/NfcAdaptation.cc b/src/adaptation/NfcAdaptation.cc
index 1431c55..3f6e2e6 100644
--- a/src/adaptation/NfcAdaptation.cc
+++ b/src/adaptation/NfcAdaptation.cc
@@ -23,10 +23,10 @@
 #include <hwbinder/ProcessState.h>
 
 #include "NfcAdaptation.h"
-
 #include "android_logmsg.h"
 #include "debug_nfcsnoop.h"
 #include "nfa_api.h"
+#include "nfa_rw_api.h"
 #include "nfc_config.h"
 #include "nfc_int.h"
 #include "nfca_version.h"
@@ -40,7 +40,9 @@
 using android::hardware::Return;
 using android::hardware::Void;
 using android::hardware::nfc::V1_0::INfc;
+using android::hardware::nfc::V1_1::PresenceCheckAlgorithm;
 using INfcV1_1 = android::hardware::nfc::V1_1::INfc;
+using NfcVendorConfig = android::hardware::nfc::V1_1::NfcConfig;
 using android::hardware::nfc::V1_1::INfcClientCallback;
 using android::hardware::hidl_vec;
 
@@ -172,6 +174,47 @@
   return *mpInstance;
 }
 
+void NfcAdaptation::GetVendorConfigs(
+    std::map<std::string, ConfigValue>& configMap) {
+  if (mHal_1_1) {
+    mHal_1_1->getConfig([&configMap](NfcVendorConfig config) {
+      std::vector<uint8_t> nfaPropCfg = {
+          config.nfaProprietaryCfg.protocol18092Active,
+          config.nfaProprietaryCfg.protocolBPrime,
+          config.nfaProprietaryCfg.protocolDual,
+          config.nfaProprietaryCfg.protocol15693,
+          config.nfaProprietaryCfg.protocolKovio,
+          config.nfaProprietaryCfg.protocolMifare,
+          config.nfaProprietaryCfg.discoveryPollKovio,
+          config.nfaProprietaryCfg.discoveryPollBPrime,
+          config.nfaProprietaryCfg.discoveryListenBPrime};
+      configMap.emplace(NAME_NFA_PROPRIETARY_CFG, ConfigValue(nfaPropCfg));
+      configMap.emplace(NAME_NFA_POLL_BAIL_OUT_MODE,
+                        ConfigValue(config.nfaPollBailOutMode ? 1 : 0));
+      configMap.emplace(NAME_DEFAULT_OFFHOST_ROUTE,
+                        ConfigValue(config.defaultOffHostRoute));
+      configMap.emplace(NAME_DEFAULT_NFCF_ROUTE,
+                        ConfigValue(config.defaultOffHostRouteFelica));
+      configMap.emplace(NAME_DEFAULT_SYS_CODE_ROUTE,
+                        ConfigValue(config.defaultSystemCodeRoute));
+      configMap.emplace(NAME_OFF_HOST_SIM_PIPE_ID,
+                        ConfigValue(config.offHostSIMPipeId));
+      configMap.emplace(NAME_OFF_HOST_ESE_PIPE_ID,
+                        ConfigValue(config.offHostESEPipeId));
+      configMap.emplace(NAME_ISO_DEP_MAX_TRANSCEIVE,
+                        ConfigValue(config.maxIsoDepTransceiveLength));
+      /* For Backwards compatibility */
+      if (config.presenceCheckAlgorithm ==
+          PresenceCheckAlgorithm::ISO_DEP_NAK) {
+        configMap.emplace(NAME_PRESENCE_CHECK_ALGORITHM,
+                          ConfigValue((uint32_t)NFA_RW_PRES_CHK_ISO_DEP_NAK));
+      } else {
+        configMap.emplace(NAME_PRESENCE_CHECK_ALGORITHM,
+                          ConfigValue((uint32_t)config.presenceCheckAlgorithm));
+      }
+    });
+  }
+}
 /*******************************************************************************
 **
 ** Function:    NfcAdaptation::Initialize()
diff --git a/utils/nfc_config.cc b/src/adaptation/nfc_config.cc
similarity index 88%
rename from utils/nfc_config.cc
rename to src/adaptation/nfc_config.cc
index 57ae044..96acfe4 100644
--- a/utils/nfc_config.cc
+++ b/src/adaptation/nfc_config.cc
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 #include "nfc_config.h"
+#include "NfcAdaptation.h"
 
 #include <android-base/file.h>
 #include <android-base/logging.h>
@@ -46,6 +47,13 @@
   string config_path = findConfigPath();
   CHECK(config_path != "");
   config_.parseFromFile(config_path);
+  /* Read vendor specific configs */
+  NfcAdaptation& theInstance = NfcAdaptation::GetInstance();
+  std::map<std::string, ConfigValue> configMap;
+  theInstance.GetVendorConfigs(configMap);
+  for (auto config : configMap) {
+    config_.addConfig(config.first, config.second);
+  }
 }
 
 NfcConfig& NfcConfig::getInstance() {
diff --git a/src/include/NfcAdaptation.h b/src/include/NfcAdaptation.h
index 81ecfca..cf1054e 100644
--- a/src/include/NfcAdaptation.h
+++ b/src/include/NfcAdaptation.h
@@ -18,6 +18,7 @@
 #pragma once
 #include <pthread.h>
 
+#include "config.h"
 #include "nfc_hal_api.h"
 #include "nfc_target.h"
 
@@ -86,6 +87,7 @@
   static NfcAdaptation& GetInstance();
   tHAL_NFC_ENTRY* GetHalEntryFuncs();
   void DownloadFirmware();
+  void GetVendorConfigs(std::map<std::string, ConfigValue>& configMap);
   void Dump(int fd);
 
  private:
diff --git a/utils/include/nfc_config.h b/src/include/nfc_config.h
similarity index 85%
rename from utils/include/nfc_config.h
rename to src/include/nfc_config.h
index db27f6f..b941ece 100644
--- a/utils/include/nfc_config.h
+++ b/src/include/nfc_config.h
@@ -20,25 +20,34 @@
 
 #include <config.h>
 
+/* Configs from libnfc-nci.conf */
 #define NAME_NFC_DEBUG_ENABLED "NFC_DEBUG_ENABLED"
+#define NAME_NFA_STORAGE "NFA_STORAGE"
+#define NAME_PRESERVE_STORAGE "PRESERVE_STORAGE"
 #define NAME_POLLING_TECH_MASK "POLLING_TECH_MASK"
+#define NAME_P2P_LISTEN_TECH_MASK "P2P_LISTEN_TECH_MASK"
+#define NAME_UICC_LISTEN_TECH_MASK "UICC_LISTEN_TECH_MASK"
 #define NAME_NFA_DM_CFG "NFA_DM_CFG"
 #define NAME_SCREEN_OFF_POWER_STATE "SCREEN_OFF_POWER_STATE"
-#define NAME_NFA_STORAGE "NFA_STORAGE"
-#define NAME_UICC_LISTEN_TECH_MASK "UICC_LISTEN_TECH_MASK"
-#define NAME_NFA_DM_DISC_DURATION_POLL "NFA_DM_DISC_DURATION_POLL"
-#define NAME_AID_FOR_EMPTY_SELECT "AID_FOR_EMPTY_SELECT"
-#define NAME_PRESERVE_STORAGE "PRESERVE_STORAGE"
 #define NAME_NFA_MAX_EE_SUPPORTED "NFA_MAX_EE_SUPPORTED"
+#define NAME_NFA_DM_DISC_DURATION_POLL "NFA_DM_DISC_DURATION_POLL"
 #define NAME_POLL_FREQUENCY "POLL_FREQUENCY"
-#define NAME_PRESENCE_CHECK_ALGORITHM "PRESENCE_CHECK_ALGORITHM"
-#define NAME_DEVICE_HOST_WHITE_LIST "DEVICE_HOST_WHITE_LIST"
-#define NAME_NFA_POLL_BAIL_OUT_MODE "NFA_POLL_BAIL_OUT_MODE"
-#define NAME_NFA_PROPRIETARY_CFG "NFA_PROPRIETARY_CFG"
 #define NAME_NFA_AID_BLOCK_ROUTE "NFA_AID_BLOCK_ROUTE"
-#define NAME_ISO_DEP_MAX_TRANSCEIVE "ISO_DEP_MAX_TRANSCEIVE"
+#define NAME_AID_FOR_EMPTY_SELECT "AID_FOR_EMPTY_SELECT"
+#define NAME_AID_MATCHING_MODE "AID_MATCHING_MODE"
+
+/* Configs from vendor interface */
+#define NAME_NFA_POLL_BAIL_OUT_MODE "NFA_POLL_BAIL_OUT_MODE"
+#define NAME_PRESENCE_CHECK_ALGORITHM "PRESENCE_CHECK_ALGORITHM"
+#define NAME_NFA_PROPRIETARY_CFG "NFA_PROPRIETARY_CFG"
+#define NAME_DEFAULT_OFFHOST_ROUTE "DEFAULT_OFFHOST_ROUTE"
+#define NAME_DEFAULT_NFCF_ROUTE "DEFAULT_NFCF_ROUTE"
+#define NAME_DEFAULT_SYS_CODE_ROUTE "DEFAULT_SYS_CODE_ROUTE"
+#define NAME_DEFAULT_ROUTE "DEFAULT_ROUTE"
 #define NAME_OFF_HOST_ESE_PIPE_ID "OFF_HOST_ESE_PIPE_ID"
 #define NAME_OFF_HOST_SIM_PIPE_ID "OFF_HOST_SIM_PIPE_ID"
+#define NAME_ISO_DEP_MAX_TRANSCEIVE "ISO_DEP_MAX_TRANSCEIVE"
+#define NAME_DEVICE_HOST_WHITE_LIST "DEVICE_HOST_WHITE_LIST"
 
 class NfcConfig {
  public:
diff --git a/utils/Android.bp b/utils/Android.bp
index 4aca752..04053a4 100644
--- a/utils/Android.bp
+++ b/utils/Android.bp
@@ -24,7 +24,6 @@
     host_supported: true,
     srcs: [
         "config.cc",
-        "nfc_config.cc",
         "ringbuffer.cc",
     ],
     shared_libs: [
diff --git a/utils/config.cc b/utils/config.cc
index 69b536e..4128098 100644
--- a/utils/config.cc
+++ b/utils/config.cc
@@ -41,6 +41,26 @@
 
 }  // namespace
 
+ConfigValue::ConfigValue() {}
+
+ConfigValue::ConfigValue(std::string value) {
+  // Don't allow empty strings
+  CHECK(!(value.empty()));
+  type_ = STRING;
+  value_string_ = value;
+}
+
+ConfigValue::ConfigValue(unsigned value) {
+  type_ = UNSIGNED;
+  value_unsigned_ = value;
+}
+
+ConfigValue::ConfigValue(std::vector<uint8_t> value) {
+  CHECK(!(value.empty()));
+  type_ = BYTES;
+  value_bytes_ = value;
+}
+
 ConfigValue::Type ConfigValue::getType() const { return type_; }
 
 std::string ConfigValue::getString() const {
@@ -82,6 +102,11 @@
   return false;
 }
 
+void ConfigFile::addConfig(const std::string& key, ConfigValue& value) {
+  CHECK(!hasKey(key));
+  values_.emplace(key, value);
+}
+
 void ConfigFile::parseFromFile(const std::string& file_name) {
   string config;
   bool config_read = ReadFileToString(file_name, &config);
@@ -108,8 +133,7 @@
     ConfigValue value;
     bool value_parsed = value.parseFromString(value_string);
     CHECK(value_parsed);
-    CHECK(!hasKey(key));
-    values_.emplace(key, value);
+    addConfig(key, value);
 
     LOG(INFO) << "ConfigFile - [" << key << "] = " << value_string;
   }
diff --git a/utils/include/config.h b/utils/include/config.h
index 90bbcc1..a9a16ec 100644
--- a/utils/include/config.h
+++ b/utils/include/config.h
@@ -23,6 +23,10 @@
  public:
   enum Type { UNSIGNED, STRING, BYTES };
 
+  ConfigValue();
+  ConfigValue(std::string);
+  ConfigValue(unsigned);
+  ConfigValue(std::vector<uint8_t>);
   Type getType() const;
   std::string getString() const;
   unsigned getUnsigned() const;
@@ -41,6 +45,7 @@
  public:
   void parseFromFile(const std::string& file_name);
   void parseFromString(const std::string& config);
+  void addConfig(const std::string& config, ConfigValue& value);
 
   bool hasKey(const std::string& key);
   std::string getString(const std::string& key);