Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4facadf8 authored by Jeff Pu's avatar Jeff Pu
Browse files

Support multiple displays in fingerprint VHAL

Bug: 348076336
Test: atest android.hardware.biometrics.fingerprint.* -c
Test: atest BiometricsE2eTests:BiometricPromptAuthSuccessTest
Change-Id: Ia0e26e41b951cf00d8d098983a05f3916b12af5c
parent c96df1bc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -311,7 +311,7 @@ interface IVirtualHal {
    void setSensorStrength(in SensorStrength strength);
    void setMaxEnrollmentPerUser(in int max);
    void setSensorLocation(in SensorLocation loc);
    void setNavigationGuesture(in boolean v);
    void setNavigationGesture(in boolean v);
    void setDetectInteraction(in boolean v);
    void setDisplayTouch(in boolean v);
    void setControlIllumination(in boolean v);
+45 −26
Original line number Diff line number Diff line
@@ -414,13 +414,22 @@ ndk::ScopedAStatus FakeFingerprintEngine::onUiReadyImpl() {
    return ndk::ScopedAStatus::ok();
}

bool FakeFingerprintEngine::getSensorLocationConfig(SensorLocation& out) {
    auto loc = Fingerprint::cfg().get<std::string>("sensor_location");
bool FakeFingerprintEngine::getSensorLocationConfig(std::vector<SensorLocation>& out) {
    auto locStr = Fingerprint::cfg().get<std::string>("sensor_location");
    auto isValidStr = false;

    // sensor_location format: x:y:r:d,x:y:r:d,...
    //   x: x location in pixel, y: y location in pixel, r: radus in pixel, d:display in string
    auto locations = Util::split(locStr, ",");
    for (int i = 0; i < locations.size(); i++) {
        auto loc = locations[i];

        // expect loc in the format: x:y:r  or x:y:d:r
        auto dim = Util::split(loc, ":");

    if (dim.size() < 3 or dim.size() > 4) {
        if (dim.size() < 3) {
            if (!loc.empty()) LOG(WARNING) << "Invalid sensor location input (x:y:radius):" + loc;
            out.clear();
            return false;
        } else {
            int32_t x, y, r;
@@ -429,26 +438,36 @@ bool FakeFingerprintEngine::getSensorLocationConfig(SensorLocation& out) {
                isValidStr = ParseInt(dim[0], &x) && ParseInt(dim[1], &y) && ParseInt(dim[2], &r);
            }
            if (dim.size() >= 4) {
            d = dim[3];
                for (int i = 3; i < dim.size(); i++) {
                    if (i > 3) d += ':';
                    d += dim[i];
                }
            }
            if (isValidStr) {
                out.push_back(SensorLocation{.sensorLocationX = x,
                                             .sensorLocationY = y,
                                             .sensorRadius = r,
                                             .display = d});
            }
        if (isValidStr)
            out = {.sensorLocationX = x, .sensorLocationY = y, .sensorRadius = r, .display = d};

        return isValidStr;
        }
    }
SensorLocation FakeFingerprintEngine::getSensorLocation() {
    SensorLocation location;

    if (getSensorLocationConfig(location)) {
        return location;
    LOG(INFO) << "getSensorLocationConfig: isValidStr=" << isValidStr << " locStr=" << locStr;
    if (isValidStr) {
        for (auto loc : out) {
            LOG(INFO) << loc.toString();
        }
    } else {
        return defaultSensorLocation();
        out.clear();
    }

    return isValidStr;
}

SensorLocation FakeFingerprintEngine::defaultSensorLocation() {
    return SensorLocation();
void FakeFingerprintEngine::getSensorLocation(std::vector<SensorLocation>& location) {
    if (!getSensorLocationConfig(location)) {
        getDefaultSensorLocation(location);
    }
}

std::pair<AcquiredInfo, int32_t> FakeFingerprintEngine::convertAcquiredInfo(int32_t code) {
+9 −4
Original line number Diff line number Diff line
@@ -26,12 +26,17 @@
using namespace ::android::fingerprint::virt;

namespace aidl::android::hardware::biometrics::fingerprint {
SensorLocation FakeFingerprintEngineSide::defaultLocation[] = {
        // default to CF display
        {.sensorLocationX = 0, 200, 90, "local:4619827353912518656"}};

FakeFingerprintEngineSide::FakeFingerprintEngineSide() : FakeFingerprintEngine() {}

SensorLocation FakeFingerprintEngineSide::defaultSensorLocation() {
    return SensorLocation{.sensorLocationX = defaultSensorLocationX,
                          .sensorLocationY = defaultSensorLocationY,
                          .sensorRadius = defaultSensorRadius};
void FakeFingerprintEngineSide::getDefaultSensorLocation(
        std::vector<SensorLocation>& sensorLocation) {
    for (int i = 0; i < (sizeof(defaultLocation) / sizeof(defaultLocation[0])); i++) {
        sensorLocation.push_back(defaultLocation[i]);
    }
}

}  // namespace aidl::android::hardware::biometrics::fingerprint
+8 −4
Original line number Diff line number Diff line
@@ -34,10 +34,14 @@ namespace aidl::android::hardware::biometrics::fingerprint {
FakeFingerprintEngineUdfps::FakeFingerprintEngineUdfps()
    : FakeFingerprintEngine(), mPointerDownTime(0), mUiReadyTime(0) {}

SensorLocation FakeFingerprintEngineUdfps::defaultSensorLocation() {
    return SensorLocation{.sensorLocationX = defaultSensorLocationX,
void FakeFingerprintEngineUdfps::getDefaultSensorLocation(
        std::vector<SensorLocation>& sensorLocation) {
    sensorLocation.clear();
    sensorLocation.push_back(SensorLocation{
            .sensorLocationX = defaultSensorLocationX,
            .sensorLocationY = defaultSensorLocationY,
                          .sensorRadius = defaultSensorRadius};
            .sensorRadius = defaultSensorRadius,
    });
}

ndk::ScopedAStatus FakeFingerprintEngineUdfps::onPointerDownImpl(int32_t /*pointerId*/,
+10 −14
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ ndk::ScopedAStatus Fingerprint::getSensorProps(std::vector<SensorProps>* out) {
    auto sensorId = Fingerprint::cfg().get<std::int32_t>("sensor_id");
    auto sensorStrength = Fingerprint::cfg().get<std::int32_t>("sensor_strength");
    auto maxEnrollments = Fingerprint::cfg().get<std::int32_t>("max_enrollments");
    auto navigationGuesture = Fingerprint::cfg().get<bool>("navigation_guesture");
    auto navigationGesture = Fingerprint::cfg().get<bool>("navigation_gesture");
    auto detectInteraction = Fingerprint::cfg().get<bool>("detect_interaction");
    auto displayTouch = Fingerprint::cfg().get<bool>("display_touch");
    auto controlIllumination = Fingerprint::cfg().get<bool>("control_illumination");
@@ -82,19 +82,15 @@ ndk::ScopedAStatus Fingerprint::getSensorProps(std::vector<SensorProps>* out) {
    common::CommonProps commonProps = {sensorId, (common::SensorStrength)sensorStrength,
                                       maxEnrollments, componentInfo};

    SensorLocation sensorLocation = mEngine->getSensorLocation();

    LOG(INFO) << "sensor type:" << ::android::internal::ToString(mSensorType)
              << " location:" << sensorLocation.toString();
    std::vector<SensorLocation> sensorLocation;
    mEngine->getSensorLocation(sensorLocation);
    LOG(INFO) << "sensor type:" << ::android::internal::ToString(mSensorType);
    for (auto location : sensorLocation) {
        LOG(INFO) << "sensor location:  " << location.toString();
    }

    *out = {{commonProps,
             mSensorType,
             {sensorLocation},
             navigationGuesture,
             detectInteraction,
             displayTouch,
             controlIllumination,
             std::nullopt}};
    *out = {{commonProps, mSensorType, sensorLocation, navigationGesture, detectInteraction,
             displayTouch, controlIllumination, std::nullopt}};
    return ndk::ScopedAStatus::ok();
}

@@ -204,7 +200,7 @@ void Fingerprint::clearConfigSysprop() {
    RESET_CONFIG_O(sensor_id);
    RESET_CONFIG_O(sensor_strength);
    RESET_CONFIG_O(max_enrollments);
    RESET_CONFIG_O(navigation_guesture);
    RESET_CONFIG_O(navigation_gesture);
    RESET_CONFIG_O(detect_interaction);
    RESET_CONFIG_O(display_touch);
    RESET_CONFIG_O(control_illumination);
Loading