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

Commit 74e25d2d authored by Jeff Pu's avatar Jeff Pu
Browse files

Fix Fingperint Virtual Hal cancellation while waiting finger touch

Bug: 319146424
Test: atest BiometricsE2eTests:BiometricPromptAuthSuccessTest
Test: atest android.hardware.biometrics.fingerprint.*
Change-Id: I26a2dde01608177411cce3f9c68ee6fd1fd6aab8
parent f55174e6
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -62,12 +62,17 @@ void FakeFingerprintEngine::enrollImpl(ISessionCallback* cb,
        return;
    }

    waitForFingerDown(cb, cancel);

    updateContext(WorkMode::kEnroll, cb, const_cast<std::future<void>&>(cancel), 0, hat);
}

void FakeFingerprintEngine::authenticateImpl(ISessionCallback* cb, int64_t operationId,
                                             const std::future<void>& cancel) {
    BEGIN_OP(0);

    waitForFingerDown(cb, cancel);

    updateContext(WorkMode::kAuthenticate, cb, const_cast<std::future<void>&>(cancel), operationId,
                  keymaster::HardwareAuthToken());
}
@@ -84,6 +89,8 @@ void FakeFingerprintEngine::detectInteractionImpl(ISessionCallback* cb,
        return;
    }

    waitForFingerDown(cb, cancel);

    updateContext(WorkMode::kDetectInteract, cb, const_cast<std::future<void>&>(cancel), 0,
                  keymaster::HardwareAuthToken());
}
@@ -398,6 +405,7 @@ ndk::ScopedAStatus FakeFingerprintEngine::onPointerDownImpl(int32_t /*pointerId*

ndk::ScopedAStatus FakeFingerprintEngine::onPointerUpImpl(int32_t /*pointerId*/) {
    BEGIN_OP(0);
    mFingerIsDown = false;
    return ndk::ScopedAStatus::ok();
}

@@ -533,4 +541,17 @@ void FakeFingerprintEngine::lockoutTimerExpired(ISessionCallback* cb) {
    isLockoutTimerStarted = false;
    isLockoutTimerAborted = false;
}

