1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2017 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 #define LOG_TAG "[email protected]"
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_VERBOSE "[email protected]"
18*4d7e907cSAndroid Build Coastguard Worker
19*4d7e907cSAndroid Build Coastguard Worker #include <hardware/hw_auth_token.h>
20*4d7e907cSAndroid Build Coastguard Worker
21*4d7e907cSAndroid Build Coastguard Worker #include <hardware/hardware.h>
22*4d7e907cSAndroid Build Coastguard Worker #include <hardware/fingerprint.h>
23*4d7e907cSAndroid Build Coastguard Worker #include "BiometricsFingerprint.h"
24*4d7e907cSAndroid Build Coastguard Worker
25*4d7e907cSAndroid Build Coastguard Worker #include <inttypes.h>
26*4d7e907cSAndroid Build Coastguard Worker #include <unistd.h>
27*4d7e907cSAndroid Build Coastguard Worker
28*4d7e907cSAndroid Build Coastguard Worker namespace android {
29*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
30*4d7e907cSAndroid Build Coastguard Worker namespace biometrics {
31*4d7e907cSAndroid Build Coastguard Worker namespace fingerprint {
32*4d7e907cSAndroid Build Coastguard Worker namespace V2_1 {
33*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
34*4d7e907cSAndroid Build Coastguard Worker
35*4d7e907cSAndroid Build Coastguard Worker // Supported fingerprint HAL version
36*4d7e907cSAndroid Build Coastguard Worker static const uint16_t kVersion = HARDWARE_MODULE_API_VERSION(2, 1);
37*4d7e907cSAndroid Build Coastguard Worker
38*4d7e907cSAndroid Build Coastguard Worker using RequestStatus =
39*4d7e907cSAndroid Build Coastguard Worker android::hardware::biometrics::fingerprint::V2_1::RequestStatus;
40*4d7e907cSAndroid Build Coastguard Worker
41*4d7e907cSAndroid Build Coastguard Worker BiometricsFingerprint *BiometricsFingerprint::sInstance = nullptr;
42*4d7e907cSAndroid Build Coastguard Worker
BiometricsFingerprint()43*4d7e907cSAndroid Build Coastguard Worker BiometricsFingerprint::BiometricsFingerprint() : mClientCallback(nullptr), mDevice(nullptr) {
44*4d7e907cSAndroid Build Coastguard Worker sInstance = this; // keep track of the most recent instance
45*4d7e907cSAndroid Build Coastguard Worker mDevice = openHal();
46*4d7e907cSAndroid Build Coastguard Worker if (!mDevice) {
47*4d7e907cSAndroid Build Coastguard Worker ALOGE("Can't open HAL module");
48*4d7e907cSAndroid Build Coastguard Worker }
49*4d7e907cSAndroid Build Coastguard Worker }
50*4d7e907cSAndroid Build Coastguard Worker
~BiometricsFingerprint()51*4d7e907cSAndroid Build Coastguard Worker BiometricsFingerprint::~BiometricsFingerprint() {
52*4d7e907cSAndroid Build Coastguard Worker ALOGV("~BiometricsFingerprint()");
53*4d7e907cSAndroid Build Coastguard Worker if (mDevice == nullptr) {
54*4d7e907cSAndroid Build Coastguard Worker ALOGE("No valid device");
55*4d7e907cSAndroid Build Coastguard Worker return;
56*4d7e907cSAndroid Build Coastguard Worker }
57*4d7e907cSAndroid Build Coastguard Worker int err;
58*4d7e907cSAndroid Build Coastguard Worker if (0 != (err = mDevice->common.close(
59*4d7e907cSAndroid Build Coastguard Worker reinterpret_cast<hw_device_t*>(mDevice)))) {
60*4d7e907cSAndroid Build Coastguard Worker ALOGE("Can't close fingerprint module, error: %d", err);
61*4d7e907cSAndroid Build Coastguard Worker return;
62*4d7e907cSAndroid Build Coastguard Worker }
63*4d7e907cSAndroid Build Coastguard Worker mDevice = nullptr;
64*4d7e907cSAndroid Build Coastguard Worker }
65*4d7e907cSAndroid Build Coastguard Worker
ErrorFilter(int32_t error)66*4d7e907cSAndroid Build Coastguard Worker Return<RequestStatus> BiometricsFingerprint::ErrorFilter(int32_t error) {
67*4d7e907cSAndroid Build Coastguard Worker switch(error) {
68*4d7e907cSAndroid Build Coastguard Worker case 0: return RequestStatus::SYS_OK;
69*4d7e907cSAndroid Build Coastguard Worker case -2: return RequestStatus::SYS_ENOENT;
70*4d7e907cSAndroid Build Coastguard Worker case -4: return RequestStatus::SYS_EINTR;
71*4d7e907cSAndroid Build Coastguard Worker case -5: return RequestStatus::SYS_EIO;
72*4d7e907cSAndroid Build Coastguard Worker case -11: return RequestStatus::SYS_EAGAIN;
73*4d7e907cSAndroid Build Coastguard Worker case -12: return RequestStatus::SYS_ENOMEM;
74*4d7e907cSAndroid Build Coastguard Worker case -13: return RequestStatus::SYS_EACCES;
75*4d7e907cSAndroid Build Coastguard Worker case -14: return RequestStatus::SYS_EFAULT;
76*4d7e907cSAndroid Build Coastguard Worker case -16: return RequestStatus::SYS_EBUSY;
77*4d7e907cSAndroid Build Coastguard Worker case -22: return RequestStatus::SYS_EINVAL;
78*4d7e907cSAndroid Build Coastguard Worker case -28: return RequestStatus::SYS_ENOSPC;
79*4d7e907cSAndroid Build Coastguard Worker case -110: return RequestStatus::SYS_ETIMEDOUT;
80*4d7e907cSAndroid Build Coastguard Worker default:
81*4d7e907cSAndroid Build Coastguard Worker ALOGE("An unknown error returned from fingerprint vendor library: %d", error);
82*4d7e907cSAndroid Build Coastguard Worker return RequestStatus::SYS_UNKNOWN;
83*4d7e907cSAndroid Build Coastguard Worker }
84*4d7e907cSAndroid Build Coastguard Worker }
85*4d7e907cSAndroid Build Coastguard Worker
86*4d7e907cSAndroid Build Coastguard Worker // Translate from errors returned by traditional HAL (see fingerprint.h) to
87*4d7e907cSAndroid Build Coastguard Worker // HIDL-compliant FingerprintError.
VendorErrorFilter(int32_t error,int32_t * vendorCode)88*4d7e907cSAndroid Build Coastguard Worker FingerprintError BiometricsFingerprint::VendorErrorFilter(int32_t error,
89*4d7e907cSAndroid Build Coastguard Worker int32_t* vendorCode) {
90*4d7e907cSAndroid Build Coastguard Worker *vendorCode = 0;
91*4d7e907cSAndroid Build Coastguard Worker switch(error) {
92*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ERROR_HW_UNAVAILABLE:
93*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_HW_UNAVAILABLE;
94*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ERROR_UNABLE_TO_PROCESS:
95*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_UNABLE_TO_PROCESS;
96*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ERROR_TIMEOUT:
97*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_TIMEOUT;
98*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ERROR_NO_SPACE:
99*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_NO_SPACE;
100*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ERROR_CANCELED:
101*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_CANCELED;
102*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ERROR_UNABLE_TO_REMOVE:
103*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_UNABLE_TO_REMOVE;
104*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ERROR_LOCKOUT:
105*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_LOCKOUT;
106*4d7e907cSAndroid Build Coastguard Worker default:
107*4d7e907cSAndroid Build Coastguard Worker if (error >= FINGERPRINT_ERROR_VENDOR_BASE) {
108*4d7e907cSAndroid Build Coastguard Worker // vendor specific code.
109*4d7e907cSAndroid Build Coastguard Worker *vendorCode = error - FINGERPRINT_ERROR_VENDOR_BASE;
110*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_VENDOR;
111*4d7e907cSAndroid Build Coastguard Worker }
112*4d7e907cSAndroid Build Coastguard Worker }
113*4d7e907cSAndroid Build Coastguard Worker ALOGE("Unknown error from fingerprint vendor library: %d", error);
114*4d7e907cSAndroid Build Coastguard Worker return FingerprintError::ERROR_UNABLE_TO_PROCESS;
115*4d7e907cSAndroid Build Coastguard Worker }
116*4d7e907cSAndroid Build Coastguard Worker
117*4d7e907cSAndroid Build Coastguard Worker // Translate acquired messages returned by traditional HAL (see fingerprint.h)
118*4d7e907cSAndroid Build Coastguard Worker // to HIDL-compliant FingerprintAcquiredInfo.
VendorAcquiredFilter(int32_t info,int32_t * vendorCode)119*4d7e907cSAndroid Build Coastguard Worker FingerprintAcquiredInfo BiometricsFingerprint::VendorAcquiredFilter(
120*4d7e907cSAndroid Build Coastguard Worker int32_t info, int32_t* vendorCode) {
121*4d7e907cSAndroid Build Coastguard Worker *vendorCode = 0;
122*4d7e907cSAndroid Build Coastguard Worker switch(info) {
123*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ACQUIRED_GOOD:
124*4d7e907cSAndroid Build Coastguard Worker return FingerprintAcquiredInfo::ACQUIRED_GOOD;
125*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ACQUIRED_PARTIAL:
126*4d7e907cSAndroid Build Coastguard Worker return FingerprintAcquiredInfo::ACQUIRED_PARTIAL;
127*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ACQUIRED_INSUFFICIENT:
128*4d7e907cSAndroid Build Coastguard Worker return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT;
129*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ACQUIRED_IMAGER_DIRTY:
130*4d7e907cSAndroid Build Coastguard Worker return FingerprintAcquiredInfo::ACQUIRED_IMAGER_DIRTY;
131*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ACQUIRED_TOO_SLOW:
132*4d7e907cSAndroid Build Coastguard Worker return FingerprintAcquiredInfo::ACQUIRED_TOO_SLOW;
133*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ACQUIRED_TOO_FAST:
134*4d7e907cSAndroid Build Coastguard Worker return FingerprintAcquiredInfo::ACQUIRED_TOO_FAST;
135*4d7e907cSAndroid Build Coastguard Worker default:
136*4d7e907cSAndroid Build Coastguard Worker if (info >= FINGERPRINT_ACQUIRED_VENDOR_BASE) {
137*4d7e907cSAndroid Build Coastguard Worker // vendor specific code.
138*4d7e907cSAndroid Build Coastguard Worker *vendorCode = info - FINGERPRINT_ACQUIRED_VENDOR_BASE;
139*4d7e907cSAndroid Build Coastguard Worker return FingerprintAcquiredInfo::ACQUIRED_VENDOR;
140*4d7e907cSAndroid Build Coastguard Worker }
141*4d7e907cSAndroid Build Coastguard Worker }
142*4d7e907cSAndroid Build Coastguard Worker ALOGE("Unknown acquiredmsg from fingerprint vendor library: %d", info);
143*4d7e907cSAndroid Build Coastguard Worker return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT;
144*4d7e907cSAndroid Build Coastguard Worker }
145*4d7e907cSAndroid Build Coastguard Worker
setNotify(const sp<IBiometricsFingerprintClientCallback> & clientCallback)146*4d7e907cSAndroid Build Coastguard Worker Return<uint64_t> BiometricsFingerprint::setNotify(
147*4d7e907cSAndroid Build Coastguard Worker const sp<IBiometricsFingerprintClientCallback>& clientCallback) {
148*4d7e907cSAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(mClientCallbackMutex);
149*4d7e907cSAndroid Build Coastguard Worker mClientCallback = clientCallback;
150*4d7e907cSAndroid Build Coastguard Worker // This is here because HAL 2.1 doesn't have a way to propagate a
151*4d7e907cSAndroid Build Coastguard Worker // unique token for its driver. Subsequent versions should send a unique
152*4d7e907cSAndroid Build Coastguard Worker // token for each call to setNotify(). This is fine as long as there's only
153*4d7e907cSAndroid Build Coastguard Worker // one fingerprint device on the platform.
154*4d7e907cSAndroid Build Coastguard Worker return reinterpret_cast<uint64_t>(mDevice);
155*4d7e907cSAndroid Build Coastguard Worker }
156*4d7e907cSAndroid Build Coastguard Worker
preEnroll()157*4d7e907cSAndroid Build Coastguard Worker Return<uint64_t> BiometricsFingerprint::preEnroll() {
158*4d7e907cSAndroid Build Coastguard Worker return mDevice->pre_enroll(mDevice);
159*4d7e907cSAndroid Build Coastguard Worker }
160*4d7e907cSAndroid Build Coastguard Worker
enroll(const hidl_array<uint8_t,69> & hat,uint32_t gid,uint32_t timeoutSec)161*4d7e907cSAndroid Build Coastguard Worker Return<RequestStatus> BiometricsFingerprint::enroll(const hidl_array<uint8_t, 69>& hat,
162*4d7e907cSAndroid Build Coastguard Worker uint32_t gid, uint32_t timeoutSec) {
163*4d7e907cSAndroid Build Coastguard Worker const hw_auth_token_t* authToken =
164*4d7e907cSAndroid Build Coastguard Worker reinterpret_cast<const hw_auth_token_t*>(hat.data());
165*4d7e907cSAndroid Build Coastguard Worker return ErrorFilter(mDevice->enroll(mDevice, authToken, gid, timeoutSec));
166*4d7e907cSAndroid Build Coastguard Worker }
167*4d7e907cSAndroid Build Coastguard Worker
postEnroll()168*4d7e907cSAndroid Build Coastguard Worker Return<RequestStatus> BiometricsFingerprint::postEnroll() {
169*4d7e907cSAndroid Build Coastguard Worker return ErrorFilter(mDevice->post_enroll(mDevice));
170*4d7e907cSAndroid Build Coastguard Worker }
171*4d7e907cSAndroid Build Coastguard Worker
getAuthenticatorId()172*4d7e907cSAndroid Build Coastguard Worker Return<uint64_t> BiometricsFingerprint::getAuthenticatorId() {
173*4d7e907cSAndroid Build Coastguard Worker return mDevice->get_authenticator_id(mDevice);
174*4d7e907cSAndroid Build Coastguard Worker }
175*4d7e907cSAndroid Build Coastguard Worker
cancel()176*4d7e907cSAndroid Build Coastguard Worker Return<RequestStatus> BiometricsFingerprint::cancel() {
177*4d7e907cSAndroid Build Coastguard Worker return ErrorFilter(mDevice->cancel(mDevice));
178*4d7e907cSAndroid Build Coastguard Worker }
179*4d7e907cSAndroid Build Coastguard Worker
enumerate()180*4d7e907cSAndroid Build Coastguard Worker Return<RequestStatus> BiometricsFingerprint::enumerate() {
181*4d7e907cSAndroid Build Coastguard Worker return ErrorFilter(mDevice->enumerate(mDevice));
182*4d7e907cSAndroid Build Coastguard Worker }
183*4d7e907cSAndroid Build Coastguard Worker
remove(uint32_t gid,uint32_t fid)184*4d7e907cSAndroid Build Coastguard Worker Return<RequestStatus> BiometricsFingerprint::remove(uint32_t gid, uint32_t fid) {
185*4d7e907cSAndroid Build Coastguard Worker return ErrorFilter(mDevice->remove(mDevice, gid, fid));
186*4d7e907cSAndroid Build Coastguard Worker }
187*4d7e907cSAndroid Build Coastguard Worker
setActiveGroup(uint32_t gid,const hidl_string & storePath)188*4d7e907cSAndroid Build Coastguard Worker Return<RequestStatus> BiometricsFingerprint::setActiveGroup(uint32_t gid,
189*4d7e907cSAndroid Build Coastguard Worker const hidl_string& storePath) {
190*4d7e907cSAndroid Build Coastguard Worker if (storePath.size() >= PATH_MAX || storePath.size() <= 0) {
191*4d7e907cSAndroid Build Coastguard Worker ALOGE("Bad path length: %zd", storePath.size());
192*4d7e907cSAndroid Build Coastguard Worker return RequestStatus::SYS_EINVAL;
193*4d7e907cSAndroid Build Coastguard Worker }
194*4d7e907cSAndroid Build Coastguard Worker if (access(storePath.c_str(), W_OK)) {
195*4d7e907cSAndroid Build Coastguard Worker return RequestStatus::SYS_EINVAL;
196*4d7e907cSAndroid Build Coastguard Worker }
197*4d7e907cSAndroid Build Coastguard Worker
198*4d7e907cSAndroid Build Coastguard Worker return ErrorFilter(mDevice->set_active_group(mDevice, gid,
199*4d7e907cSAndroid Build Coastguard Worker storePath.c_str()));
200*4d7e907cSAndroid Build Coastguard Worker }
201*4d7e907cSAndroid Build Coastguard Worker
authenticate(uint64_t operationId,uint32_t gid)202*4d7e907cSAndroid Build Coastguard Worker Return<RequestStatus> BiometricsFingerprint::authenticate(uint64_t operationId,
203*4d7e907cSAndroid Build Coastguard Worker uint32_t gid) {
204*4d7e907cSAndroid Build Coastguard Worker return ErrorFilter(mDevice->authenticate(mDevice, operationId, gid));
205*4d7e907cSAndroid Build Coastguard Worker }
206*4d7e907cSAndroid Build Coastguard Worker
getInstance()207*4d7e907cSAndroid Build Coastguard Worker IBiometricsFingerprint* BiometricsFingerprint::getInstance() {
208*4d7e907cSAndroid Build Coastguard Worker if (!sInstance) {
209*4d7e907cSAndroid Build Coastguard Worker sInstance = new BiometricsFingerprint();
210*4d7e907cSAndroid Build Coastguard Worker }
211*4d7e907cSAndroid Build Coastguard Worker return sInstance;
212*4d7e907cSAndroid Build Coastguard Worker }
213*4d7e907cSAndroid Build Coastguard Worker
openHal()214*4d7e907cSAndroid Build Coastguard Worker fingerprint_device_t* BiometricsFingerprint::openHal() {
215*4d7e907cSAndroid Build Coastguard Worker int err;
216*4d7e907cSAndroid Build Coastguard Worker const hw_module_t *hw_mdl = nullptr;
217*4d7e907cSAndroid Build Coastguard Worker ALOGD("Opening fingerprint hal library...");
218*4d7e907cSAndroid Build Coastguard Worker if (0 != (err = hw_get_module(FINGERPRINT_HARDWARE_MODULE_ID, &hw_mdl))) {
219*4d7e907cSAndroid Build Coastguard Worker ALOGE("Can't open fingerprint HW Module, error: %d", err);
220*4d7e907cSAndroid Build Coastguard Worker return nullptr;
221*4d7e907cSAndroid Build Coastguard Worker }
222*4d7e907cSAndroid Build Coastguard Worker
223*4d7e907cSAndroid Build Coastguard Worker if (hw_mdl == nullptr) {
224*4d7e907cSAndroid Build Coastguard Worker ALOGE("No valid fingerprint module");
225*4d7e907cSAndroid Build Coastguard Worker return nullptr;
226*4d7e907cSAndroid Build Coastguard Worker }
227*4d7e907cSAndroid Build Coastguard Worker
228*4d7e907cSAndroid Build Coastguard Worker fingerprint_module_t const *module =
229*4d7e907cSAndroid Build Coastguard Worker reinterpret_cast<const fingerprint_module_t*>(hw_mdl);
230*4d7e907cSAndroid Build Coastguard Worker if (module->common.methods->open == nullptr) {
231*4d7e907cSAndroid Build Coastguard Worker ALOGE("No valid open method");
232*4d7e907cSAndroid Build Coastguard Worker return nullptr;
233*4d7e907cSAndroid Build Coastguard Worker }
234*4d7e907cSAndroid Build Coastguard Worker
235*4d7e907cSAndroid Build Coastguard Worker hw_device_t *device = nullptr;
236*4d7e907cSAndroid Build Coastguard Worker
237*4d7e907cSAndroid Build Coastguard Worker if (0 != (err = module->common.methods->open(hw_mdl, nullptr, &device))) {
238*4d7e907cSAndroid Build Coastguard Worker ALOGE("Can't open fingerprint methods, error: %d", err);
239*4d7e907cSAndroid Build Coastguard Worker return nullptr;
240*4d7e907cSAndroid Build Coastguard Worker }
241*4d7e907cSAndroid Build Coastguard Worker
242*4d7e907cSAndroid Build Coastguard Worker if (kVersion != device->version) {
243*4d7e907cSAndroid Build Coastguard Worker // enforce version on new devices because of [email protected] translation layer
244*4d7e907cSAndroid Build Coastguard Worker ALOGE("Wrong fp version. Expected %d, got %d", kVersion, device->version);
245*4d7e907cSAndroid Build Coastguard Worker return nullptr;
246*4d7e907cSAndroid Build Coastguard Worker }
247*4d7e907cSAndroid Build Coastguard Worker
248*4d7e907cSAndroid Build Coastguard Worker fingerprint_device_t* fp_device =
249*4d7e907cSAndroid Build Coastguard Worker reinterpret_cast<fingerprint_device_t*>(device);
250*4d7e907cSAndroid Build Coastguard Worker
251*4d7e907cSAndroid Build Coastguard Worker if (0 != (err =
252*4d7e907cSAndroid Build Coastguard Worker fp_device->set_notify(fp_device, BiometricsFingerprint::notify))) {
253*4d7e907cSAndroid Build Coastguard Worker ALOGE("Can't register fingerprint module callback, error: %d", err);
254*4d7e907cSAndroid Build Coastguard Worker return nullptr;
255*4d7e907cSAndroid Build Coastguard Worker }
256*4d7e907cSAndroid Build Coastguard Worker
257*4d7e907cSAndroid Build Coastguard Worker return fp_device;
258*4d7e907cSAndroid Build Coastguard Worker }
259*4d7e907cSAndroid Build Coastguard Worker
notify(const fingerprint_msg_t * msg)260*4d7e907cSAndroid Build Coastguard Worker void BiometricsFingerprint::notify(const fingerprint_msg_t *msg) {
261*4d7e907cSAndroid Build Coastguard Worker BiometricsFingerprint* thisPtr = static_cast<BiometricsFingerprint*>(
262*4d7e907cSAndroid Build Coastguard Worker BiometricsFingerprint::getInstance());
263*4d7e907cSAndroid Build Coastguard Worker std::lock_guard<std::mutex> lock(thisPtr->mClientCallbackMutex);
264*4d7e907cSAndroid Build Coastguard Worker if (thisPtr == nullptr || thisPtr->mClientCallback == nullptr) {
265*4d7e907cSAndroid Build Coastguard Worker ALOGE("Receiving callbacks before the client callback is registered.");
266*4d7e907cSAndroid Build Coastguard Worker return;
267*4d7e907cSAndroid Build Coastguard Worker }
268*4d7e907cSAndroid Build Coastguard Worker const uint64_t devId = reinterpret_cast<uint64_t>(thisPtr->mDevice);
269*4d7e907cSAndroid Build Coastguard Worker switch (msg->type) {
270*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ERROR: {
271*4d7e907cSAndroid Build Coastguard Worker int32_t vendorCode = 0;
272*4d7e907cSAndroid Build Coastguard Worker FingerprintError result = VendorErrorFilter(msg->data.error, &vendorCode);
273*4d7e907cSAndroid Build Coastguard Worker ALOGD("onError(%d)", result);
274*4d7e907cSAndroid Build Coastguard Worker if (!thisPtr->mClientCallback->onError(devId, result, vendorCode).isOk()) {
275*4d7e907cSAndroid Build Coastguard Worker ALOGE("failed to invoke fingerprint onError callback");
276*4d7e907cSAndroid Build Coastguard Worker }
277*4d7e907cSAndroid Build Coastguard Worker }
278*4d7e907cSAndroid Build Coastguard Worker break;
279*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_ACQUIRED: {
280*4d7e907cSAndroid Build Coastguard Worker int32_t vendorCode = 0;
281*4d7e907cSAndroid Build Coastguard Worker FingerprintAcquiredInfo result =
282*4d7e907cSAndroid Build Coastguard Worker VendorAcquiredFilter(msg->data.acquired.acquired_info, &vendorCode);
283*4d7e907cSAndroid Build Coastguard Worker ALOGD("onAcquired(%d)", result);
284*4d7e907cSAndroid Build Coastguard Worker if (!thisPtr->mClientCallback->onAcquired(devId, result, vendorCode).isOk()) {
285*4d7e907cSAndroid Build Coastguard Worker ALOGE("failed to invoke fingerprint onAcquired callback");
286*4d7e907cSAndroid Build Coastguard Worker }
287*4d7e907cSAndroid Build Coastguard Worker }
288*4d7e907cSAndroid Build Coastguard Worker break;
289*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_TEMPLATE_ENROLLING:
290*4d7e907cSAndroid Build Coastguard Worker ALOGD("onEnrollResult(fid=%d, gid=%d, rem=%d)",
291*4d7e907cSAndroid Build Coastguard Worker msg->data.enroll.finger.fid,
292*4d7e907cSAndroid Build Coastguard Worker msg->data.enroll.finger.gid,
293*4d7e907cSAndroid Build Coastguard Worker msg->data.enroll.samples_remaining);
294*4d7e907cSAndroid Build Coastguard Worker if (!thisPtr->mClientCallback->onEnrollResult(devId,
295*4d7e907cSAndroid Build Coastguard Worker msg->data.enroll.finger.fid,
296*4d7e907cSAndroid Build Coastguard Worker msg->data.enroll.finger.gid,
297*4d7e907cSAndroid Build Coastguard Worker msg->data.enroll.samples_remaining).isOk()) {
298*4d7e907cSAndroid Build Coastguard Worker ALOGE("failed to invoke fingerprint onEnrollResult callback");
299*4d7e907cSAndroid Build Coastguard Worker }
300*4d7e907cSAndroid Build Coastguard Worker break;
301*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_TEMPLATE_REMOVED:
302*4d7e907cSAndroid Build Coastguard Worker ALOGD("onRemove(fid=%d, gid=%d, rem=%d)",
303*4d7e907cSAndroid Build Coastguard Worker msg->data.removed.finger.fid,
304*4d7e907cSAndroid Build Coastguard Worker msg->data.removed.finger.gid,
305*4d7e907cSAndroid Build Coastguard Worker msg->data.removed.remaining_templates);
306*4d7e907cSAndroid Build Coastguard Worker if (!thisPtr->mClientCallback->onRemoved(devId,
307*4d7e907cSAndroid Build Coastguard Worker msg->data.removed.finger.fid,
308*4d7e907cSAndroid Build Coastguard Worker msg->data.removed.finger.gid,
309*4d7e907cSAndroid Build Coastguard Worker msg->data.removed.remaining_templates).isOk()) {
310*4d7e907cSAndroid Build Coastguard Worker ALOGE("failed to invoke fingerprint onRemoved callback");
311*4d7e907cSAndroid Build Coastguard Worker }
312*4d7e907cSAndroid Build Coastguard Worker break;
313*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_AUTHENTICATED:
314*4d7e907cSAndroid Build Coastguard Worker if (msg->data.authenticated.finger.fid != 0) {
315*4d7e907cSAndroid Build Coastguard Worker ALOGD("onAuthenticated(fid=%d, gid=%d)",
316*4d7e907cSAndroid Build Coastguard Worker msg->data.authenticated.finger.fid,
317*4d7e907cSAndroid Build Coastguard Worker msg->data.authenticated.finger.gid);
318*4d7e907cSAndroid Build Coastguard Worker const uint8_t* hat =
319*4d7e907cSAndroid Build Coastguard Worker reinterpret_cast<const uint8_t *>(&msg->data.authenticated.hat);
320*4d7e907cSAndroid Build Coastguard Worker const hidl_vec<uint8_t> token(
321*4d7e907cSAndroid Build Coastguard Worker std::vector<uint8_t>(hat, hat + sizeof(msg->data.authenticated.hat)));
322*4d7e907cSAndroid Build Coastguard Worker if (!thisPtr->mClientCallback->onAuthenticated(devId,
323*4d7e907cSAndroid Build Coastguard Worker msg->data.authenticated.finger.fid,
324*4d7e907cSAndroid Build Coastguard Worker msg->data.authenticated.finger.gid,
325*4d7e907cSAndroid Build Coastguard Worker token).isOk()) {
326*4d7e907cSAndroid Build Coastguard Worker ALOGE("failed to invoke fingerprint onAuthenticated callback");
327*4d7e907cSAndroid Build Coastguard Worker }
328*4d7e907cSAndroid Build Coastguard Worker } else {
329*4d7e907cSAndroid Build Coastguard Worker // Not a recognized fingerprint
330*4d7e907cSAndroid Build Coastguard Worker if (!thisPtr->mClientCallback->onAuthenticated(devId,
331*4d7e907cSAndroid Build Coastguard Worker msg->data.authenticated.finger.fid,
332*4d7e907cSAndroid Build Coastguard Worker msg->data.authenticated.finger.gid,
333*4d7e907cSAndroid Build Coastguard Worker hidl_vec<uint8_t>()).isOk()) {
334*4d7e907cSAndroid Build Coastguard Worker ALOGE("failed to invoke fingerprint onAuthenticated callback");
335*4d7e907cSAndroid Build Coastguard Worker }
336*4d7e907cSAndroid Build Coastguard Worker }
337*4d7e907cSAndroid Build Coastguard Worker break;
338*4d7e907cSAndroid Build Coastguard Worker case FINGERPRINT_TEMPLATE_ENUMERATING:
339*4d7e907cSAndroid Build Coastguard Worker ALOGD("onEnumerate(fid=%d, gid=%d, rem=%d)",
340*4d7e907cSAndroid Build Coastguard Worker msg->data.enumerated.finger.fid,
341*4d7e907cSAndroid Build Coastguard Worker msg->data.enumerated.finger.gid,
342*4d7e907cSAndroid Build Coastguard Worker msg->data.enumerated.remaining_templates);
343*4d7e907cSAndroid Build Coastguard Worker if (!thisPtr->mClientCallback->onEnumerate(devId,
344*4d7e907cSAndroid Build Coastguard Worker msg->data.enumerated.finger.fid,
345*4d7e907cSAndroid Build Coastguard Worker msg->data.enumerated.finger.gid,
346*4d7e907cSAndroid Build Coastguard Worker msg->data.enumerated.remaining_templates).isOk()) {
347*4d7e907cSAndroid Build Coastguard Worker ALOGE("failed to invoke fingerprint onEnumerate callback");
348*4d7e907cSAndroid Build Coastguard Worker }
349*4d7e907cSAndroid Build Coastguard Worker break;
350*4d7e907cSAndroid Build Coastguard Worker }
351*4d7e907cSAndroid Build Coastguard Worker }
352*4d7e907cSAndroid Build Coastguard Worker
353*4d7e907cSAndroid Build Coastguard Worker } // namespace implementation
354*4d7e907cSAndroid Build Coastguard Worker } // namespace V2_1
355*4d7e907cSAndroid Build Coastguard Worker } // namespace fingerprint
356*4d7e907cSAndroid Build Coastguard Worker } // namespace biometrics
357*4d7e907cSAndroid Build Coastguard Worker } // namespace hardware
358*4d7e907cSAndroid Build Coastguard Worker } // namespace android
359