From 9976b3f15bb8ebcdcd13efa789d41bc35eb0ccc2 Mon Sep 17 00:00:00 2001 From: Arian Date: Thu, 5 May 2022 23:30:30 +0200 Subject: [PATCH] hidl: biometrics: fingerprint: Add support for device specific UDFPS libs Change-Id: I8f29d58b178aa8ff420204f790c6952fdf4ade58 --- hidl/biometrics/fingerprint/Android.bp | 2 ++ .../fingerprint/BiometricsFingerprint.cpp | 33 +++++++++++++++-- .../fingerprint/BiometricsFingerprint.h | 3 ++ hidl/biometrics/fingerprint/UdfpsHandler.cpp | 35 +++++++++++++++++++ .../fingerprint/include/UdfpsHandler.h | 26 ++++++++++++++ 5 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 hidl/biometrics/fingerprint/UdfpsHandler.cpp create mode 100644 hidl/biometrics/fingerprint/include/UdfpsHandler.h diff --git a/hidl/biometrics/fingerprint/Android.bp b/hidl/biometrics/fingerprint/Android.bp index e8ebc02..2cae698 100644 --- a/hidl/biometrics/fingerprint/Android.bp +++ b/hidl/biometrics/fingerprint/Android.bp @@ -14,12 +14,14 @@ cc_binary { relative_install_path: "hw", srcs: [ "BiometricsFingerprint.cpp", + "UdfpsHandler.cpp", "service.cpp", ], shared_libs: [ "libbase", "libcutils", + "libdl", "liblog", "libhidlbase", "libhardware", diff --git a/hidl/biometrics/fingerprint/BiometricsFingerprint.cpp b/hidl/biometrics/fingerprint/BiometricsFingerprint.cpp index 16ba5aa..1f07d75 100644 --- a/hidl/biometrics/fingerprint/BiometricsFingerprint.cpp +++ b/hidl/biometrics/fingerprint/BiometricsFingerprint.cpp @@ -12,6 +12,7 @@ #include #include #include "BiometricsFingerprint.h" +#include "UdfpsHandler.h" #include #include @@ -48,7 +49,11 @@ 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 for (auto& [class_name, is_udfps] : kModules) { mDevice = openHal(class_name); @@ -69,11 +74,26 @@ BiometricsFingerprint::BiometricsFingerprint() : mClientCallback(nullptr), mDevi if (mIsUdfps) { SetProperty("ro.hardware.fp.udfps", "true"); + + 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; @@ -245,12 +265,19 @@ Return BiometricsFingerprint::isUdfps(uint32_t /*sensorId*/) { return mIsUdfps; } -Return BiometricsFingerprint::onFingerDown(uint32_t /*x*/, uint32_t /*y*/, float /*minor*/, - float /*major*/) { +Return BiometricsFingerprint::onFingerDown(uint32_t x, uint32_t y, float minor, float major) { + if (mUdfpsHandler) { + mUdfpsHandler->onFingerDown(x, y, minor, major); + } + return Void(); } Return BiometricsFingerprint::onFingerUp() { + if (mUdfpsHandler) { + mUdfpsHandler->onFingerUp(); + } + return Void(); } diff --git a/hidl/biometrics/fingerprint/BiometricsFingerprint.h b/hidl/biometrics/fingerprint/BiometricsFingerprint.h index b48aeaa..bd822f0 100644 --- a/hidl/biometrics/fingerprint/BiometricsFingerprint.h +++ b/hidl/biometrics/fingerprint/BiometricsFingerprint.h @@ -13,6 +13,7 @@ #include #include #include +#include "UdfpsHandler.h" #include "fingerprint.h" namespace android { @@ -75,6 +76,8 @@ struct BiometricsFingerprint : public IBiometricsFingerprint { sp mClientCallback; fingerprint_device_t* mDevice; bool mIsUdfps; + UdfpsHandlerFactory* mUdfpsHandlerFactory; + UdfpsHandler* mUdfpsHandler; }; } // namespace implementation diff --git a/hidl/biometrics/fingerprint/UdfpsHandler.cpp b/hidl/biometrics/fingerprint/UdfpsHandler.cpp new file mode 100644 index 0000000..02c3c34 --- /dev/null +++ b/hidl/biometrics/fingerprint/UdfpsHandler.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "UdfpsHandler.h" +#include + +#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; +} diff --git a/hidl/biometrics/fingerprint/include/UdfpsHandler.h b/hidl/biometrics/fingerprint/include/UdfpsHandler.h new file mode 100644 index 0000000..c566747 --- /dev/null +++ b/hidl/biometrics/fingerprint/include/UdfpsHandler.h @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2022 The LineageOS Project + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include +#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();