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

Commit df81c964 authored by Jeff Pu's avatar Jeff Pu
Browse files

Added Fingerprint Virtual HAL AIDL extension

Bug: 326227403
Test: atest android.hardware.biometrics.fingerprint.* -c
Change-Id: I967c009c99f8dc279f89c21a59cf0462d9590296
parent 6904bf18
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ ConfigValue Config::parseBool(const std::string& value) {
    else if (value == "false")
        res.emplace(false);
    else
        LOG(ERROR) << "ERROR: invalid bool " << value;
        LOG(FATAL) << "ERROR: invalid bool " << value;
    return res;
}

@@ -48,7 +48,11 @@ ConfigValue Config::parseInt32(const std::string& value) {
    OptInt32 res;
    if (!value.empty()) {
        std::int32_t val;
        if (ParseInt(value, &val)) res.emplace(val);
        if (ParseInt(value, &val)) {
            res.emplace(val);
        } else {
            LOG(FATAL) << "ERROR: Could not parse " << value << " as Int32";
        }
    }
    return res;
}
@@ -59,6 +63,8 @@ ConfigValue Config::parseInt64(const std::string& value) {
        std::int64_t val = std::strtoull(value.c_str(), nullptr, 10);
        if (val != 0LL or (val == 0LL && value == "0")) {
            res.emplace(val);
        } else {
            LOG(FATAL) << "ERROR: Could not parse " << value << " as Int64";
        }
    }
    return res;
