Merge "Switch to using the NFC HIDL HAL."
diff --git a/Android.mk b/Android.mk
index 2478427..7d7fcb4 100644
--- a/Android.mk
+++ b/Android.mk
@@ -28,7 +28,11 @@
     $(LOCAL_PATH)/$(NFC)/int \
     $(LOCAL_PATH)/src/hal/include \
     $(LOCAL_PATH)/src/hal/int \
-    $(LOCAL_PATH)/$(HALIMPL)/include
+    $(LOCAL_PATH)/$(HALIMPL)/include \
+    system/libhwbinder/include
+
+# Treble configuration
+LOCAL_SHARED_LIBRARIES += libhidl libhwbinder libutils android.hardware.nfc@1.0
 LOCAL_SRC_FILES := \
     $(call all-c-files-under, $(NFA)/ce $(NFA)/dm $(NFA)/ee) \
     $(call all-c-files-under, $(NFA)/hci $(NFA)/int $(NFA)/p2p $(NFA)/rw $(NFA)/sys) \
@@ -40,7 +44,6 @@
     src/nfca_version.c
 include $(BUILD_SHARED_LIBRARY)
 
-
 ######################################
 # Build shared library system/lib/hw/nfc_nci.*.so for Hardware Abstraction Layer.
 # Android's generic HAL (libhardware.so) dynamically loads this shared library.
@@ -51,8 +54,8 @@
 LOCAL_SRC_FILES := $(call all-c-files-under, $(HALIMPL)) \
     $(call all-cpp-files-under, $(HALIMPL)) \
     src/adaptation/CrcChecksum.cpp \
-    src//nfca_version.c
-LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware_legacy
+    src/nfca_version.c
+LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware_legacy libhwbinder libbase libcutils libutils
 LOCAL_C_INCLUDES := \
     $(LOCAL_PATH)/$(HALIMPL)/include \
     $(LOCAL_PATH)/$(HALIMPL)/gki/ulinux \
diff --git a/halimpl/bcm2079x/adaptation/HalAdaptation.cpp b/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
index c39bd1e..92e86b8 100644
--- a/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
+++ b/halimpl/bcm2079x/adaptation/HalAdaptation.cpp
@@ -336,7 +336,7 @@
     int retval = EACCES;
 
     SyncEventGuard guard (gPostInitCompletedEvent);
-    HAL_NfcCoreInitialized (coreInitResponseParams);
+    HAL_NfcCoreInitialized (0, coreInitResponseParams);
     gPostInitCompletedEvent.wait ();
     retval = 0;
     ALOGD ("%s: exit %d", __FUNCTION__, retval);
