hidl: biometrics: fingerprint: Add support for device specific UDFPS libs

Change-Id: I8f29d58b178aa8ff420204f790c6952fdf4ade58
This commit is contained in:
Arian
2022-05-05 23:30:30 +02:00
committed by x0x00044
parent 64490bd5f9
commit d5b84901b2
5 changed files with 97 additions and 4 deletions

View File

@@ -14,11 +14,13 @@ cc_binary {
relative_install_path: "hw",
srcs: [
"BiometricsFingerprint.cpp",
"UdfpsHandler.cpp",
"service.cpp",
],
shared_libs: [
"libcutils",
"libdl",
"liblog",
"libhidlbase",
"libhardware",

View File

@@ -12,6 +12,7 @@
#include <android-base/strings.h>
#include <hardware/hardware.h>
#include "BiometricsFingerprint.h"
#include "UdfpsHandler.h"
#include <inttypes.h>
#include <unistd.h>
@@ -32,16 +33,35 @@ using ::android::base::StartsWith;
BiometricsFingerprint* BiometricsFingerprint::sInstance = nullptr;
BiometricsFingerprint::BiometricsFingerprint() : mClientCallback(nullptr), mDevice(nullptr) {
BiometricsFingerprint::BiometricsFingerprint()
: mClientCallback(nullptr),
mDevice(nullptr),
mUdfpsHandlerFactory(nullptr),
mUdfpsHandler(nullptr) {
sInstance = this; // keep track of the most recent instance
mDevice = openHal();
if (!mDevice) {
ALOGE("Can't open HAL module");
}
mUdfpsHandlerFactory = getUdfpsHandlerFactory();
if (!mUdfpsHandlerFactory) {
ALOGE("Can't get UdfpsHandlerFactory");
} else {
mUdfpsHandler = mUdfpsHandlerFactory->create();
if (!mUdfpsHandler) {
ALOGE("Can't create UdfpsHandler");
} else {
mUdfpsHandler->init(mDevice);
}
}
}
BiometricsFingerprint::~BiometricsFingerprint() {
ALOGV("~BiometricsFingerprint()");
if (mUdfpsHandler) {
mUdfpsHandlerFactory->destroy(mUdfpsHandler);
}
if (mDevice == nullptr) {
ALOGE("No valid device");
return;
@@ -210,15 +230,22 @@ Return<RequestStatus> BiometricsFingerprint::authenticate(uint64_t operationId,
}
Return<bool> BiometricsFingerprint::isUdfps(uint32_t /*sensorId*/) {
return false;
return true;
}
Return<void> BiometricsFingerprint::onFingerDown(uint32_t /*x*/, uint32_t /*y*/, float /*minor*/,
float /*major*/) {
Return<void> BiometricsFingerprint::onFingerDown(uint32_t x, uint32_t y, float minor, float major) {
if (mUdfpsHandler) {
mUdfpsHandler->onFingerDown(x, y, minor, major);
}
return Void();
}
Return<void> BiometricsFingerprint::onFingerUp() {
if (mUdfpsHandler) {
mUdfpsHandler->onFingerUp();
}
return Void();
}

View File

@@ -13,6 +13,7 @@
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <log/log.h>
#include "UdfpsHandler.h"
#include "fingerprint.h"
namespace android {
@@ -74,6 +75,8 @@ struct BiometricsFingerprint : public IBiometricsFingerprint {
std::mutex mClientCallbackMutex;
sp<IBiometricsFingerprintClientCallback> mClientCallback;
fingerprint_device_t* mDevice;
UdfpsHandlerFactory* mUdfpsHandlerFactory;
UdfpsHandler* mUdfpsHandler;
};
} // namespace implementation

View File

@@ -0,0 +1,35 @@
/*
* Copyright (C) 2022 The LineageOS Project
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "UdfpsHandler.h"
#include <dlfcn.h>
#define UDFPS_HANDLER_LIB_NAME "libudfpshandler.so"
#define UDFPS_HANDLER_FACTORY "UDFPS_HANDLER_FACTORY"
UdfpsHandlerFactory* getUdfpsHandlerFactory() {
void* libudfpshander;
UdfpsHandlerFactory* factory_handler;
libudfpshander = dlopen(UDFPS_HANDLER_LIB_NAME, RTLD_LAZY);
if (!libudfpshander) {
goto error;
}
factory_handler = (UdfpsHandlerFactory*)dlsym(libudfpshander, UDFPS_HANDLER_FACTORY);
if (!factory_handler) {
goto error;
}
return factory_handler;
error:
if (libudfpshander) {
dlclose(libudfpshander);
}
return nullptr;
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) 2022 The LineageOS Project
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include <stdint.h>
#include "fingerprint.h"
class UdfpsHandler {
public:
virtual ~UdfpsHandler() = default;
virtual void init(fingerprint_device_t *device) = 0;
virtual void onFingerDown(uint32_t x, uint32_t y, float minor, float major) = 0;
virtual void onFingerUp() = 0;
};
struct UdfpsHandlerFactory {
UdfpsHandler* (*create)();
void (*destroy)(UdfpsHandler* handler);
};
UdfpsHandlerFactory *getUdfpsHandlerFactory();