@@ -87,7 +93,7 @@ void Config::init() {
bool Config::setParam(const std::string& name, const std::string& value) {
    auto it = mMap.find(name);
    if (it == mMap.end()) {
        LOG(ERROR) << "ERROR: setParam unknown config name " << name;
        LOG(FATAL) << "ERROR: setParam unknown config name " << name;
        return false;
    }
    LOG(INFO) << "setParam name=" << name << "=" << value;
@@ -102,7 +108,7 @@ bool Config::setParam(const std::string& name, const std::string& value) {
ConfigValue Config::getInternal(const std::string& name) {
    ConfigValue res;

    auto data = mMap[name];
    auto& data = mMap[name];
    switch (mSource) {
        case ConfigSourceType::SOURCE_SYSPROP:
            res = data.getter();
@@ -111,10 +117,10 @@ ConfigValue Config::getInternal(const std::string& name) {
            res = data.value;
            break;
        case ConfigSourceType::SOURCE_FILE:
            LOG(WARNING) << "Unsupported";
            UNIMPLEMENTED(ERROR) << " File-based config is not supported yet";
            break;
        default:
            LOG(ERROR) << " wrong srouce type " << (int)mSource;
            LOG(FATAL) << "Wrong srouce type " << (int)mSource;
            break;
    }

@@ -127,7 +133,7 @@ ConfigValue Config::getDefault(const std::string& name) {

bool Config::setInternal(const std::string& name, const ConfigValue& val) {
    bool res = false;
    auto data = mMap[name];
    auto& data = mMap[name];

    switch (mSource) {
        case ConfigSourceType::SOURCE_SYSPROP:
@@ -138,10 +144,10 @@ bool Config::setInternal(const std::string& name, const ConfigValue& val) {
            res = true;
            break;
        case ConfigSourceType::SOURCE_FILE:
            LOG(WARNING) << "Unsupported";
            UNIMPLEMENTED(ERROR) << " File-based config is not supported yet";
            break;
        default:
            LOG(ERROR) << " wrong srouce type " << (int)mSource;
            LOG(FATAL) << "Wrong srouce type " << (int)mSource;
            break;
    }

+27 −0
Original line number Diff line number Diff line
@@ -84,6 +84,33 @@ class Config {
    virtual Config::Data* getConfigData(int* size) = 0;
    bool setParam(const std::string& name, const std::string& value);

    void sourcedFromAidl() { mSource = ConfigSourceType::SOURCE_AIDL; }
    std::string toString(const ConfigValue& v) const {
        std::ostringstream os;
        if (std::holds_alternative<OptInt32>(v)) {
            OptInt32 ov = std::get<OptInt32>(v);
            if (ov.has_value()) os << ov.value();
        } else if (std::holds_alternative<OptInt64>(v)) {
            OptInt64 ov = std::get<OptInt64>(v);
            if (ov.has_value()) os << ov.value();
        } else if (std::holds_alternative<OptBool>(v)) {
            OptBool ov = std::get<OptBool>(v);
            if (ov.has_value()) os << ov.value();
            os << std::get<OptBool>(v).value();
        } else if (std::holds_alternative<OptIntVec>(v)) {
            for (auto x : std::get<OptIntVec>(v))
                if (x.has_value()) os << x.value() << " ";
        }
        return os.str();
    }
    std::string toString() const {
        std::ostringstream os;
        for (auto const& [k, v] : mMap) {
            os << k << ":" << toString(v.value) << std::endl;
        }
        return os.str();
    }

    ConfigValue parseBool(const std::string& value);
    ConfigValue parseString(const std::string& name);
    ConfigValue parseInt32(const std::string& value);
+6 −17
Original line number Diff line number Diff line
@@ -115,7 +115,7 @@ class ConfigTest : public ::testing::Test {
    void SetUp() override { cfg.init(); }
    void TearDown() override {}

    void switch2aidl() { cfg.setParam("astring", "astring"); }
    void switch2aidl() { cfg.sourcedFromAidl(); }

    TestConfig cfg;
};
@@ -129,7 +129,6 @@ TEST_F(ConfigTest, parseInt32) {
            {"1234", 1234},
            {"0", 0},
            {"", defval},
            {"xyz", defval},
    };
    for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++) {
        ASSERT_EQ((std::get<OptInt32>(cfg.parseInt32(values[i].strval))).value_or(defval),
@@ -143,8 +142,10 @@ TEST_F(ConfigTest, parseInt64) {
        std::string strval;
        std::int64_t expval;
    } values[] = {
            {"1234", 1234},  {"12345678909876", 12345678909876}, {"0", 0}, {"", defval},
            {"xyz", defval},
            {"1234", 1234},
            {"12345678909876", 12345678909876},
            {"0", 0},
            {"", defval},
    };
    for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++) {
        ASSERT_EQ((std::get<OptInt64>(cfg.parseInt64(values[i].strval))).value_or(defval),
@@ -160,8 +161,6 @@ TEST_F(ConfigTest, parseBool) {
    } values[] = {
            {"false", false},
            {"true", true},
            {"", defval},
            {"xyz", defval},
    };
    for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++) {
        ASSERT_EQ((std::get<OptBool>(cfg.parseBool(values[i].strval))).value_or(defval),
@@ -174,9 +173,7 @@ TEST_F(ConfigTest, parseIntVec) {
    struct {
        std::string strval;
        std::vector<std::optional<int>> expval;
    } values[] = {
            {"1", {1}}, {"1,2,3", {1, 2, 3}}, {"1,2,b", defval}, {"", defval}, {"xyz", defval},
    };
    } values[] = {{"1", {1}}, {"1,2,3", {1, 2, 3}}, {"1,2,b", defval}, {"", defval}};
    for (int i = 0; i < sizeof(values) / sizeof(values[0]); i++) {
        ASSERT_EQ(std::get<OptIntVec>(cfg.parseIntVec(values[i].strval)), values[i].expval);
    }
@@ -255,12 +252,4 @@ TEST_F(ConfigTest, setters_aidl) {
    EXPECT_EQ(cfg.getopt<OptIntVec>("avector"), val_avector_new);
}

TEST_F(ConfigTest, setParam) {
    ASSERT_TRUE(cfg.setParam("aint32", "789"));
    ASSERT_EQ(cfg.get<std::int32_t>("aint32"), 789);
    ASSERT_TRUE(cfg.setParam("avector", "7,8,9,10"));
    OptIntVec val_avector_new{7, 8, 9, 10};
    EXPECT_EQ(cfg.getopt<OptIntVec>("avector"), val_avector_new);
    ASSERT_FALSE(cfg.setParam("unknown", "any"));
}
}  // namespace aidl::android::hardware::biometrics
+1 −1
Original line number Diff line number Diff line
@@ -57,5 +57,5 @@ aidl_interface {
        },

    ],
    frozen: true,
    frozen: false,
}
+68 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source 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.
 */
///////////////////////////////////////////////////////////////////////////////
// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE.                          //
///////////////////////////////////////////////////////////////////////////////

// This file is a snapshot of an AIDL file. Do not edit it manually. There are
// two cases:
// 1). this is a frozen version file - do not edit this in any case.
// 2). this is a 'current' file. If you make a backwards compatible change to
//     the interface (from the latest frozen version), the build system will
//     prompt you to update this file with `m <name>-update-api`.
//
// You must not make a backward incompatible change to any AIDL file built
// with the aidl_interface module type with versions property set. The module
// type is used to build AIDL files in a way that they can be used across
// independently updatable components of the system. If a device is shipped
// with such a backward incompatible change, it has a high risk of breaking
// later when a module using the interface is updated, e.g., Mainline modules.

package android.hardware.biometrics.fingerprint;
/* @hide */
@VintfStability
interface IVirtualHal {
  oneway void setEnrollments(in int[] id);
  oneway void setEnrollmentHit(in int hit_id);
  oneway void setAuthenticatorId(in long id);
  oneway void setChallenge(in long challenge);
  oneway void setOperationAuthenticateFails(in boolean fail);
  oneway void setOperationAuthenticateLatency(in int[] latencyMs);
  oneway void setOperationAuthenticateDuration(in int durationMs);
  oneway void setOperationAuthenticateError(in int error);
  oneway void setOperationAuthenticateAcquired(in int[] acquired);
  oneway void setOperationEnrollError(in int error);
  oneway void setOperationEnrollLatency(in int[] latencyMs);
  oneway void setOperationDetectInteractionLatency(in int[] latencyMs);
  oneway void setOperationDetectInteractionError(in int error);
  oneway void setOperationDetectInteractionDuration(in int durationMs);
  oneway void setOperationDetectInteractionAcquired(in int[] acquired);
  oneway void setLockout(in boolean lockout);
  oneway void setLockoutEnable(in boolean enable);
  oneway void setLockoutTimedThreshold(in int threshold);
  oneway void setLockoutTimedDuration(in int durationMs);
  oneway void setLockoutPermanentThreshold(in int threshold);
  oneway void setType(in android.hardware.biometrics.fingerprint.FingerprintSensorType type);
  oneway void setSensorId(in int id);
  oneway void setSensorStrength(in android.hardware.biometrics.common.SensorStrength strength);
  oneway void setMaxEnrollmentPerUser(in int max);
  oneway void setSensorLocation(in android.hardware.biometrics.fingerprint.SensorLocation loc);
  oneway void setNavigationGuesture(in boolean v);
  oneway void setDetectInteraction(in boolean v);
  oneway void setDisplayTouch(in boolean v);
  oneway void setControlIllumination(in boolean v);
  const int STATUS_INVALID_PARAMETER = 1;
}
Loading