Added more methods in IVirtualHal interface

Bug: 326227403
Test: atest android.hardware.biometrics.fingerprint.* -c
Change-Id: If5cdd5e5cfea96ef941852ea286f865a99ef8ba8
diff --git a/biometrics/fingerprint/aidl/default/VirtualHal.cpp b/biometrics/fingerprint/aidl/default/VirtualHal.cpp
index d2baaf5..e107d2f 100644
--- a/biometrics/fingerprint/aidl/default/VirtualHal.cpp
+++ b/biometrics/fingerprint/aidl/default/VirtualHal.cpp
@@ -27,6 +27,8 @@
 
 namespace aidl::android::hardware::biometrics::fingerprint {
 
+using Tag = AcquiredInfoAndVendorCode::Tag;
+
 ::ndk::ScopedAStatus VirtualHal::setEnrollments(const std::vector<int32_t>& enrollments) {
     Fingerprint::cfg().sourcedFromAidl();
     Fingerprint::cfg().setopt<OptIntVec>("enrollments", intVec2OptIntVec(enrollments));
@@ -39,6 +41,42 @@
     return ndk::ScopedAStatus::ok();
 }
 
+::ndk::ScopedAStatus VirtualHal::setNextEnrollment(
+        const ::aidl::android::hardware::biometrics::fingerprint::NextEnrollment& next_enrollment) {
+    Fingerprint::cfg().sourcedFromAidl();
+    std::ostringstream os;
+    os << next_enrollment.id << ":";
+
+    int stepSize = next_enrollment.progressSteps.size();
+    for (int i = 0; i < stepSize; i++) {
+        auto& step = next_enrollment.progressSteps[i];
+        os << step.durationMs;
+        int acSize = step.acquiredInfoAndVendorCodes.size();
+        for (int j = 0; j < acSize; j++) {
+            if (j == 0) os << "-[";
+            auto& acquiredInfoAndVendorCode = step.acquiredInfoAndVendorCodes[j];
+            if (acquiredInfoAndVendorCode.getTag() == AcquiredInfoAndVendorCode::vendorCode)
+                os << acquiredInfoAndVendorCode.get<Tag::vendorCode>();
+            else if (acquiredInfoAndVendorCode.getTag() == AcquiredInfoAndVendorCode::acquiredInfo)
+                os << (int)acquiredInfoAndVendorCode.get<Tag::acquiredInfo>();
+            else
+                LOG(FATAL) << "ERROR: wrong AcquiredInfoAndVendorCode union tag";
+            if (j == acSize - 1)
+                os << "]";
+            else
+                os << ",";
+        }
+        if (i == stepSize - 1)
+            os << ":";
+        else
+            os << ",";
+    }
+
+    os << (next_enrollment.result ? "true" : "false");
+    Fingerprint::cfg().set<std::string>("next_enrollment", os.str());
+    return ndk::ScopedAStatus::ok();
+}
+
 ::ndk::ScopedAStatus VirtualHal::setAuthenticatorId(int64_t in_id) {
     Fingerprint::cfg().sourcedFromAidl();
     Fingerprint::cfg().set<int64_t>("authenticator_id", in_id);
@@ -87,10 +125,10 @@
 }
 
 ::ndk::ScopedAStatus VirtualHal::setOperationAuthenticateAcquired(
-        const std::vector<int32_t>& in_acquired) {
+        const std::vector<AcquiredInfoAndVendorCode>& in_acquired) {
     Fingerprint::cfg().sourcedFromAidl();
     Fingerprint::cfg().setopt<OptIntVec>("operation_authenticate_acquired",
-                                         intVec2OptIntVec(in_acquired));
+                                         acquiredInfoVec2OptIntVec(in_acquired));
     return ndk::ScopedAStatus::ok();
 }
 
@@ -139,10 +177,10 @@
 }
 
 ::ndk::ScopedAStatus VirtualHal::setOperationDetectInteractionAcquired(
-        const std::vector<int32_t>& in_acquired) {
+        const std::vector<AcquiredInfoAndVendorCode>& in_acquired) {
     Fingerprint::cfg().sourcedFromAidl();
     Fingerprint::cfg().setopt<OptIntVec>("operation_detect_interaction_acquired",
-                                         intVec2OptIntVec(in_acquired));
+                                         acquiredInfoVec2OptIntVec(in_acquired));
     return ndk::ScopedAStatus::ok();
 }
 
