Snap for 11084970 from 5a5e660682606666db29e99dcb0cfd8c334979e9 to 24Q1-release

Change-Id: I0f34aa6c863c2957c319e75470a92e510d64bd95
diff --git a/Android.bp b/Android.bp
index 6f06246..bb9b998 100755
--- a/Android.bp
+++ b/Android.bp
@@ -67,3 +67,30 @@
         "-fexceptions",
     ],
 }
+
+cc_binary {
+    name: "android.hardware.weaver-service.nxp",
+    relative_install_path: "hw",
+    init_rc: ["aidl_impl/android.hardware.weaver-service.nxp.rc"],
+    vintf_fragments: ["aidl_impl/android.hardware.weaver-service.nxp.xml"],
+    vendor: true,
+    srcs: [
+        "aidl_impl/service.cpp",
+        "aidl_impl/Weaver.cpp",
+    ],
+
+    local_include_dirs: [
+        "libese_weaver/inc",
+    ],
+    cppflags: [
+        "-Wall",
+        "-fexceptions",
+    ],
+    shared_libs: [
+        "android.hardware.weaver-V2-ndk",
+        "libbase",
+        "libbinder_ndk",
+        "liblog",
+        "ese_weaver.nxp",
+    ],
+}
diff --git a/NOTICE b/NOTICE
index a0ac881..e14ff16 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,6 +1,6 @@
 Copyright (C) 2017 The Android Open Source Project
 
-icensed under the Apache License, Version 2.0 (the "License");
+Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at
 