diff --git a/halimpl/bcm2079x/hal/hal/nfc_hal_api.c b/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
index e47fabf..a2faa94 100644
--- a/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
+++ b/halimpl/bcm2079x/hal/hal/nfc_hal_api.c
@@ -151,7 +151,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-void HAL_NfcCoreInitialized (UINT8 *p_core_init_rsp_params)
+void HAL_NfcCoreInitialized (UINT16 data_len, UINT8 *p_core_init_rsp_params)
 {
     NFC_HDR *p_msg;
     UINT16  size;
diff --git a/halimpl/pn54x/Android.mk b/halimpl/pn54x/Android.mk
index 8acf98f..051fffa 100644
--- a/halimpl/pn54x/Android.mk
+++ b/halimpl/pn54x/Android.mk
@@ -41,11 +41,22 @@
 else
 D_CFLAGS += -DNFC_NXP_CHIP_TYPE=PN551
 endif
+
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 LOCAL_MODULE := nfc_nci.$(TARGET_DEVICE)
 LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_SRC_FILES := $(call all-subdir-c-files)  $(call all-subdir-cpp-files)
+LOCAL_SRC_FILES := \
+	$(call all-c-files-under, common) \
+	$(call all-c-files-under, dnld) \
+	$(call all-c-files-under, hal) \
+	$(call all-c-files-under, log) \
+	$(call all-c-files-under, self-test) \
+	$(call all-c-files-under, tml) \
+	$(call all-c-files-under, utils) \
+	$(call all-cpp-files-under, utils) \
+	nfc_nci.c
+
 LOCAL_SHARED_LIBRARIES := liblog libcutils libhardware_legacy libdl libhardware
 
 LOCAL_CFLAGS := $(D_CFLAGS)
@@ -57,11 +68,15 @@
     $(LOCAL_PATH)/hal \
     $(LOCAL_PATH)/log \
     $(LOCAL_PATH)/tml \
-    $(LOCAL_PATH)/self-test
+    $(LOCAL_PATH)/self-test \
 
 LOCAL_CFLAGS += -DANDROID \
         -DNXP_UICC_ENABLE -DNXP_HW_SELF_TEST
 LOCAL_CFLAGS += -DNFC_NXP_HFO_SETTINGS=FALSE
 #LOCAL_CFLAGS += -DFELICA_CLT_ENABLE
 
+
+#
+# nfc_nci.$(TARGET_DEVICE)
+#
 include $(BUILD_SHARED_LIBRARY)
diff --git a/src/adaptation/NfcAdaptation.cpp b/src/adaptation/NfcAdaptation.cpp
index 371e31b..d13a151 100644
--- a/src/adaptation/NfcAdaptation.cpp
+++ b/src/adaptation/NfcAdaptation.cpp
@@ -15,6 +15,10 @@
  *  limitations under the License.
  *
  ******************************************************************************/
+#include <android/hardware/nfc/1.0/INfc.h>
+#include <android/hardware/nfc/1.0/INfcClientCallback.h>
+#include <hwbinder/ProcessState.h>
+#include <pthread.h>
 #include "OverrideLog.h"
 #include "NfcAdaptation.h"
 extern "C"
@@ -30,6 +34,17 @@
 #undef LOG_TAG
 #define LOG_TAG "NfcAdaptation"
 
+using android::OK;
+using android::sp;
+using android::status_t;
+
+using android::hardware::ProcessState;
+using android::hardware::Return;
+using android::hardware::Void;
+using android::hardware::nfc::V1_0::INfc;
+using android::hardware::nfc::V1_0::INfcClientCallback;
+using android::hardware::hidl_vec;
+
 extern "C" void GKI_shutdown();
 extern void resetConfig();
 extern "C" void verify_stack_non_volatile_store ();
@@ -37,11 +52,12 @@
 
 NfcAdaptation* NfcAdaptation::mpInstance = NULL;
 ThreadMutex NfcAdaptation::sLock;
-nfc_nci_device_t* NfcAdaptation::mHalDeviceContext = NULL;
 tHAL_NFC_CBACK* NfcAdaptation::mHalCallback = NULL;
 tHAL_NFC_DATA_CBACK* NfcAdaptation::mHalDataCallback = NULL;
 ThreadCondVar NfcAdaptation::mHalOpenCompletedEvent;
 ThreadCondVar NfcAdaptation::mHalCloseCompletedEvent;
+sp<INfc> NfcAdaptation::mHal;
+INfcClientCallback* NfcAdaptation::mCallback;
 
 UINT32 ScrProtocolTraceFlag = SCR_PROTO_TRACE_ALL; //0x017F00;
 UINT8 appl_trace_level = 0xff;
@@ -60,6 +76,29 @@
 extern tNFA_HCI_CFG *p_nfa_hci_cfg;
 extern BOOLEAN nfa_poll_bail_out_mode;
 
+class NfcClientCallback : public INfcClientCallback {
+  public:
+    NfcClientCallback(tHAL_NFC_CBACK* eventCallback, tHAL_NFC_DATA_CBACK dataCallback) {
+      mEventCallback = eventCallback;
+      mDataCallback = dataCallback;
+    };
+    virtual ~NfcClientCallback() = default;
+    Return<void> sendEvent(
+            ::android::hardware::nfc::V1_0::nfc_event_t event,
+            ::android::hardware::nfc::V1_0::nfc_status_t event_status) override {
+      mEventCallback ((UINT8)event, (tHAL_NFC_STATUS) event_status);
+      return Void();
+    };
+    Return<void> sendData(const ::android::hardware::nfc::V1_0::nfc_data_t &data ) override {
+      ::android::hardware::nfc::V1_0::nfc_data_t copy = data;
+      mDataCallback(copy.data.size(), &copy.data[0]);
+      return Void();
+    };
+  private:
+    tHAL_NFC_CBACK* mEventCallback;
+    tHAL_NFC_DATA_CBACK* mDataCallback;
+};
+
 /*******************************************************************************
 **
 ** Function:    NfcAdaptation::NfcAdaptation()
@@ -188,7 +227,6 @@
         mCondVar.wait();
     }
 
-    mHalDeviceContext = NULL;
     mHalCallback =  NULL;
     memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
     InitializeHalDeviceContext ();
@@ -214,9 +252,7 @@
 
     resetConfig();
 
-    nfc_nci_close(mHalDeviceContext); //close the HAL's device context
-    mHalDeviceContext = NULL;
-    mHalCallback = NULL;
+    mCallback = NULL;
     memset (&mHalEntryFuncs, 0, sizeof(mHalEntryFuncs));
 
     ALOGD ("%s: exit", func);
@@ -316,7 +352,6 @@
         ALOGE("No HAL module specified in config, falling back to BCM2079x");
         strlcpy (nci_hal_module, "nfc_nci.bcm2079x", sizeof(nci_hal_module));
     }
-    const hw_module_t* hw_module = NULL;
 
     mHalEntryFuncs.initialize = HalInitialize;
     mHalEntryFuncs.terminate = HalTerminate;
@@ -328,16 +363,18 @@
     mHalEntryFuncs.control_granted = HalControlGranted;
     mHalEntryFuncs.power_cycle = HalPowerCycle;
     mHalEntryFuncs.get_max_ee = HalGetMaxNfcee;
-
-    ret = hw_get_module (nci_hal_module, &hw_module);
-    if (ret == 0)
-    {
-        ret = nfc_nci_open (hw_module, &mHalDeviceContext);
-        if (ret != 0)
-            ALOGE ("%s: nfc_nci_open fail", func);
+    ALOGI("%s: INfc::getService(%s)", func, nci_hal_module);
+    mHal = INfc::getService(nci_hal_module);
+    LOG_FATAL_IF(mHal == nullptr, "Failed to retrieve the NFC HAL!");
+    ALOGI("%s: INfc::getService(%s) returned %p (%s)", func, nci_hal_module,
+          mHal.get(), (mHal->isRemote() ? "remote" : "local"));
+    // TODO(b/31748996) A client must be completely unaware of the
+    // implementation details of its HAL: whether the HAL is passthrough, or
+    // whether it uses HWbinder or some other transport.
+    if (mHal->isRemote()) {
+        ProcessState::self()->setThreadPoolMaxThreadCount(1);
+        ProcessState::self()->startThreadPool();
     }
-    else
-        ALOGE ("%s: fail hw_get_module %s", func, nci_hal_module);
     ALOGD ("%s: exit", func);
 }
 
@@ -386,12 +423,8 @@
 {
     const char* func = "NfcAdaptation::HalOpen";
     ALOGD ("%s", func);
-    if (mHalDeviceContext)
-    {
-        mHalCallback = p_hal_cback;
-        mHalDataCallback = p_data_cback;
-        mHalDeviceContext->open (mHalDeviceContext, HalDeviceContextCallback, HalDeviceContextDataCallback);
-    }
+    mCallback = new NfcClientCallback(p_hal_cback, p_data_cback);
+    mHal->open(mCallback);
 }
 
 /*******************************************************************************
@@ -407,10 +440,7 @@
 {
     const char* func = "NfcAdaptation::HalClose";
     ALOGD ("%s", func);
-    if (mHalDeviceContext)
-    {
-        mHalDeviceContext->close (mHalDeviceContext);
-    }
+    mHal->close();
 }
 
 /*******************************************************************************
@@ -462,10 +492,9 @@
 {
     const char* func = "NfcAdaptation::HalWrite";
     ALOGD ("%s", func);
-    if (mHalDeviceContext)
-    {
-        mHalDeviceContext->write (mHalDeviceContext, data_len, p_data);
-    }
+    ::android::hardware::nfc::V1_0::nfc_data_t data;
+    data.data.setToExternal(p_data, data_len);
+    mHal->write(data);
 }
 
 /*******************************************************************************
@@ -477,14 +506,14 @@
 ** Returns:     None.
 **
 *******************************************************************************/
-void NfcAdaptation::HalCoreInitialized (UINT8* p_core_init_rsp_params)
+void NfcAdaptation::HalCoreInitialized (UINT16 data_len, UINT8* p_core_init_rsp_params)
 {
     const char* func = "NfcAdaptation::HalCoreInitialized";
     ALOGD ("%s", func);
-    if (mHalDeviceContext)
-    {
-        mHalDeviceContext->core_initialized (mHalDeviceContext, p_core_init_rsp_params);
-    }
+    hidl_vec<uint8_t> data;
+    data.setToExternal(p_core_init_rsp_params, data_len);
+
+    mHal->core_initialized(data);
 }
 
 /*******************************************************************************
@@ -505,11 +534,7 @@
     const char* func = "NfcAdaptation::HalPrediscover";
     ALOGD ("%s", func);
     BOOLEAN retval = FALSE;
-
-    if (mHalDeviceContext)
-    {
-        retval = mHalDeviceContext->pre_discover (mHalDeviceContext);
-    }
+    mHal->pre_discover();
     return retval;
 }
 
@@ -530,10 +555,7 @@
 {
     const char* func = "NfcAdaptation::HalControlGranted";
     ALOGD ("%s", func);
-    if (mHalDeviceContext)
-    {
-        mHalDeviceContext->control_granted (mHalDeviceContext);
-    }
+    mHal->control_granted();
 }
 
 /*******************************************************************************
@@ -549,10 +571,7 @@
 {
     const char* func = "NfcAdaptation::HalPowerCycle";
     ALOGD ("%s", func);
-    if (mHalDeviceContext)
-    {
-        mHalDeviceContext->power_cycle (mHalDeviceContext);
-    }
+    mHal->power_cycle();
 }
 
 /*******************************************************************************
@@ -569,15 +588,8 @@
     const char* func = "NfcAdaptation::HalPowerCycle";
     UINT8 maxNfcee = 0;
     ALOGD ("%s", func);
-    if (mHalDeviceContext)
-    {
-        // TODO maco call into HAL when we figure out binary compatibility.
-        return nfa_ee_max_ee_cfg;
 
-        //mHalDeviceContext->get_max_ee (mHalDeviceContext, &maxNfcee);
-    }
-
-    return maxNfcee;
+    return nfa_ee_max_ee_cfg;
 }
 
 
diff --git a/src/hal/include/nfc_hal_api.h b/src/hal/include/nfc_hal_api.h
index ebd385d..de26f0c 100644
--- a/src/hal/include/nfc_hal_api.h
+++ b/src/hal/include/nfc_hal_api.h
@@ -84,7 +84,7 @@
 typedef void (tHAL_API_TERMINATE) (void);
 typedef void (tHAL_API_OPEN) (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK *p_data_cback);
 typedef void (tHAL_API_CLOSE) (void);
-typedef void (tHAL_API_CORE_INITIALIZED) (UINT8 *p_core_init_rsp_params);
+typedef void (tHAL_API_CORE_INITIALIZED) (UINT16 data_len, UINT8 *p_core_init_rsp_params);
 typedef void (tHAL_API_WRITE) (UINT16 data_len, UINT8 *p_data);
 typedef BOOLEAN (tHAL_API_PREDISCOVER) (void);
 typedef void (tHAL_API_CONTROL_GRANTED) (void);
@@ -205,7 +205,7 @@
 ** Returns          void
 **
 *******************************************************************************/
-EXPORT_HAL_API void HAL_NfcCoreInitialized (UINT8 *p_core_init_rsp_params);
+EXPORT_HAL_API void HAL_NfcCoreInitialized (UINT16 data_len, UINT8 *p_core_init_rsp_params);
 
 /*******************************************************************************
 **
diff --git a/src/include/NfcAdaptation.h b/src/include/NfcAdaptation.h
index bd9afcc..b1dd2fc 100644
--- a/src/include/NfcAdaptation.h
+++ b/src/include/NfcAdaptation.h
@@ -22,8 +22,16 @@
 #endif
 #include "nfc_target.h"
 #include "nfc_hal_api.h"
-#include <hardware/nfc.h>
 
+#include <utils/RefBase.h>
+
+namespace android {
+namespace hardware {
+namespace nfc {
+namespace V1_0 {
+    struct INfc;
+    struct INfcClientCallback;
+} } } }
 
 class ThreadMutex
 {
@@ -79,6 +87,8 @@
     ThreadCondVar    mCondVar;
     tHAL_NFC_ENTRY   mHalEntryFuncs; // function pointers for HAL entry points
     static nfc_nci_device_t* mHalDeviceContext;
+    static android::sp<android::hardware::nfc::V1_0::INfc> mHal;
+    static android::hardware::nfc::V1_0::INfcClientCallback* mCallback;
     static tHAL_NFC_CBACK* mHalCallback;
     static tHAL_NFC_DATA_CBACK* mHalDataCallback;
     static ThreadCondVar mHalOpenCompletedEvent;
@@ -94,7 +104,7 @@
     static void HalTerminate ();
     static void HalOpen (tHAL_NFC_CBACK* p_hal_cback, tHAL_NFC_DATA_CBACK* p_data_cback);
     static void HalClose ();
-    static void HalCoreInitialized (UINT8* p_core_init_rsp_params);
+    static void HalCoreInitialized (UINT16 data_len, UINT8* p_core_init_rsp_params);
     static void HalWrite (UINT16 data_len, UINT8* p_data);
     static BOOLEAN HalPrediscover ();
     static void HalControlGranted ();
@@ -103,4 +113,3 @@
     static void HalDownloadFirmwareCallback (nfc_event_t event, nfc_status_t event_status);
     static void HalDownloadFirmwareDataCallback (uint16_t data_len, uint8_t* p_data);
 };
-
diff --git a/src/nfc/nfc/nfc_ncif.c b/src/nfc/nfc/nfc_ncif.c
index 99ad256..06c12bb 100644
--- a/src/nfc/nfc/nfc_ncif.c
+++ b/src/nfc/nfc/nfc_ncif.c
@@ -1335,7 +1335,7 @@
         nfc_set_state (NFC_STATE_W4_POST_INIT_CPLT);
 
         nfc_cb.p_nci_init_rsp = p_msg;
-        nfc_cb.p_hal->core_initialized (p);
+        nfc_cb.p_hal->core_initialized (p_msg->len - p_msg->offset, p);
     }
     else
     {