@@ -188,6 +226,12 @@
     return ndk::ScopedAStatus::ok();
 }
 
+::ndk::ScopedAStatus VirtualHal::resetConfigurations() {
+    Fingerprint::cfg().sourcedFromAidl();
+    Fingerprint::cfg().init();
+    return ndk::ScopedAStatus::ok();
+}
+
 ::ndk::ScopedAStatus VirtualHal::setType(
         ::aidl::android::hardware::biometrics::fingerprint::FingerprintSensorType in_type) {
     Fingerprint::cfg().sourcedFromAidl();
@@ -254,6 +298,23 @@
     return optIntVec;
 }
 
+OptIntVec VirtualHal::acquiredInfoVec2OptIntVec(
+        const std::vector<AcquiredInfoAndVendorCode>& in_vec) {
+    OptIntVec optIntVec;
+    std::transform(in_vec.begin(), in_vec.end(), std::back_inserter(optIntVec),
+                   [](AcquiredInfoAndVendorCode ac) {
+                       int value;
+                       if (ac.getTag() == AcquiredInfoAndVendorCode::acquiredInfo)
+                           value = (int)ac.get<Tag::acquiredInfo>();
+                       else if (ac.getTag() == AcquiredInfoAndVendorCode::vendorCode)
+                           value = ac.get<Tag::vendorCode>();
+                       else
+                           LOG(FATAL) << "ERROR: wrong AcquiredInfoAndVendorCode tag";
+                       return std::optional<int>(value);
+                   });
+    return optIntVec;
+}
+
 ::ndk::ScopedAStatus VirtualHal::sanityCheckLatency(const std::vector<int32_t>& in_latency) {
     if (in_latency.size() == 0 || in_latency.size() > 2) {
         return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
diff --git a/biometrics/fingerprint/aidl/default/include/VirtualHal.h b/biometrics/fingerprint/aidl/default/include/VirtualHal.h
index 6cc4b66..e5f62fc 100644
--- a/biometrics/fingerprint/aidl/default/include/VirtualHal.h
+++ b/biometrics/fingerprint/aidl/default/include/VirtualHal.h
@@ -28,6 +28,9 @@
 
     ::ndk::ScopedAStatus setEnrollments(const std::vector<int32_t>& in_id) override;
     ::ndk::ScopedAStatus setEnrollmentHit(int32_t in_hit_id) override;
+    ::ndk::ScopedAStatus setNextEnrollment(
+            const ::aidl::android::hardware::biometrics::fingerprint::NextEnrollment&
+                    in_next_enrollment) override;
     ::ndk::ScopedAStatus setAuthenticatorId(int64_t in_id) override;
     ::ndk::ScopedAStatus setChallenge(int64_t in_challenge) override;
     ::ndk::ScopedAStatus setOperationAuthenticateFails(bool in_fail) override;
@@ -36,7 +39,7 @@
     ::ndk::ScopedAStatus setOperationAuthenticateDuration(int32_t in_duration) override;
     ::ndk::ScopedAStatus setOperationAuthenticateError(int32_t in_error) override;
     ::ndk::ScopedAStatus setOperationAuthenticateAcquired(
-            const std::vector<int32_t>& in_acquired) override;
+            const std::vector<AcquiredInfoAndVendorCode>& in_acquired) override;
     ::ndk::ScopedAStatus setOperationEnrollError(int32_t in_error) override;
     ::ndk::ScopedAStatus setOperationEnrollLatency(const std::vector<int32_t>& in_latency) override;
     ::ndk::ScopedAStatus setOperationDetectInteractionLatency(
@@ -44,12 +47,13 @@
     ::ndk::ScopedAStatus setOperationDetectInteractionError(int32_t in_error) override;
     ::ndk::ScopedAStatus setOperationDetectInteractionDuration(int32_t in_duration) override;
     ::ndk::ScopedAStatus setOperationDetectInteractionAcquired(
-            const std::vector<int32_t>& in_acquired) override;
+            const std::vector<AcquiredInfoAndVendorCode>& in_acquired) override;
     ::ndk::ScopedAStatus setLockout(bool in_lockout) override;
     ::ndk::ScopedAStatus setLockoutEnable(bool in_enable) override;
     ::ndk::ScopedAStatus setLockoutTimedThreshold(int32_t in_threshold) override;
     ::ndk::ScopedAStatus setLockoutTimedDuration(int32_t in_duration) override;
     ::ndk::ScopedAStatus setLockoutPermanentThreshold(int32_t in_threshold) override;
+    ::ndk::ScopedAStatus resetConfigurations() override;
     ::ndk::ScopedAStatus setType(
             ::aidl::android::hardware::biometrics::fingerprint::FingerprintSensorType in_type)
             override;
@@ -66,6 +70,7 @@
 
   private:
     OptIntVec intVec2OptIntVec(const std::vector<int32_t>& intVec);
+    OptIntVec acquiredInfoVec2OptIntVec(const std::vector<AcquiredInfoAndVendorCode>& intVec);
     ::ndk::ScopedAStatus sanityCheckLatency(const std::vector<int32_t>& in_latency);
     Fingerprint* mFp;
 };
