diff --git a/hidl/fingerprint/Android.bp b/hidl/fingerprint/Android.bp index 7282393..10cfed2 100644 --- a/hidl/fingerprint/Android.bp +++ b/hidl/fingerprint/Android.bp @@ -18,4 +18,5 @@ cc_binary { "android.hardware.biometrics.fingerprint@2.3", "vendor.oplus.hardware.biometrics.fingerprint@2.1", ], + local_include_dirs: ["include"], } diff --git a/hidl/fingerprint/BiometricsFingerprint.cpp b/hidl/fingerprint/BiometricsFingerprint.cpp index b82fe2d..de0632d 100644 --- a/hidl/fingerprint/BiometricsFingerprint.cpp +++ b/hidl/fingerprint/BiometricsFingerprint.cpp @@ -25,7 +25,8 @@ namespace fingerprint { namespace V2_3 { namespace implementation { -BiometricsFingerprint::BiometricsFingerprint() { +BiometricsFingerprint::BiometricsFingerprint() + : mOplusDisplayFd(open("/dev/oplus_display", O_RDWR)) { mOplusBiometricsFingerprint = IOplusBiometricsFingerprint::getService(); mOplusBiometricsFingerprint->setHalCallback(this); } @@ -37,6 +38,7 @@ Return BiometricsFingerprint::setNotify( } Return BiometricsFingerprint::preEnroll() { + setDimlayerHbm(1); return mOplusBiometricsFingerprint->preEnroll(); } @@ -46,6 +48,7 @@ Return BiometricsFingerprint::enroll(const hidl_array BiometricsFingerprint::postEnroll() { + setDimlayerHbm(0); return mOplusBiometricsFingerprint->postEnroll(); } @@ -54,6 +57,7 @@ Return BiometricsFingerprint::getAuthenticatorId() { } Return BiometricsFingerprint::cancel() { + setDimlayerHbm(0); return mOplusBiometricsFingerprint->cancel(); } @@ -71,6 +75,7 @@ Return BiometricsFingerprint::setActiveGroup(uint32_t gid, } Return BiometricsFingerprint::authenticate(uint64_t operationId, uint32_t gid) { + setDimlayerHbm(1); return mOplusBiometricsFingerprint->authenticate(operationId, gid); } @@ -79,10 +84,12 @@ Return BiometricsFingerprint::isUdfps(uint32_t sensorID) { } Return BiometricsFingerprint::onFingerDown(uint32_t x, uint32_t y, float minor, float major) { + setFpPress(1); return mOplusBiometricsFingerprint->onFingerDown(x, y, minor, major); } Return BiometricsFingerprint::onFingerUp() { + setFpPress(0); return mOplusBiometricsFingerprint->onFingerUp(); } @@ -100,6 +107,10 @@ Return BiometricsFingerprint::onAcquired(uint64_t deviceId, Return BiometricsFingerprint::onAuthenticated(uint64_t deviceId, uint32_t fingerId, uint32_t groupId, const hidl_vec& token) { + if (fingerId != 0) { + setDimlayerHbm(0); + } + setFpPress(0); return mClientCallback->onAuthenticated(deviceId, fingerId, groupId, token); } diff --git a/hidl/fingerprint/BiometricsFingerprint.h b/hidl/fingerprint/BiometricsFingerprint.h index 6b167a5..fb9a8f3 100644 --- a/hidl/fingerprint/BiometricsFingerprint.h +++ b/hidl/fingerprint/BiometricsFingerprint.h @@ -16,6 +16,7 @@ #pragma once +#include #include #include #include @@ -24,6 +25,7 @@ #include #include +#include #include namespace android { @@ -34,6 +36,7 @@ namespace V2_3 { namespace implementation { using ::android::sp; +using ::android::base::GetProperty; using ::android::hardware::hidl_string; using ::android::hardware::Return; using ::android::hardware::Void; @@ -105,8 +108,24 @@ class BiometricsFingerprint : public IBiometricsFingerprint, uint32_t resultLen) override; private: + bool isUdfps() { + // We need to rely on `persist.vendor.fingerprint.sensor_type` here because we can't get our + // sensorId from anywhere. + return GetProperty("persist.vendor.fingerprint.sensor_type", "") == "optical"; + } + + bool setDimlayerHbm(unsigned int value) { + return isUdfps() && ioctl(mOplusDisplayFd, PANEL_IOCTL_SET_DIMLAYER_HBM, &value); + } + + bool setFpPress(unsigned int value) { + return isUdfps() && ioctl(mOplusDisplayFd, PANEL_IOCTL_SET_FP_PRESS, &value); + } + sp mOplusBiometricsFingerprint; sp mClientCallback; + + int mOplusDisplayFd; }; } // namespace implementation diff --git a/hidl/fingerprint/include/oplus/oplus_display_panel.h b/hidl/fingerprint/include/oplus/oplus_display_panel.h new file mode 100644 index 0000000..7e3b204 --- /dev/null +++ b/hidl/fingerprint/include/oplus/oplus_display_panel.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2022 The LineageOS Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include + +#define OPLUS_PANEL_IOCTL_BASE 'o' + +#define PANEL_IOCTL_SET_DIMLAYER_HBM _IOW(OPLUS_PANEL_IOCTL_BASE, 0x1F, unsigned int) +#define PANEL_IOCTL_SET_FP_PRESS _IOW(OPLUS_PANEL_IOCTL_BASE, 0x29, unsigned int)