diff --git a/aidl_impl/Weaver.cpp b/aidl_impl/Weaver.cpp
new file mode 100644
index 0000000..66f1313
--- /dev/null
+++ b/aidl_impl/Weaver.cpp
@@ -0,0 +1,148 @@
+/******************************************************************************
+ *
+ *  Copyright 2023 NXP
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+#include "Weaver.h"
+#include <log/log.h>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace weaver {
+
+using ::ndk::ScopedAStatus;
+using std::vector;
+
+// Methods from ::android::hardware::weaver::IWeaver follow.
+
+Weaver::Weaver() {
+  ALOGD("Weaver Constructor");
+  pInterface = WeaverImpl::getInstance();
+  if (pInterface != NULL) {
+    pInterface->Init();
+  } else {
+    ALOGE("Failed to get Weaver Interface");
+  }
+}
+
+ScopedAStatus Weaver::getConfig(WeaverConfig *out_config) {
+  ALOGD("Weaver::getConfig");
+
+  if (out_config == NULL) {
+    ALOGE("Invalid param");
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(
+        STATUS_FAILED, "Null pointer passed");
+  }
+  memset(out_config, 0, sizeof(WeaverConfig));
+
+  if (pInterface == NULL) {
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(
+        STATUS_FAILED, "Weaver interface not defined");
+  }
+  SlotInfo slotInfo;
+  Status_Weaver status = pInterface->GetSlots(slotInfo);
+  if (status == WEAVER_STATUS_OK) {
+    out_config->slots = slotInfo.slots;
+    out_config->keySize = slotInfo.keySize;
+    out_config->valueSize = slotInfo.valueSize;
+    ALOGD("Weaver Success for getSlots Slots :(%d)", out_config->slots);
+    return ScopedAStatus::ok();
+  } else {
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(
+        STATUS_FAILED, "Failed to retrieve slots info");
+  }
+}
+
+ScopedAStatus Weaver::read(int32_t in_slotId, const vector<uint8_t> &in_key,
+                           WeaverReadResponse *out_response) {
+
+  ALOGD("Weaver::read slot %d", in_slotId);
+  if (out_response == NULL) {
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(
+        STATUS_FAILED, "Null pointer passed");
+  }
+  if (in_key.empty()) {
+    out_response->status = WeaverReadStatus::FAILED;
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(
+        STATUS_FAILED, "Empty key input passed");
+  }
+  if (pInterface == NULL) {
+    out_response->status = WeaverReadStatus::FAILED;
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(
+        STATUS_FAILED, "Weaver interface not defined");
+  }
+  memset(out_response, 0, sizeof(WeaverReadResponse));
+
+  ReadRespInfo readInfo;
+  ScopedAStatus retStatus;
+  Status_Weaver status;
+
+  status = pInterface->Read(in_slotId, in_key, readInfo);
+  switch (status) {
+  case WEAVER_STATUS_OK:
+    ALOGD("Read slot %d OK", in_slotId);
+    out_response->value = readInfo.value;
+    out_response->status = WeaverReadStatus::OK;
+    retStatus = ScopedAStatus::ok();
+    break;
+  case WEAVER_STATUS_INCORRECT_KEY:
+    ALOGE("Read Incorrect Key");
+    out_response->value.resize(0);
+    out_response->timeout = readInfo.timeout;
+    out_response->status = WeaverReadStatus::INCORRECT_KEY;
+    retStatus = ScopedAStatus::ok();
+    break;
+  case WEAVER_STATUS_THROTTLE:
+    ALOGE("Read WEAVER_THROTTLE");
+    out_response->value.resize(0);
+    out_response->timeout = readInfo.timeout;
+    out_response->status = WeaverReadStatus::THROTTLE;
+    retStatus = ScopedAStatus::ok();
+    break;
+  default:
+    out_response->timeout = 0;
+    out_response->value.resize(0);
+    out_response->status = WeaverReadStatus::FAILED;
+    retStatus = ScopedAStatus::ok();
+    break;
+  }
+  return retStatus;
+}
+
+ScopedAStatus Weaver::write(int32_t in_slotId, const vector<uint8_t> &in_key,
+                            const vector<uint8_t> &in_value) {
+  ALOGD("Weaver::write slot %d", in_slotId);
+  if (in_key.empty() || in_value.empty()) {
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(
+        STATUS_FAILED, "Invalid parameters passed");
+  }
+  if (pInterface == NULL) {
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(
+        STATUS_FAILED, "Weaver interface not defined");
+  }
+  if (pInterface->Write(in_slotId, in_key, in_value) == WEAVER_STATUS_OK) {
+    ALOGD("Write slot %d OK", in_slotId);
+    return ScopedAStatus::ok();
+  } else {
+    return ScopedAStatus::fromServiceSpecificErrorWithMessage(STATUS_FAILED,
+                                                              "Unknown error");
+  }
+}
+
+} // namespace weaver
+} // namespace hardware
+} // namespace android
+} // namespace aidl
diff --git a/aidl_impl/Weaver.h b/aidl_impl/Weaver.h
new file mode 100644
index 0000000..1eaa5cc
--- /dev/null
+++ b/aidl_impl/Weaver.h
@@ -0,0 +1,51 @@
+/******************************************************************************
+ *
+ *  Copyright 2023 NXP
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+#pragma once
+
+#include <aidl/android/hardware/weaver/BnWeaver.h>
+#include <weaver-impl.h>
+#include <weaver_interface.h>
+
+namespace aidl {
+namespace android {
+namespace hardware {
+namespace weaver {
+
+using ::aidl::android::hardware::weaver::WeaverConfig;
+using ::aidl::android::hardware::weaver::WeaverReadResponse;
+using ::ndk::ScopedAStatus;
+using std::vector;
+
+struct Weaver : public BnWeaver {
+public:
+  Weaver();
+  // Methods from ::android::hardware::weaver::IWeaver follow.
+  ScopedAStatus getConfig(WeaverConfig *_aidl_return) override;
+  ScopedAStatus read(int32_t in_slotId, const vector<uint8_t> &in_key,
+                     WeaverReadResponse *_aidl_return) override;
+  ScopedAStatus write(int32_t in_slotId, const vector<uint8_t> &in_key,
+                      const vector<uint8_t> &in_value) override;
+
+private:
+  WeaverInterface *pInterface = nullptr;
+};
+
+} // namespace weaver
+} // namespace hardware
+} // namespace android
+} // namespace aidl
diff --git a/aidl_impl/android.hardware.weaver-service.nxp.rc b/aidl_impl/android.hardware.weaver-service.nxp.rc
new file mode 100644
index 0000000..5516e65
--- /dev/null
+++ b/aidl_impl/android.hardware.weaver-service.nxp.rc
@@ -0,0 +1,4 @@
+service vendor.weaver_nxp /vendor/bin/hw/android.hardware.weaver-service.nxp
+    class hal
+    user vendor_nxp_weaver
+    group system drmrpc
diff --git a/aidl_impl/android.hardware.weaver-service.nxp.xml b/aidl_impl/android.hardware.weaver-service.nxp.xml
new file mode 100644
index 0000000..bfe4396
--- /dev/null
+++ b/aidl_impl/android.hardware.weaver-service.nxp.xml
@@ -0,0 +1,10 @@
+<manifest version="1.0" type="device">
+    <hal format="aidl">
+        <name>android.hardware.weaver</name>
+        <version>2</version>
+        <interface>
+            <name>IWeaver</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
+</manifest>
diff --git a/aidl_impl/service.cpp b/aidl_impl/service.cpp
new file mode 100644
index 0000000..570f427
--- /dev/null
+++ b/aidl_impl/service.cpp
@@ -0,0 +1,44 @@
+/******************************************************************************
+ *
+ *  Copyright 2023 NXP
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+#include "Weaver.h"
+#include <android-base/logging.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
+#include <log/log.h>
+
+using ::aidl::android::hardware::weaver::Weaver;
+
+int main() {
+  try {
+    ABinderProcess_setThreadPoolMaxThreadCount(0);
+    std::shared_ptr<Weaver> weaver = ndk::SharedRefBase::make<Weaver>();
+
+    const std::string instance =
+        std::string() + Weaver::descriptor + "/default";
+    binder_status_t status =
+        AServiceManager_addService(weaver->asBinder().get(), instance.c_str());
+    CHECK(status == STATUS_OK);
+
+    ABinderProcess_joinThreadPool();
+  } catch (std::__1::ios_base::failure &e) {
+    ALOGE("ios failure Exception occurred = %s ", e.what());
+  } catch (std::__1::system_error &e) {
+    ALOGE("system error Exception occurred = %s ", e.what());
+  }
+  return -1; // Should never be reached
+}