diff --git a/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp b/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
index d8495d1..3fe0b2a 100644
--- a/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
+++ b/biometrics/fingerprint/aidl/default/tests/VirtualHalTest.cpp
@@ -100,6 +100,27 @@
     ASSERT_TRUE(Fingerprint::cfg().get<int32_t>("enrollment_hit") == 11);
 }
 
+TEST_F(VirtualHalTest, next_enrollment) {
+    struct {
+        std::string nextEnrollmentStr;
+        fingerprint::NextEnrollment nextEnrollment;
+    } testData[] = {
+            {"1:20:true", {1, {{20}}, true}},
+            {"1:50,60,70:true", {1, {{50}, {60}, {70}}, true}},
+            {"2:50-[8],60,70-[2,1002,1]:false",
+             {2,
+              {{50, {{AcquiredInfo::START}}},
+               {60},
+               {70, {{AcquiredInfo::PARTIAL}, {1002}, {AcquiredInfo::GOOD}}}},
+              false}},
+    };
+
+    for (auto& d : testData) {
+        mVhal->setNextEnrollment(d.nextEnrollment);
+        ASSERT_TRUE(Fingerprint::cfg().get<std::string>("next_enrollment") == d.nextEnrollmentStr);
+    }
+}
+
 TEST_F(VirtualHalTest, authenticator_id_int64) {
     mVhal->setAuthenticatorId(12345678900);
     ASSERT_TRUE(Fingerprint::cfg().get<int64_t>("authenticator_id") == 12345678900);
@@ -111,12 +132,16 @@
 }
 
 TEST_F(VirtualHalTest, operationAuthenticateAcquired_int32_vector) {
-    std::vector<int32_t> ac{1, 2, 3, 4, 5, 6, 7};
+    using Tag = AcquiredInfoAndVendorCode::Tag;
+    std::vector<AcquiredInfoAndVendorCode> ac{
+            {AcquiredInfo::START}, {AcquiredInfo::PARTIAL}, {1023}};
     mVhal->setOperationAuthenticateAcquired(ac);
     OptIntVec ac_get = Fingerprint::cfg().getopt<OptIntVec>("operation_authenticate_acquired");
     ASSERT_TRUE(ac_get.size() == ac.size());
     for (int i = 0; i < ac.size(); i++) {
-        ASSERT_TRUE(ac[i] == ac_get[i]);
+        int acCode = (ac[i].getTag() == Tag::acquiredInfo) ? (int)ac[i].get<Tag::acquiredInfo>()
+                                                           : ac[i].get<Tag::vendorCode>();
+        ASSERT_TRUE(acCode == ac_get[i]);
     }
 }
 
@@ -212,7 +237,7 @@
     mVhal->setOperationEnrollError(5);
     mVhal->setOperationEnrollLatency({4, 5});
     mVhal->setOperationDetectInteractionError(6);
-    mVhal->setOperationDetectInteractionAcquired({4, 3, 2});
+    mVhal->setOperationDetectInteractionAcquired({{AcquiredInfo::START}, {AcquiredInfo::GOOD}});
     mVhal->setLockout(false);
     mVhal->setLockoutEnable(false);
     mVhal->setSensorId(5);