void FakeFingerprintEngine::waitForFingerDown(ISessionCallback* cb,
                                              const std::future<void>& cancel) {
    while (!mFingerIsDown) {
        if (shouldCancel(cancel)) {
            LOG(ERROR) << "waitForFingerDown, Fail: cancel";
            cb->onError(Error::CANCELED, 0 /* vendorCode */);
            return;
        }
        SLEEP_MS(10);
    }
}

}  // namespace aidl::android::hardware::biometrics::fingerprint
+1 −0
Original line number Diff line number Diff line
@@ -249,6 +249,7 @@ ndk::ScopedAStatus Session::close() {
ndk::ScopedAStatus Session::onPointerDown(int32_t pointerId, int32_t x, int32_t y, float minor,
                                          float major) {
    LOG(INFO) << "onPointerDown";
    mEngine->notifyFingerdown();
    mWorker->schedule(Callable::from([this, pointerId, x, y, minor, major] {
        mEngine->onPointerDownImpl(pointerId, x, y, minor, major);
        enterIdling();
+3 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ class FakeFingerprintEngine {
    enum class WorkMode : int8_t { kIdle = 0, kAuthenticate, kEnroll, kDetectInteract };

    WorkMode getWorkMode() { return mWorkMode; }
    void notifyFingerdown() { mFingerIsDown = true; }

    virtual std::string toString() const {
        std::ostringstream os;
@@ -100,6 +101,7 @@ class FakeFingerprintEngine {
    keymaster::HardwareAuthToken mHat;
    std::future<void> mCancel;
    int64_t mOperationId;
    bool mFingerIsDown;

  private:
    static constexpr int32_t FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000;
@@ -109,6 +111,7 @@ class FakeFingerprintEngine {
    int32_t getRandomInRange(int32_t bound1, int32_t bound2);
    bool checkSensorLockout(ISessionCallback*);
    void clearLockout(ISessionCallback* cb);
    void waitForFingerDown(ISessionCallback* cb, const std::future<void>& cancel);

    FakeLockoutTracker mLockoutTracker;

+19 −0
Original line number Diff line number Diff line
@@ -185,6 +185,7 @@ TEST_F(FakeFingerprintEngineTest, Enroll) {
    FingerprintHalProperties::enrollments({});
    FingerprintHalProperties::next_enrollment("4:0,0:true");
    keymaster::HardwareAuthToken hat{.mac = {2, 4}};
    mEngine.notifyFingerdown();
    mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
    ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kEnroll);
    mEngine.fingerDownAction();
@@ -202,6 +203,7 @@ TEST_F(FakeFingerprintEngineTest, EnrollCancel) {
    FingerprintHalProperties::next_enrollment(next);
    keymaster::HardwareAuthToken hat{.mac = {2, 4}};
    mCancel.set_value();
    mEngine.notifyFingerdown();
    mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(Error::CANCELED, mCallback->mError);
@@ -215,6 +217,7 @@ TEST_F(FakeFingerprintEngineTest, EnrollFail) {
    auto next = "2:0,0:false";
    FingerprintHalProperties::next_enrollment(next);
    keymaster::HardwareAuthToken hat{.mac = {2, 4}};
    mEngine.notifyFingerdown();
    mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(Error::UNABLE_TO_PROCESS, mCallback->mError);
@@ -228,6 +231,7 @@ TEST_F(FakeFingerprintEngineTest, EnrollAcquired) {
    FingerprintHalProperties::next_enrollment("4:0,5-[12,1013]:true");
    keymaster::HardwareAuthToken hat{.mac = {2, 4}};
    int32_t prevCnt = mCallback->mLastAcquiredCount;
    mEngine.notifyFingerdown();
    mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
@@ -242,6 +246,7 @@ TEST_F(FakeFingerprintEngineTest, EnrollAcquired) {
TEST_F(FakeFingerprintEngineTest, Authenticate) {
    FingerprintHalProperties::enrollments({1, 2});
    FingerprintHalProperties::enrollment_hit(2);
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kAuthenticate);
    mEngine.fingerDownAction();
@@ -255,6 +260,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateCancel) {
    FingerprintHalProperties::enrollments({2});
    FingerprintHalProperties::enrollment_hit(2);
    mCancel.set_value();
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(Error::CANCELED, mCallback->mError);
@@ -264,6 +270,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateCancel) {
TEST_F(FakeFingerprintEngineTest, AuthenticateNotSet) {
    FingerprintHalProperties::enrollments({1, 2});
    FingerprintHalProperties::enrollment_hit({});
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_TRUE(mCallback->mAuthenticateFailed);
@@ -272,6 +279,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateNotSet) {
TEST_F(FakeFingerprintEngineTest, AuthenticateNotEnrolled) {
    FingerprintHalProperties::enrollments({1, 2});
    FingerprintHalProperties::enrollment_hit(3);
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_TRUE(mCallback->mAuthenticateFailed);
@@ -282,6 +290,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateLockout) {
    FingerprintHalProperties::enrollments({22, 2});
    FingerprintHalProperties::enrollment_hit(2);
    FingerprintHalProperties::lockout(true);
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_TRUE(mCallback->mLockoutPermanent);
@@ -290,6 +299,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateLockout) {

TEST_F(FakeFingerprintEngineTest, AuthenticateError8) {
    FingerprintHalProperties::operation_authenticate_error(8);
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(mCallback->mError, (Error)8);
@@ -298,6 +308,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateError8) {

TEST_F(FakeFingerprintEngineTest, AuthenticateError9) {
    FingerprintHalProperties::operation_authenticate_error(1009);
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(mCallback->mError, (Error)7);
@@ -306,6 +317,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateError9) {

TEST_F(FakeFingerprintEngineTest, AuthenticateFails) {
    FingerprintHalProperties::operation_authenticate_fails(true);
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_TRUE(mCallback->mAuthenticateFailed);
@@ -318,6 +330,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateAcquired) {
    FingerprintHalProperties::enrollment_hit(2);
    FingerprintHalProperties::operation_authenticate_acquired("4,1009");
    int32_t prevCount = mCallback->mLastAcquiredCount;
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_FALSE(mCallback->mAuthenticateFailed);
@@ -332,6 +345,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetect) {
    FingerprintHalProperties::enrollments({1, 2});
    FingerprintHalProperties::enrollment_hit(2);
    FingerprintHalProperties::operation_detect_interaction_acquired("");
    mEngine.notifyFingerdown();
    mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
    ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kDetectInteract);
    mEngine.fingerDownAction();
@@ -345,6 +359,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectCancel) {
    FingerprintHalProperties::enrollments({1, 2});
    FingerprintHalProperties::enrollment_hit(2);
    mCancel.set_value();
    mEngine.notifyFingerdown();
    mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(Error::CANCELED, mCallback->mError);
@@ -355,6 +370,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectNotSet) {
    FingerprintHalProperties::detect_interaction(true);
    FingerprintHalProperties::enrollments({1, 2});
    FingerprintHalProperties::enrollment_hit({});
    mEngine.notifyFingerdown();
    mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
@@ -363,6 +379,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectNotSet) {
TEST_F(FakeFingerprintEngineTest, InteractionDetectNotEnrolled) {
    FingerprintHalProperties::enrollments({1, 2});
    FingerprintHalProperties::enrollment_hit(25);
    mEngine.notifyFingerdown();
    mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
@@ -371,6 +388,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectNotEnrolled) {
TEST_F(FakeFingerprintEngineTest, InteractionDetectError) {
    FingerprintHalProperties::detect_interaction(true);
    FingerprintHalProperties::operation_detect_interaction_error(8);
    mEngine.notifyFingerdown();
    mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
@@ -384,6 +402,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectAcquired) {
    FingerprintHalProperties::enrollment_hit(2);
    FingerprintHalProperties::operation_detect_interaction_acquired("4,1013");
    int32_t prevCount = mCallback->mLastAcquiredCount;
    mEngine.notifyFingerdown();
    mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
    mEngine.fingerDownAction();
    ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
+3 −0
Original line number Diff line number Diff line
@@ -145,6 +145,7 @@ TEST_F(FakeFingerprintEngineUdfpsTest, initialization) {
TEST_F(FakeFingerprintEngineUdfpsTest, authenticate) {
    std::shared_ptr<TestSessionCallback> cb = ndk::SharedRefBase::make<TestSessionCallback>();
    std::promise<void> cancel;
    mEngine.notifyFingerdown();
    mEngine.authenticateImpl(cb.get(), 1, cancel.get_future());
    ASSERT_TRUE(mEngine.getWorkMode() == FakeFingerprintEngineUdfps::WorkMode::kAuthenticate);
    mEngine.onPointerDownImpl(1, 2, 3, 4.0, 5.0);
@@ -158,6 +159,7 @@ TEST_F(FakeFingerprintEngineUdfpsTest, enroll) {
    std::promise<void> cancel;
    keymaster::HardwareAuthToken hat{.mac = {5, 6}};
    FingerprintHalProperties::next_enrollment("5:0,0:true");
    mEngine.notifyFingerdown();
    mEngine.enrollImpl(cb.get(), hat, cancel.get_future());
    ASSERT_TRUE(mEngine.getWorkMode() == FakeFingerprintEngineUdfps::WorkMode::kEnroll);
    mEngine.onPointerDownImpl(1, 2, 3, 4.0, 5.0);
@@ -173,6 +175,7 @@ TEST_F(FakeFingerprintEngineUdfpsTest, detectInteraction) {
    FingerprintHalProperties::operation_detect_interaction_acquired("");
    std::shared_ptr<TestSessionCallback> cb = ndk::SharedRefBase::make<TestSessionCallback>();
    std::promise<void> cancel;
    mEngine.notifyFingerdown();
    mEngine.detectInteractionImpl(cb.get(), cancel.get_future());
    ASSERT_TRUE(mEngine.getWorkMode() == FakeFingerprintEngineUdfps::WorkMode::kDetectInteract);
    mEngine.onPointerDownImpl(1, 2, 3, 4.0, 5.0);