diff --git a/fingerprint/Android.bp b/fingerprint/Android.bp index f98b105..8aff97d 100644 --- a/fingerprint/Android.bp +++ b/fingerprint/Android.bp @@ -17,6 +17,7 @@ cc_binary { "android.hardware.biometrics.fingerprint@2.1", "android.hardware.biometrics.fingerprint@2.2", "android.hardware.biometrics.fingerprint@2.3", + "com.motorola.hardware.biometric.fingerprint@1.0", ], } diff --git a/fingerprint/BiometricsFingerprint.cpp b/fingerprint/BiometricsFingerprint.cpp index f80c3ff..01b5b01 100644 --- a/fingerprint/BiometricsFingerprint.cpp +++ b/fingerprint/BiometricsFingerprint.cpp @@ -26,6 +26,11 @@ #include #include +#define NOTIFY_FINGER_UP IMotFodEventType::FINGER_UP +#define NOTIFY_FINGER_DOWN IMotFodEventType::FINGER_DOWN + +#define FOD_UI_PATH "/sys/devices/platform/soc/soc:qcom,dsi-display-primary/fod_ui" + namespace android { namespace hardware { namespace biometrics { @@ -33,8 +38,52 @@ namespace fingerprint { namespace V2_3 { namespace implementation { +static bool readBool(int fd) { + char c; + int rc; + + rc = lseek(fd, 0, SEEK_SET); + if (rc) { + LOG(ERROR) << "failed to seek fd, err: " << rc; + return false; + } + + rc = read(fd, &c, sizeof(char)); + if (rc != 1) { + LOG(ERROR) << "failed to read bool from fd, err: " << rc; + return false; + } + + return c != '0'; +} + BiometricsFingerprint::BiometricsFingerprint() { biometrics_2_1_service = IBiometricsFingerprint_2_1::getService(); + mMotoFingerprint = IMotoFingerPrint::getService(); + + std::thread([this]() { + int fd = open(FOD_UI_PATH, O_RDONLY); + if (fd < 0) { + LOG(ERROR) << "failed to open fd, err: " << fd; + return; + } + + struct pollfd fodUiPoll = { + .fd = fd, + .events = POLLERR | POLLPRI, + .revents = 0, + }; + + while (true) { + int rc = poll(&fodUiPoll, 1, -1); + if (rc < 0) { + LOG(ERROR) << "failed to poll fd, err: " << rc; + continue; + } + mMotoFingerprint->sendFodEvent(readBool(fd) ? NOTIFY_FINGER_DOWN : NOTIFY_FINGER_UP , {}, + [](IMotFodEventResult, const hidl_vec&) {}); + } + }).detach(); } Return BiometricsFingerprint::setNotify(const sp& clientCallback) { diff --git a/fingerprint/BiometricsFingerprint.h b/fingerprint/BiometricsFingerprint.h index d44bf48..aed29e0 100644 --- a/fingerprint/BiometricsFingerprint.h +++ b/fingerprint/BiometricsFingerprint.h @@ -20,6 +20,7 @@ #include #include #include +#include namespace android { namespace hardware { @@ -38,6 +39,9 @@ using ::android::hardware::hidl_vec; using ::android::hardware::Return; using ::android::hardware::Void; using ::android::sp; +using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotoFingerPrint; +using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotFodEventType; +using ::com::motorola::hardware::biometric::fingerprint::V1_0::IMotFodEventResult; struct BiometricsFingerprint : public IBiometricsFingerprint { BiometricsFingerprint(); @@ -60,6 +64,7 @@ struct BiometricsFingerprint : public IBiometricsFingerprint { private: sp biometrics_2_1_service; + sp mMotoFingerprint; }; } // namespace implementation