1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker *
4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker *
8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker *
10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker */
16*4d7e907cSAndroid Build Coastguard Worker
17*4d7e907cSAndroid Build Coastguard Worker #include <unordered_map>
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker #include "VirtualHal.h"
20*4d7e907cSAndroid Build Coastguard Worker
21*4d7e907cSAndroid Build Coastguard Worker #include <android-base/logging.h>
22*4d7e907cSAndroid Build Coastguard Worker
23*4d7e907cSAndroid Build Coastguard Worker #include "util/CancellationSignal.h"
24*4d7e907cSAndroid Build Coastguard Worker
25*4d7e907cSAndroid Build Coastguard Worker #undef LOG_TAG
26*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "FaceVirtualHalAidl"
27*4d7e907cSAndroid Build Coastguard Worker
28*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::biometrics::face {
29*4d7e907cSAndroid Build Coastguard Worker using AcquiredInfoAndVendorCode = virtualhal::AcquiredInfoAndVendorCode;
30*4d7e907cSAndroid Build Coastguard Worker using Tag = AcquiredInfoAndVendorCode::Tag;
31*4d7e907cSAndroid Build Coastguard Worker
setEnrollments(const std::vector<int32_t> & enrollments)32*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setEnrollments(const std::vector<int32_t>& enrollments) {
33*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
34*4d7e907cSAndroid Build Coastguard Worker Face::cfg().setopt<OptIntVec>("enrollments", intVec2OptIntVec(enrollments));
35*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
36*4d7e907cSAndroid Build Coastguard Worker }
37*4d7e907cSAndroid Build Coastguard Worker
setEnrollmentHit(int32_t enrollment_hit)38*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setEnrollmentHit(int32_t enrollment_hit) {
39*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
40*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<std::int32_t>("enrollment_hit", enrollment_hit);
41*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
42*4d7e907cSAndroid Build Coastguard Worker }
43*4d7e907cSAndroid Build Coastguard Worker
setNextEnrollment(const::aidl::android::hardware::biometrics::face::NextEnrollment & next_enrollment)44*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setNextEnrollment(
45*4d7e907cSAndroid Build Coastguard Worker const ::aidl::android::hardware::biometrics::face::NextEnrollment& next_enrollment) {
46*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
47*4d7e907cSAndroid Build Coastguard Worker std::ostringstream os;
48*4d7e907cSAndroid Build Coastguard Worker os << next_enrollment.id << ":";
49*4d7e907cSAndroid Build Coastguard Worker
50*4d7e907cSAndroid Build Coastguard Worker int stepSize = next_enrollment.progressSteps.size();
51*4d7e907cSAndroid Build Coastguard Worker for (int i = 0; i < stepSize; i++) {
52*4d7e907cSAndroid Build Coastguard Worker auto& step = next_enrollment.progressSteps[i];
53*4d7e907cSAndroid Build Coastguard Worker os << step.durationMs;
54*4d7e907cSAndroid Build Coastguard Worker int acSize = step.acquiredInfoAndVendorCodes.size();
55*4d7e907cSAndroid Build Coastguard Worker for (int j = 0; j < acSize; j++) {
56*4d7e907cSAndroid Build Coastguard Worker if (j == 0) os << "-[";
57*4d7e907cSAndroid Build Coastguard Worker auto& acquiredInfoAndVendorCode = step.acquiredInfoAndVendorCodes[j];
58*4d7e907cSAndroid Build Coastguard Worker if (acquiredInfoAndVendorCode.getTag() == AcquiredInfoAndVendorCode::vendorCode)
59*4d7e907cSAndroid Build Coastguard Worker os << acquiredInfoAndVendorCode.get<Tag::vendorCode>();
60*4d7e907cSAndroid Build Coastguard Worker else if (acquiredInfoAndVendorCode.getTag() == AcquiredInfoAndVendorCode::acquiredInfo)
61*4d7e907cSAndroid Build Coastguard Worker os << (int)acquiredInfoAndVendorCode.get<Tag::acquiredInfo>();
62*4d7e907cSAndroid Build Coastguard Worker else
63*4d7e907cSAndroid Build Coastguard Worker LOG(FATAL) << "ERROR: wrong AcquiredInfoAndVendorCode union tag";
64*4d7e907cSAndroid Build Coastguard Worker if (j == acSize - 1)
65*4d7e907cSAndroid Build Coastguard Worker os << "]";
66*4d7e907cSAndroid Build Coastguard Worker else
67*4d7e907cSAndroid Build Coastguard Worker os << ",";
68*4d7e907cSAndroid Build Coastguard Worker }
69*4d7e907cSAndroid Build Coastguard Worker if (i == stepSize - 1)
70*4d7e907cSAndroid Build Coastguard Worker os << ":";
71*4d7e907cSAndroid Build Coastguard Worker else
72*4d7e907cSAndroid Build Coastguard Worker os << ",";
73*4d7e907cSAndroid Build Coastguard Worker }
74*4d7e907cSAndroid Build Coastguard Worker
75*4d7e907cSAndroid Build Coastguard Worker os << (next_enrollment.result ? "true" : "false");
76*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<std::string>("next_enrollment", os.str());
77*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
78*4d7e907cSAndroid Build Coastguard Worker }
79*4d7e907cSAndroid Build Coastguard Worker
setAuthenticatorId(int64_t in_id)80*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setAuthenticatorId(int64_t in_id) {
81*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
82*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<int64_t>("authenticator_id", in_id);
83*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
84*4d7e907cSAndroid Build Coastguard Worker }
85*4d7e907cSAndroid Build Coastguard Worker
setChallenge(int64_t in_challenge)86*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setChallenge(int64_t in_challenge) {
87*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
88*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<int64_t>("challenge", in_challenge);
89*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
90*4d7e907cSAndroid Build Coastguard Worker }
91*4d7e907cSAndroid Build Coastguard Worker
setOperationAuthenticateFails(bool in_fail)92*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setOperationAuthenticateFails(bool in_fail) {
93*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
94*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<bool>("operation_authenticate_fails", in_fail);
95*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
96*4d7e907cSAndroid Build Coastguard Worker }
97*4d7e907cSAndroid Build Coastguard Worker
setOperationAuthenticateLatency(const std::vector<int32_t> & in_latency)98*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setOperationAuthenticateLatency(
99*4d7e907cSAndroid Build Coastguard Worker const std::vector<int32_t>& in_latency) {
100*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus status = sanityCheckLatency(in_latency);
101*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
102*4d7e907cSAndroid Build Coastguard Worker return status;
103*4d7e907cSAndroid Build Coastguard Worker }
104*4d7e907cSAndroid Build Coastguard Worker
105*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
106*4d7e907cSAndroid Build Coastguard Worker Face::cfg().setopt<OptIntVec>("operation_authenticate_latency", intVec2OptIntVec(in_latency));
107*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
108*4d7e907cSAndroid Build Coastguard Worker }
109*4d7e907cSAndroid Build Coastguard Worker
setOperationAuthenticateDuration(int32_t in_duration)110*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setOperationAuthenticateDuration(int32_t in_duration) {
111*4d7e907cSAndroid Build Coastguard Worker if (in_duration < 0) {
112*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
113*4d7e907cSAndroid Build Coastguard Worker IVirtualHal::STATUS_INVALID_PARAMETER, "Error: duration can not be negative"));
114*4d7e907cSAndroid Build Coastguard Worker }
115*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
116*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<int32_t>("operation_authenticate_duration", in_duration);
117*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
118*4d7e907cSAndroid Build Coastguard Worker }
119*4d7e907cSAndroid Build Coastguard Worker
setOperationAuthenticateError(int32_t in_error)120*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setOperationAuthenticateError(int32_t in_error) {
121*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
122*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<int32_t>("operation_authenticate_error", in_error);
123*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
124*4d7e907cSAndroid Build Coastguard Worker }
125*4d7e907cSAndroid Build Coastguard Worker
setOperationAuthenticateAcquired(const std::vector<AcquiredInfoAndVendorCode> & in_acquired)126*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setOperationAuthenticateAcquired(
127*4d7e907cSAndroid Build Coastguard Worker const std::vector<AcquiredInfoAndVendorCode>& in_acquired) {
128*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
129*4d7e907cSAndroid Build Coastguard Worker Face::cfg().setopt<OptIntVec>("operation_authenticate_acquired",
130*4d7e907cSAndroid Build Coastguard Worker acquiredInfoVec2OptIntVec(in_acquired));
131*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
132*4d7e907cSAndroid Build Coastguard Worker }
133*4d7e907cSAndroid Build Coastguard Worker
setOperationEnrollLatency(const std::vector<int32_t> & in_latency)134*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setOperationEnrollLatency(const std::vector<int32_t>& in_latency) {
135*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus status = sanityCheckLatency(in_latency);
136*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
137*4d7e907cSAndroid Build Coastguard Worker return status;
138*4d7e907cSAndroid Build Coastguard Worker }
139*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
140*4d7e907cSAndroid Build Coastguard Worker Face::cfg().setopt<OptIntVec>("operation_enroll_latency", intVec2OptIntVec(in_latency));
141*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
142*4d7e907cSAndroid Build Coastguard Worker }
143*4d7e907cSAndroid Build Coastguard Worker
setOperationDetectInteractionLatency(const std::vector<int32_t> & in_latency)144*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setOperationDetectInteractionLatency(
145*4d7e907cSAndroid Build Coastguard Worker const std::vector<int32_t>& in_latency) {
146*4d7e907cSAndroid Build Coastguard Worker ndk::ScopedAStatus status = sanityCheckLatency(in_latency);
147*4d7e907cSAndroid Build Coastguard Worker if (!status.isOk()) {
148*4d7e907cSAndroid Build Coastguard Worker return status;
149*4d7e907cSAndroid Build Coastguard Worker }
150*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
151*4d7e907cSAndroid Build Coastguard Worker Face::cfg().setopt<OptIntVec>("operation_detect_interact_latency",
152*4d7e907cSAndroid Build Coastguard Worker intVec2OptIntVec(in_latency));
153*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
154*4d7e907cSAndroid Build Coastguard Worker }
155*4d7e907cSAndroid Build Coastguard Worker
setOperationDetectInteractionFails(bool in_fails)156*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setOperationDetectInteractionFails(bool in_fails) {
157*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
158*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<bool>("operation_detect_interaction_fails", in_fails);
159*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
160*4d7e907cSAndroid Build Coastguard Worker }
161*4d7e907cSAndroid Build Coastguard Worker
setLockout(bool in_lockout)162*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setLockout(bool in_lockout) {
163*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
164*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<bool>("lockout", in_lockout);
165*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
166*4d7e907cSAndroid Build Coastguard Worker }
167*4d7e907cSAndroid Build Coastguard Worker
setLockoutEnable(bool in_enable)168*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setLockoutEnable(bool in_enable) {
169*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
170*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<bool>("lockout_enable", in_enable);
171*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
172*4d7e907cSAndroid Build Coastguard Worker }
173*4d7e907cSAndroid Build Coastguard Worker
setLockoutTimedEnable(bool in_enable)174*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setLockoutTimedEnable(bool in_enable) {
175*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
176*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<bool>("lockout_timed_enable", in_enable);
177*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
178*4d7e907cSAndroid Build Coastguard Worker }
179*4d7e907cSAndroid Build Coastguard Worker
setLockoutTimedThreshold(int32_t in_threshold)180*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setLockoutTimedThreshold(int32_t in_threshold) {
181*4d7e907cSAndroid Build Coastguard Worker if (in_threshold < 0) {
182*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
183*4d7e907cSAndroid Build Coastguard Worker IVirtualHal::STATUS_INVALID_PARAMETER, "Error: threshold can not be negative"));
184*4d7e907cSAndroid Build Coastguard Worker }
185*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
186*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<int32_t>("lockout_timed_threshold", in_threshold);
187*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
188*4d7e907cSAndroid Build Coastguard Worker }
189*4d7e907cSAndroid Build Coastguard Worker
setLockoutTimedDuration(int32_t in_duration)190*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setLockoutTimedDuration(int32_t in_duration) {
191*4d7e907cSAndroid Build Coastguard Worker if (in_duration < 0) {
192*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
193*4d7e907cSAndroid Build Coastguard Worker IVirtualHal::STATUS_INVALID_PARAMETER, "Error: duration can not be negative"));
194*4d7e907cSAndroid Build Coastguard Worker }
195*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
196*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<int32_t>("lockout_timed_duration", in_duration);
197*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
198*4d7e907cSAndroid Build Coastguard Worker }
199*4d7e907cSAndroid Build Coastguard Worker
setLockoutPermanentThreshold(int32_t in_threshold)200*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setLockoutPermanentThreshold(int32_t in_threshold) {
201*4d7e907cSAndroid Build Coastguard Worker if (in_threshold < 0) {
202*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
203*4d7e907cSAndroid Build Coastguard Worker IVirtualHal::STATUS_INVALID_PARAMETER, "Error: threshold can not be negative"));
204*4d7e907cSAndroid Build Coastguard Worker }
205*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
206*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<int32_t>("lockout_permanent_threshold", in_threshold);
207*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
208*4d7e907cSAndroid Build Coastguard Worker }
209*4d7e907cSAndroid Build Coastguard Worker
resetConfigurations()210*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::resetConfigurations() {
211*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
212*4d7e907cSAndroid Build Coastguard Worker Face::cfg().init();
213*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
214*4d7e907cSAndroid Build Coastguard Worker }
215*4d7e907cSAndroid Build Coastguard Worker
setType(::aidl::android::hardware::biometrics::face::FaceSensorType in_type)216*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setType(
217*4d7e907cSAndroid Build Coastguard Worker ::aidl::android::hardware::biometrics::face::FaceSensorType in_type) {
218*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
219*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<std::string>("type", Face::type2String(in_type));
220*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
221*4d7e907cSAndroid Build Coastguard Worker }
222*4d7e907cSAndroid Build Coastguard Worker
setSensorStrength(common::SensorStrength in_strength)223*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::setSensorStrength(common::SensorStrength in_strength) {
224*4d7e907cSAndroid Build Coastguard Worker Face::cfg().sourcedFromAidl();
225*4d7e907cSAndroid Build Coastguard Worker Face::cfg().set<std::string>("strength", Face::strength2String(in_strength));
226*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
227*4d7e907cSAndroid Build Coastguard Worker }
228*4d7e907cSAndroid Build Coastguard Worker
intVec2OptIntVec(const std::vector<int32_t> & in_vec)229*4d7e907cSAndroid Build Coastguard Worker OptIntVec VirtualHal::intVec2OptIntVec(const std::vector<int32_t>& in_vec) {
230*4d7e907cSAndroid Build Coastguard Worker OptIntVec optIntVec;
231*4d7e907cSAndroid Build Coastguard Worker std::transform(in_vec.begin(), in_vec.end(), std::back_inserter(optIntVec),
232*4d7e907cSAndroid Build Coastguard Worker [](int value) { return std::optional<int>(value); });
233*4d7e907cSAndroid Build Coastguard Worker return optIntVec;
234*4d7e907cSAndroid Build Coastguard Worker }
235*4d7e907cSAndroid Build Coastguard Worker
acquiredInfoVec2OptIntVec(const std::vector<AcquiredInfoAndVendorCode> & in_vec)236*4d7e907cSAndroid Build Coastguard Worker OptIntVec VirtualHal::acquiredInfoVec2OptIntVec(
237*4d7e907cSAndroid Build Coastguard Worker const std::vector<AcquiredInfoAndVendorCode>& in_vec) {
238*4d7e907cSAndroid Build Coastguard Worker OptIntVec optIntVec;
239*4d7e907cSAndroid Build Coastguard Worker std::transform(in_vec.begin(), in_vec.end(), std::back_inserter(optIntVec),
240*4d7e907cSAndroid Build Coastguard Worker [](AcquiredInfoAndVendorCode ac) {
241*4d7e907cSAndroid Build Coastguard Worker int value;
242*4d7e907cSAndroid Build Coastguard Worker if (ac.getTag() == AcquiredInfoAndVendorCode::acquiredInfo)
243*4d7e907cSAndroid Build Coastguard Worker value = (int)ac.get<Tag::acquiredInfo>();
244*4d7e907cSAndroid Build Coastguard Worker else if (ac.getTag() == AcquiredInfoAndVendorCode::vendorCode)
245*4d7e907cSAndroid Build Coastguard Worker value = ac.get<Tag::vendorCode>();
246*4d7e907cSAndroid Build Coastguard Worker else
247*4d7e907cSAndroid Build Coastguard Worker LOG(FATAL) << "ERROR: wrong AcquiredInfoAndVendorCode tag";
248*4d7e907cSAndroid Build Coastguard Worker return std::optional<int>(value);
249*4d7e907cSAndroid Build Coastguard Worker });
250*4d7e907cSAndroid Build Coastguard Worker return optIntVec;
251*4d7e907cSAndroid Build Coastguard Worker }
252*4d7e907cSAndroid Build Coastguard Worker
sanityCheckLatency(const std::vector<int32_t> & in_latency)253*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::sanityCheckLatency(const std::vector<int32_t>& in_latency) {
254*4d7e907cSAndroid Build Coastguard Worker if (in_latency.size() == 0 || in_latency.size() > 2) {
255*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
256*4d7e907cSAndroid Build Coastguard Worker IVirtualHal::STATUS_INVALID_PARAMETER,
257*4d7e907cSAndroid Build Coastguard Worker "Error: input input array must contain 1 or 2 elements"));
258*4d7e907cSAndroid Build Coastguard Worker }
259*4d7e907cSAndroid Build Coastguard Worker
260*4d7e907cSAndroid Build Coastguard Worker for (auto x : in_latency) {
261*4d7e907cSAndroid Build Coastguard Worker if (x < 0) {
262*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage(
263*4d7e907cSAndroid Build Coastguard Worker IVirtualHal::STATUS_INVALID_PARAMETER,
264*4d7e907cSAndroid Build Coastguard Worker "Error: input data must not be negative"));
265*4d7e907cSAndroid Build Coastguard Worker }
266*4d7e907cSAndroid Build Coastguard Worker }
267*4d7e907cSAndroid Build Coastguard Worker
268*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
269*4d7e907cSAndroid Build Coastguard Worker }
270*4d7e907cSAndroid Build Coastguard Worker
getFaceHal(std::shared_ptr<IFace> * pFace)271*4d7e907cSAndroid Build Coastguard Worker ::ndk::ScopedAStatus VirtualHal::getFaceHal(std::shared_ptr<IFace>* pFace) {
272*4d7e907cSAndroid Build Coastguard Worker *pFace = mFp;
273*4d7e907cSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
274*4d7e907cSAndroid Build Coastguard Worker }
275*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::biometrics::face
276