mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-01 11:36:00 +00:00
Merge "Simulate finger touch with virtual fingerprint hal" into udc-qpr-dev
This commit is contained in:
@@ -31,6 +31,9 @@ using ::android::base::ParseInt;
|
|||||||
|
|
||||||
namespace aidl::android::hardware::biometrics::fingerprint {
|
namespace aidl::android::hardware::biometrics::fingerprint {
|
||||||
|
|
||||||
|
FakeFingerprintEngine::FakeFingerprintEngine()
|
||||||
|
: mRandom(std::mt19937::default_seed), mWorkMode(WorkMode::kIdle) {}
|
||||||
|
|
||||||
void FakeFingerprintEngine::generateChallengeImpl(ISessionCallback* cb) {
|
void FakeFingerprintEngine::generateChallengeImpl(ISessionCallback* cb) {
|
||||||
BEGIN_OP(0);
|
BEGIN_OP(0);
|
||||||
std::uniform_int_distribution<int64_t> dist;
|
std::uniform_int_distribution<int64_t> dist;
|
||||||
@@ -48,6 +51,64 @@ void FakeFingerprintEngine::revokeChallengeImpl(ISessionCallback* cb, int64_t ch
|
|||||||
void FakeFingerprintEngine::enrollImpl(ISessionCallback* cb,
|
void FakeFingerprintEngine::enrollImpl(ISessionCallback* cb,
|
||||||
const keymaster::HardwareAuthToken& hat,
|
const keymaster::HardwareAuthToken& hat,
|
||||||
const std::future<void>& cancel) {
|
const std::future<void>& cancel) {
|
||||||
|
BEGIN_OP(0);
|
||||||
|
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);
|
||||||
|
updateContext(WorkMode::kAuthenticate, cb, const_cast<std::future<void>&>(cancel), operationId,
|
||||||
|
keymaster::HardwareAuthToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
void FakeFingerprintEngine::detectInteractionImpl(ISessionCallback* cb,
|
||||||
|
const std::future<void>& cancel) {
|
||||||
|
BEGIN_OP(0);
|
||||||
|
|
||||||
|
auto detectInteractionSupported =
|
||||||
|
FingerprintHalProperties::detect_interaction().value_or(false);
|
||||||
|
if (!detectInteractionSupported) {
|
||||||
|
LOG(ERROR) << "Detect interaction is not supported";
|
||||||
|
cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateContext(WorkMode::kDetectInteract, cb, const_cast<std::future<void>&>(cancel), 0,
|
||||||
|
keymaster::HardwareAuthToken());
|
||||||
|
}
|
||||||
|
|
||||||
|
void FakeFingerprintEngine::updateContext(WorkMode mode, ISessionCallback* cb,
|
||||||
|
std::future<void>& cancel, int64_t operationId,
|
||||||
|
const keymaster::HardwareAuthToken& hat) {
|
||||||
|
mCancel = std::move(cancel);
|
||||||
|
mWorkMode = mode;
|
||||||
|
mCb = cb;
|
||||||
|
mOperationId = operationId;
|
||||||
|
mHat = hat;
|
||||||
|
}
|
||||||
|
|
||||||
|
void FakeFingerprintEngine::fingerDownAction() {
|
||||||
|
LOG(INFO) << __func__;
|
||||||
|
switch (mWorkMode) {
|
||||||
|
case WorkMode::kAuthenticate:
|
||||||
|
onAuthenticateFingerDown(mCb, mOperationId, mCancel);
|
||||||
|
break;
|
||||||
|
case WorkMode::kEnroll:
|
||||||
|
onEnrollFingerDown(mCb, mHat, mCancel);
|
||||||
|
break;
|
||||||
|
case WorkMode::kDetectInteract:
|
||||||
|
onDetectInteractFingerDown(mCb, mCancel);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG(WARNING) << "unexpected mode: on fingerDownAction(), " << (int)mWorkMode;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void FakeFingerprintEngine::onEnrollFingerDown(ISessionCallback* cb,
|
||||||
|
const keymaster::HardwareAuthToken& hat,
|
||||||
|
const std::future<void>& cancel) {
|
||||||
BEGIN_OP(getLatency(FingerprintHalProperties::operation_enroll_latency()));
|
BEGIN_OP(getLatency(FingerprintHalProperties::operation_enroll_latency()));
|
||||||
|
|
||||||
// Do proper HAT verification in the real implementation.
|
// Do proper HAT verification in the real implementation.
|
||||||
@@ -116,8 +177,9 @@ void FakeFingerprintEngine::enrollImpl(ISessionCallback* cb,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeFingerprintEngine::authenticateImpl(ISessionCallback* cb, int64_t /* operationId */,
|
void FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb,
|
||||||
const std::future<void>& cancel) {
|
int64_t /* operationId */,
|
||||||
|
const std::future<void>& cancel) {
|
||||||
BEGIN_OP(getLatency(FingerprintHalProperties::operation_authenticate_latency()));
|
BEGIN_OP(getLatency(FingerprintHalProperties::operation_authenticate_latency()));
|
||||||
|
|
||||||
int64_t now = Util::getSystemNanoTime();
|
int64_t now = Util::getSystemNanoTime();
|
||||||
@@ -197,21 +259,13 @@ void FakeFingerprintEngine::authenticateImpl(ISessionCallback* cb, int64_t /* op
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeFingerprintEngine::detectInteractionImpl(ISessionCallback* cb,
|
void FakeFingerprintEngine::onDetectInteractFingerDown(ISessionCallback* cb,
|
||||||
const std::future<void>& cancel) {
|
const std::future<void>& cancel) {
|
||||||
BEGIN_OP(getLatency(FingerprintHalProperties::operation_detect_interaction_latency()));
|
BEGIN_OP(getLatency(FingerprintHalProperties::operation_detect_interaction_latency()));
|
||||||
|
|
||||||
int64_t duration =
|
int64_t duration =
|
||||||
FingerprintHalProperties::operation_detect_interaction_duration().value_or(10);
|
FingerprintHalProperties::operation_detect_interaction_duration().value_or(10);
|
||||||
|
|
||||||
auto detectInteractionSupported =
|
|
||||||
FingerprintHalProperties::detect_interaction().value_or(false);
|
|
||||||
if (!detectInteractionSupported) {
|
|
||||||
LOG(ERROR) << "Detect interaction is not supported";
|
|
||||||
cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto acquired = FingerprintHalProperties::operation_detect_interaction_acquired().value_or("1");
|
auto acquired = FingerprintHalProperties::operation_detect_interaction_acquired().value_or("1");
|
||||||
auto acquiredInfos = parseIntSequence(acquired);
|
auto acquiredInfos = parseIntSequence(acquired);
|
||||||
int N = acquiredInfos.size();
|
int N = acquiredInfos.size();
|
||||||
@@ -334,6 +388,7 @@ ndk::ScopedAStatus FakeFingerprintEngine::onPointerDownImpl(int32_t /*pointerId*
|
|||||||
int32_t /*y*/, float /*minor*/,
|
int32_t /*y*/, float /*minor*/,
|
||||||
float /*major*/) {
|
float /*major*/) {
|
||||||
BEGIN_OP(0);
|
BEGIN_OP(0);
|
||||||
|
fingerDownAction();
|
||||||
return ndk::ScopedAStatus::ok();
|
return ndk::ScopedAStatus::ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,7 +419,8 @@ bool FakeFingerprintEngine::getSensorLocationConfig(SensorLocation& out) {
|
|||||||
if (dim.size() >= 4) {
|
if (dim.size() >= 4) {
|
||||||
d = dim[3];
|
d = dim[3];
|
||||||
}
|
}
|
||||||
if (isValidStr) out = {0, x, y, r, d};
|
if (isValidStr)
|
||||||
|
out = {.sensorLocationX = x, .sensorLocationY = y, .sensorRadius = r, .display = d};
|
||||||
|
|
||||||
return isValidStr;
|
return isValidStr;
|
||||||
}
|
}
|
||||||
@@ -380,8 +436,7 @@ SensorLocation FakeFingerprintEngine::getSensorLocation() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SensorLocation FakeFingerprintEngine::defaultSensorLocation() {
|
SensorLocation FakeFingerprintEngine::defaultSensorLocation() {
|
||||||
return {0 /* displayId (not used) */, 0 /* sensorLocationX */, 0 /* sensorLocationY */,
|
return SensorLocation();
|
||||||
0 /* sensorRadius */, "" /* display */};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<int32_t> FakeFingerprintEngine::parseIntSequence(const std::string& str,
|
std::vector<int32_t> FakeFingerprintEngine::parseIntSequence(const std::string& str,
|
||||||
|
|||||||
@@ -28,10 +28,8 @@ using namespace ::android::fingerprint::virt;
|
|||||||
namespace aidl::android::hardware::biometrics::fingerprint {
|
namespace aidl::android::hardware::biometrics::fingerprint {
|
||||||
|
|
||||||
SensorLocation FakeFingerprintEngineSide::defaultSensorLocation() {
|
SensorLocation FakeFingerprintEngineSide::defaultSensorLocation() {
|
||||||
SensorLocation location;
|
return SensorLocation{.sensorLocationX = defaultSensorLocationX,
|
||||||
|
.sensorLocationY = defaultSensorLocationY,
|
||||||
return {0 /* displayId (not used) */, defaultSensorLocationX /* sensorLocationX */,
|
.sensorRadius = defaultSensorRadius};
|
||||||
defaultSensorLocationY /* sensorLocationY */, defaultSensorRadius /* sensorRadius */,
|
|
||||||
"" /* display */};
|
|
||||||
}
|
}
|
||||||
} // namespace aidl::android::hardware::biometrics::fingerprint
|
} // namespace aidl::android::hardware::biometrics::fingerprint
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ using namespace ::android::fingerprint::virt;
|
|||||||
namespace aidl::android::hardware::biometrics::fingerprint {
|
namespace aidl::android::hardware::biometrics::fingerprint {
|
||||||
|
|
||||||
FakeFingerprintEngineUdfps::FakeFingerprintEngineUdfps()
|
FakeFingerprintEngineUdfps::FakeFingerprintEngineUdfps()
|
||||||
: FakeFingerprintEngine(), mWorkMode(WorkMode::kIdle), mPointerDownTime(0), mUiReadyTime(0) {}
|
: FakeFingerprintEngine(), mPointerDownTime(0), mUiReadyTime(0) {}
|
||||||
|
|
||||||
SensorLocation FakeFingerprintEngineUdfps::defaultSensorLocation() {
|
SensorLocation FakeFingerprintEngineUdfps::defaultSensorLocation() {
|
||||||
return {0 /* displayId (not used) */, defaultSensorLocationX /* sensorLocationX */,
|
return SensorLocation{.sensorLocationX = defaultSensorLocationX,
|
||||||
defaultSensorLocationY /* sensorLocationY */, defaultSensorRadius /* sensorRadius */,
|
.sensorLocationY = defaultSensorLocationY,
|
||||||
"" /* display */};
|
.sensorRadius = defaultSensorRadius};
|
||||||
}
|
}
|
||||||
|
|
||||||
ndk::ScopedAStatus FakeFingerprintEngineUdfps::onPointerDownImpl(int32_t /*pointerId*/,
|
ndk::ScopedAStatus FakeFingerprintEngineUdfps::onPointerDownImpl(int32_t /*pointerId*/,
|
||||||
@@ -70,68 +70,17 @@ ndk::ScopedAStatus FakeFingerprintEngineUdfps::onUiReadyImpl() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void FakeFingerprintEngineUdfps::fingerDownAction() {
|
void FakeFingerprintEngineUdfps::fingerDownAction() {
|
||||||
switch (mWorkMode) {
|
FakeFingerprintEngine::fingerDownAction();
|
||||||
case WorkMode::kAuthenticate:
|
|
||||||
onAuthenticateFingerDown();
|
|
||||||
break;
|
|
||||||
case WorkMode::kEnroll:
|
|
||||||
onEnrollFingerDown();
|
|
||||||
break;
|
|
||||||
case WorkMode::kDetectInteract:
|
|
||||||
onDetectInteractFingerDown();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LOG(WARNING) << "unexpected call: onUiReady()";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mUiReadyTime = 0;
|
mUiReadyTime = 0;
|
||||||
mPointerDownTime = 0;
|
mPointerDownTime = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void FakeFingerprintEngineUdfps::onAuthenticateFingerDown() {
|
|
||||||
FakeFingerprintEngine::authenticateImpl(mCb, mOperationId, mCancelVec[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FakeFingerprintEngineUdfps::onEnrollFingerDown() {
|
|
||||||
// Any use case to emulate display touch for each capture during enrollment?
|
|
||||||
FakeFingerprintEngine::enrollImpl(mCb, mHat, mCancelVec[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FakeFingerprintEngineUdfps::onDetectInteractFingerDown() {
|
|
||||||
FakeFingerprintEngine::detectInteractionImpl(mCb, mCancelVec[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FakeFingerprintEngineUdfps::enrollImpl(ISessionCallback* cb,
|
|
||||||
const keymaster::HardwareAuthToken& hat,
|
|
||||||
const std::future<void>& cancel) {
|
|
||||||
updateContext(WorkMode::kEnroll, cb, const_cast<std::future<void>&>(cancel), 0, hat);
|
|
||||||
}
|
|
||||||
|
|
||||||
void FakeFingerprintEngineUdfps::authenticateImpl(ISessionCallback* cb, int64_t operationId,
|
|
||||||
const std::future<void>& cancel) {
|
|
||||||
updateContext(WorkMode::kAuthenticate, cb, const_cast<std::future<void>&>(cancel), operationId,
|
|
||||||
keymaster::HardwareAuthToken());
|
|
||||||
}
|
|
||||||
|
|
||||||
void FakeFingerprintEngineUdfps::detectInteractionImpl(ISessionCallback* cb,
|
|
||||||
const std::future<void>& cancel) {
|
|
||||||
updateContext(WorkMode::kDetectInteract, cb, const_cast<std::future<void>&>(cancel), 0,
|
|
||||||
keymaster::HardwareAuthToken());
|
|
||||||
}
|
|
||||||
|
|
||||||
void FakeFingerprintEngineUdfps::updateContext(WorkMode mode, ISessionCallback* cb,
|
void FakeFingerprintEngineUdfps::updateContext(WorkMode mode, ISessionCallback* cb,
|
||||||
std::future<void>& cancel, int64_t operationId,
|
std::future<void>& cancel, int64_t operationId,
|
||||||
const keymaster::HardwareAuthToken& hat) {
|
const keymaster::HardwareAuthToken& hat) {
|
||||||
|
FakeFingerprintEngine::updateContext(mode, cb, cancel, operationId, hat);
|
||||||
mPointerDownTime = 0;
|
mPointerDownTime = 0;
|
||||||
mUiReadyTime = 0;
|
mUiReadyTime = 0;
|
||||||
mCancelVec.clear();
|
|
||||||
|
|
||||||
mCancelVec.push_back(std::move(cancel));
|
|
||||||
mWorkMode = mode;
|
|
||||||
mCb = cb;
|
|
||||||
mOperationId = operationId;
|
|
||||||
mHat = hat;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace aidl::android::hardware::biometrics::fingerprint
|
} // namespace aidl::android::hardware::biometrics::fingerprint
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include "Fingerprint.h"
|
#include "Fingerprint.h"
|
||||||
#include "Session.h"
|
#include "Session.h"
|
||||||
|
|
||||||
|
#include <android-base/properties.h>
|
||||||
#include <fingerprint.sysprop.h>
|
#include <fingerprint.sysprop.h>
|
||||||
|
|
||||||
#include <android-base/file.h>
|
#include <android-base/file.h>
|
||||||
@@ -59,6 +60,7 @@ Fingerprint::Fingerprint() : mWorker(MAX_WORKER_QUEUE_SIZE) {
|
|||||||
<< sensorTypeProp;
|
<< sensorTypeProp;
|
||||||
}
|
}
|
||||||
LOG(INFO) << "sensorTypeProp:" << sensorTypeProp;
|
LOG(INFO) << "sensorTypeProp:" << sensorTypeProp;
|
||||||
|
LOG(INFO) << "ro.product.name=" << ::android::base::GetProperty("ro.product.name", "UNKNOWN");
|
||||||
}
|
}
|
||||||
|
|
||||||
ndk::ScopedAStatus Fingerprint::getSensorProps(std::vector<SensorProps>* out) {
|
ndk::ScopedAStatus Fingerprint::getSensorProps(std::vector<SensorProps>* out) {
|
||||||
@@ -105,16 +107,16 @@ ndk::ScopedAStatus Fingerprint::createSession(int32_t sensorId, int32_t userId,
|
|||||||
|
|
||||||
mSession->linkToDeath(cb->asBinder().get());
|
mSession->linkToDeath(cb->asBinder().get());
|
||||||
|
|
||||||
LOG(INFO) << "createSession: sensorId:" << sensorId << " userId:" << userId;
|
LOG(INFO) << __func__ << ": sensorId:" << sensorId << " userId:" << userId;
|
||||||
return ndk::ScopedAStatus::ok();
|
return ndk::ScopedAStatus::ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
binder_status_t Fingerprint::dump(int fd, const char** /*args*/, uint32_t numArgs) {
|
binder_status_t Fingerprint::dump(int fd, const char** /*args*/, uint32_t numArgs) {
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
LOG(ERROR) << "Fingerprint::dump fd invalid: " << fd;
|
LOG(ERROR) << __func__ << "fd invalid: " << fd;
|
||||||
return STATUS_BAD_VALUE;
|
return STATUS_BAD_VALUE;
|
||||||
} else {
|
} else {
|
||||||
LOG(INFO) << "Fingerprint::dump fd:" << fd << "numArgs:" << numArgs;
|
LOG(INFO) << __func__ << " fd:" << fd << "numArgs:" << numArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
dprintf(fd, "----- FingerprintVirtualHal::dump -----\n");
|
dprintf(fd, "----- FingerprintVirtualHal::dump -----\n");
|
||||||
@@ -131,11 +133,11 @@ binder_status_t Fingerprint::dump(int fd, const char** /*args*/, uint32_t numArg
|
|||||||
|
|
||||||
binder_status_t Fingerprint::handleShellCommand(int in, int out, int err, const char** args,
|
binder_status_t Fingerprint::handleShellCommand(int in, int out, int err, const char** args,
|
||||||
uint32_t numArgs) {
|
uint32_t numArgs) {
|
||||||
LOG(INFO) << "Fingerprint::handleShellCommand in:" << in << " out:" << out << " err:" << err
|
LOG(INFO) << __func__ << " in:" << in << " out:" << out << " err:" << err
|
||||||
<< " numArgs:" << numArgs;
|
<< " numArgs:" << numArgs;
|
||||||
|
|
||||||
if (numArgs == 0) {
|
if (numArgs == 0) {
|
||||||
LOG(INFO) << "Fingerprint::handleShellCommand: available commands";
|
LOG(INFO) << __func__ << ": available commands";
|
||||||
onHelp(out);
|
onHelp(out);
|
||||||
return STATUS_OK;
|
return STATUS_OK;
|
||||||
}
|
}
|
||||||
@@ -163,7 +165,7 @@ void Fingerprint::onHelp(int fd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Fingerprint::resetConfigToDefault() {
|
void Fingerprint::resetConfigToDefault() {
|
||||||
LOG(INFO) << "reset virtual HAL configuration to default";
|
LOG(INFO) << __func__ << ": reset virtual HAL configuration to default";
|
||||||
#define RESET_CONFIG_O(__NAME__) \
|
#define RESET_CONFIG_O(__NAME__) \
|
||||||
if (FingerprintHalProperties::__NAME__()) FingerprintHalProperties::__NAME__(std::nullopt)
|
if (FingerprintHalProperties::__NAME__()) FingerprintHalProperties::__NAME__(std::nullopt)
|
||||||
#define RESET_CONFIG_V(__NAME__) \
|
#define RESET_CONFIG_V(__NAME__) \
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace aidl::android::hardware::biometrics::fingerprint {
|
|||||||
// A fake engine that is backed by system properties instead of hardware.
|
// A fake engine that is backed by system properties instead of hardware.
|
||||||
class FakeFingerprintEngine {
|
class FakeFingerprintEngine {
|
||||||
public:
|
public:
|
||||||
FakeFingerprintEngine() : mRandom(std::mt19937::default_seed) {}
|
FakeFingerprintEngine();
|
||||||
virtual ~FakeFingerprintEngine() {}
|
virtual ~FakeFingerprintEngine() {}
|
||||||
|
|
||||||
void generateChallengeImpl(ISessionCallback* cb);
|
void generateChallengeImpl(ISessionCallback* cb);
|
||||||
@@ -66,6 +66,8 @@ class FakeFingerprintEngine {
|
|||||||
|
|
||||||
virtual SensorLocation defaultSensorLocation();
|
virtual SensorLocation defaultSensorLocation();
|
||||||
|
|
||||||
|
virtual void fingerDownAction();
|
||||||
|
|
||||||
std::vector<int32_t> parseIntSequence(const std::string& str, const std::string& sep = ",");
|
std::vector<int32_t> parseIntSequence(const std::string& str, const std::string& sep = ",");
|
||||||
|
|
||||||
std::vector<std::vector<int32_t>> parseEnrollmentCapture(const std::string& str);
|
std::vector<std::vector<int32_t>> parseEnrollmentCapture(const std::string& str);
|
||||||
@@ -74,15 +76,35 @@ class FakeFingerprintEngine {
|
|||||||
|
|
||||||
std::mt19937 mRandom;
|
std::mt19937 mRandom;
|
||||||
|
|
||||||
|
enum class WorkMode : int8_t { kIdle = 0, kAuthenticate, kEnroll, kDetectInteract };
|
||||||
|
|
||||||
|
WorkMode getWorkMode() { return mWorkMode; }
|
||||||
|
|
||||||
virtual std::string toString() const {
|
virtual std::string toString() const {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << "----- FakeFingerprintEngine:: -----" << std::endl;
|
os << "----- FakeFingerprintEngine:: -----" << std::endl;
|
||||||
|
os << "mWorkMode:" << (int)mWorkMode;
|
||||||
os << "acquiredVendorInfoBase:" << FINGERPRINT_ACQUIRED_VENDOR_BASE;
|
os << "acquiredVendorInfoBase:" << FINGERPRINT_ACQUIRED_VENDOR_BASE;
|
||||||
os << ", errorVendorBase:" << FINGERPRINT_ERROR_VENDOR_BASE << std::endl;
|
os << ", errorVendorBase:" << FINGERPRINT_ERROR_VENDOR_BASE << std::endl;
|
||||||
os << mLockoutTracker.toString();
|
os << mLockoutTracker.toString();
|
||||||
return os.str();
|
return os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void updateContext(WorkMode mode, ISessionCallback* cb, std::future<void>& cancel,
|
||||||
|
int64_t operationId, const keymaster::HardwareAuthToken& hat);
|
||||||
|
|
||||||
|
void onEnrollFingerDown(ISessionCallback* cb, const keymaster::HardwareAuthToken& hat,
|
||||||
|
const std::future<void>& cancel);
|
||||||
|
void onAuthenticateFingerDown(ISessionCallback* cb, int64_t, const std::future<void>& cancel);
|
||||||
|
void onDetectInteractFingerDown(ISessionCallback* cb, const std::future<void>& cancel);
|
||||||
|
|
||||||
|
WorkMode mWorkMode;
|
||||||
|
ISessionCallback* mCb;
|
||||||
|
keymaster::HardwareAuthToken mHat;
|
||||||
|
std::future<void> mCancel;
|
||||||
|
int64_t mOperationId;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr int32_t FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000;
|
static constexpr int32_t FINGERPRINT_ACQUIRED_VENDOR_BASE = 1000;
|
||||||
static constexpr int32_t FINGERPRINT_ERROR_VENDOR_BASE = 1000;
|
static constexpr int32_t FINGERPRINT_ERROR_VENDOR_BASE = 1000;
|
||||||
|
|||||||
@@ -42,39 +42,20 @@ class FakeFingerprintEngineUdfps : public FakeFingerprintEngine {
|
|||||||
|
|
||||||
SensorLocation defaultSensorLocation() override;
|
SensorLocation defaultSensorLocation() override;
|
||||||
|
|
||||||
void enrollImpl(ISessionCallback* cb, const keymaster::HardwareAuthToken& hat,
|
void updateContext(WorkMode mode, ISessionCallback* cb, std::future<void>& cancel,
|
||||||
const std::future<void>& cancel);
|
int64_t operationId, const keymaster::HardwareAuthToken& hat);
|
||||||
void authenticateImpl(ISessionCallback* cb, int64_t operationId,
|
void fingerDownAction();
|
||||||
const std::future<void>& cancel);
|
|
||||||
void detectInteractionImpl(ISessionCallback* cb, const std::future<void>& cancel);
|
|
||||||
|
|
||||||
enum class WorkMode : int8_t { kIdle = 0, kAuthenticate, kEnroll, kDetectInteract };
|
|
||||||
|
|
||||||
WorkMode getWorkMode() { return mWorkMode; }
|
|
||||||
|
|
||||||
std::string toString() const {
|
std::string toString() const {
|
||||||
std::ostringstream os;
|
std::ostringstream os;
|
||||||
os << FakeFingerprintEngine::toString();
|
os << FakeFingerprintEngine::toString();
|
||||||
os << "----- FakeFingerprintEngineUdfps -----" << std::endl;
|
os << "----- FakeFingerprintEngineUdfps -----" << std::endl;
|
||||||
os << "mWorkMode:" << (int)mWorkMode;
|
|
||||||
os << ", mUiReadyTime:" << mUiReadyTime;
|
os << ", mUiReadyTime:" << mUiReadyTime;
|
||||||
os << ", mPointerDownTime:" << mPointerDownTime << std::endl;
|
os << ", mPointerDownTime:" << mPointerDownTime << std::endl;
|
||||||
return os.str();
|
return os.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void onAuthenticateFingerDown();
|
|
||||||
void onEnrollFingerDown();
|
|
||||||
void onDetectInteractFingerDown();
|
|
||||||
void fingerDownAction();
|
|
||||||
void updateContext(WorkMode mode, ISessionCallback* cb, std::future<void>& cancel,
|
|
||||||
int64_t operationId, const keymaster::HardwareAuthToken& hat);
|
|
||||||
|
|
||||||
WorkMode mWorkMode;
|
|
||||||
ISessionCallback* mCb;
|
|
||||||
keymaster::HardwareAuthToken mHat;
|
|
||||||
std::vector<std::future<void>> mCancelVec;
|
|
||||||
int64_t mOperationId;
|
|
||||||
int64_t mPointerDownTime;
|
int64_t mPointerDownTime;
|
||||||
int64_t mUiReadyTime;
|
int64_t mUiReadyTime;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ class Fingerprint : public BnFingerprint {
|
|||||||
private:
|
private:
|
||||||
void resetConfigToDefault();
|
void resetConfigToDefault();
|
||||||
void onHelp(int);
|
void onHelp(int);
|
||||||
|
void onSimFingerDown();
|
||||||
|
|
||||||
std::unique_ptr<FakeFingerprintEngine> mEngine;
|
std::unique_ptr<FakeFingerprintEngine> mEngine;
|
||||||
WorkerThread mWorker;
|
WorkerThread mWorker;
|
||||||
|
|||||||
@@ -178,6 +178,8 @@ TEST_F(FakeFingerprintEngineTest, Enroll) {
|
|||||||
FingerprintHalProperties::next_enrollment("4:0,0:true");
|
FingerprintHalProperties::next_enrollment("4:0,0:true");
|
||||||
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
|
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
|
||||||
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
|
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
|
||||||
|
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kEnroll);
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
|
ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
|
||||||
ASSERT_EQ(1, FingerprintHalProperties::enrollments().size());
|
ASSERT_EQ(1, FingerprintHalProperties::enrollments().size());
|
||||||
ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
|
ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
|
||||||
@@ -192,6 +194,7 @@ TEST_F(FakeFingerprintEngineTest, EnrollCancel) {
|
|||||||
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
|
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
|
||||||
mCancel.set_value();
|
mCancel.set_value();
|
||||||
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
|
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(Error::CANCELED, mCallback->mError);
|
ASSERT_EQ(Error::CANCELED, mCallback->mError);
|
||||||
ASSERT_EQ(-1, mCallback->mLastEnrolled);
|
ASSERT_EQ(-1, mCallback->mLastEnrolled);
|
||||||
ASSERT_EQ(0, FingerprintHalProperties::enrollments().size());
|
ASSERT_EQ(0, FingerprintHalProperties::enrollments().size());
|
||||||
@@ -204,6 +207,7 @@ TEST_F(FakeFingerprintEngineTest, EnrollFail) {
|
|||||||
FingerprintHalProperties::next_enrollment(next);
|
FingerprintHalProperties::next_enrollment(next);
|
||||||
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
|
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
|
||||||
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
|
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(Error::UNABLE_TO_PROCESS, mCallback->mError);
|
ASSERT_EQ(Error::UNABLE_TO_PROCESS, mCallback->mError);
|
||||||
ASSERT_EQ(-1, mCallback->mLastEnrolled);
|
ASSERT_EQ(-1, mCallback->mLastEnrolled);
|
||||||
ASSERT_EQ(0, FingerprintHalProperties::enrollments().size());
|
ASSERT_EQ(0, FingerprintHalProperties::enrollments().size());
|
||||||
@@ -216,6 +220,7 @@ TEST_F(FakeFingerprintEngineTest, EnrollAcquired) {
|
|||||||
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
|
keymaster::HardwareAuthToken hat{.mac = {2, 4}};
|
||||||
int32_t prevCnt = mCallback->mLastAcquiredCount;
|
int32_t prevCnt = mCallback->mLastAcquiredCount;
|
||||||
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
|
mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
|
ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
|
||||||
ASSERT_EQ(1, FingerprintHalProperties::enrollments().size());
|
ASSERT_EQ(1, FingerprintHalProperties::enrollments().size());
|
||||||
ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
|
ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
|
||||||
@@ -229,6 +234,8 @@ TEST_F(FakeFingerprintEngineTest, Authenticate) {
|
|||||||
FingerprintHalProperties::enrollments({1, 2});
|
FingerprintHalProperties::enrollments({1, 2});
|
||||||
FingerprintHalProperties::enrollment_hit(2);
|
FingerprintHalProperties::enrollment_hit(2);
|
||||||
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
||||||
|
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kAuthenticate);
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_FALSE(mCallback->mAuthenticateFailed);
|
ASSERT_FALSE(mCallback->mAuthenticateFailed);
|
||||||
ASSERT_EQ(2, mCallback->mLastAuthenticated);
|
ASSERT_EQ(2, mCallback->mLastAuthenticated);
|
||||||
ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
|
ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
|
||||||
@@ -239,6 +246,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateCancel) {
|
|||||||
FingerprintHalProperties::enrollment_hit(2);
|
FingerprintHalProperties::enrollment_hit(2);
|
||||||
mCancel.set_value();
|
mCancel.set_value();
|
||||||
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(Error::CANCELED, mCallback->mError);
|
ASSERT_EQ(Error::CANCELED, mCallback->mError);
|
||||||
ASSERT_EQ(-1, mCallback->mLastAuthenticated);
|
ASSERT_EQ(-1, mCallback->mLastAuthenticated);
|
||||||
}
|
}
|
||||||
@@ -247,6 +255,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateNotSet) {
|
|||||||
FingerprintHalProperties::enrollments({1, 2});
|
FingerprintHalProperties::enrollments({1, 2});
|
||||||
FingerprintHalProperties::enrollment_hit({});
|
FingerprintHalProperties::enrollment_hit({});
|
||||||
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_TRUE(mCallback->mAuthenticateFailed);
|
ASSERT_TRUE(mCallback->mAuthenticateFailed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -254,6 +263,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateNotEnrolled) {
|
|||||||
FingerprintHalProperties::enrollments({1, 2});
|
FingerprintHalProperties::enrollments({1, 2});
|
||||||
FingerprintHalProperties::enrollment_hit(3);
|
FingerprintHalProperties::enrollment_hit(3);
|
||||||
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_TRUE(mCallback->mAuthenticateFailed);
|
ASSERT_TRUE(mCallback->mAuthenticateFailed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,6 +272,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateLockout) {
|
|||||||
FingerprintHalProperties::enrollment_hit(2);
|
FingerprintHalProperties::enrollment_hit(2);
|
||||||
FingerprintHalProperties::lockout(true);
|
FingerprintHalProperties::lockout(true);
|
||||||
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_TRUE(mCallback->mLockoutPermanent);
|
ASSERT_TRUE(mCallback->mLockoutPermanent);
|
||||||
ASSERT_NE(mCallback->mError, Error::UNKNOWN);
|
ASSERT_NE(mCallback->mError, Error::UNKNOWN);
|
||||||
}
|
}
|
||||||
@@ -269,6 +280,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateLockout) {
|
|||||||
TEST_F(FakeFingerprintEngineTest, AuthenticateError8) {
|
TEST_F(FakeFingerprintEngineTest, AuthenticateError8) {
|
||||||
FingerprintHalProperties::operation_authenticate_error(8);
|
FingerprintHalProperties::operation_authenticate_error(8);
|
||||||
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(mCallback->mError, (Error)8);
|
ASSERT_EQ(mCallback->mError, (Error)8);
|
||||||
ASSERT_EQ(mCallback->mErrorVendorCode, 0);
|
ASSERT_EQ(mCallback->mErrorVendorCode, 0);
|
||||||
}
|
}
|
||||||
@@ -276,6 +288,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateError8) {
|
|||||||
TEST_F(FakeFingerprintEngineTest, AuthenticateError9) {
|
TEST_F(FakeFingerprintEngineTest, AuthenticateError9) {
|
||||||
FingerprintHalProperties::operation_authenticate_error(1009);
|
FingerprintHalProperties::operation_authenticate_error(1009);
|
||||||
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(mCallback->mError, (Error)7);
|
ASSERT_EQ(mCallback->mError, (Error)7);
|
||||||
ASSERT_EQ(mCallback->mErrorVendorCode, 9);
|
ASSERT_EQ(mCallback->mErrorVendorCode, 9);
|
||||||
}
|
}
|
||||||
@@ -287,6 +300,7 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateAcquired) {
|
|||||||
FingerprintHalProperties::operation_authenticate_acquired("4,1009");
|
FingerprintHalProperties::operation_authenticate_acquired("4,1009");
|
||||||
int32_t prevCount = mCallback->mLastAcquiredCount;
|
int32_t prevCount = mCallback->mLastAcquiredCount;
|
||||||
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_FALSE(mCallback->mAuthenticateFailed);
|
ASSERT_FALSE(mCallback->mAuthenticateFailed);
|
||||||
ASSERT_EQ(2, mCallback->mLastAuthenticated);
|
ASSERT_EQ(2, mCallback->mLastAuthenticated);
|
||||||
ASSERT_EQ(prevCount + 2, mCallback->mLastAcquiredCount);
|
ASSERT_EQ(prevCount + 2, mCallback->mLastAcquiredCount);
|
||||||
@@ -300,6 +314,8 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetect) {
|
|||||||
FingerprintHalProperties::enrollment_hit(2);
|
FingerprintHalProperties::enrollment_hit(2);
|
||||||
FingerprintHalProperties::operation_detect_interaction_acquired("");
|
FingerprintHalProperties::operation_detect_interaction_acquired("");
|
||||||
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
||||||
|
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kDetectInteract);
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
|
ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
|
||||||
ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
|
ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
|
||||||
}
|
}
|
||||||
@@ -310,6 +326,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectCancel) {
|
|||||||
FingerprintHalProperties::enrollment_hit(2);
|
FingerprintHalProperties::enrollment_hit(2);
|
||||||
mCancel.set_value();
|
mCancel.set_value();
|
||||||
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(Error::CANCELED, mCallback->mError);
|
ASSERT_EQ(Error::CANCELED, mCallback->mError);
|
||||||
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
|
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
|
||||||
}
|
}
|
||||||
@@ -319,6 +336,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectNotSet) {
|
|||||||
FingerprintHalProperties::enrollments({1, 2});
|
FingerprintHalProperties::enrollments({1, 2});
|
||||||
FingerprintHalProperties::enrollment_hit({});
|
FingerprintHalProperties::enrollment_hit({});
|
||||||
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
|
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -326,6 +344,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectNotEnrolled) {
|
|||||||
FingerprintHalProperties::enrollments({1, 2});
|
FingerprintHalProperties::enrollments({1, 2});
|
||||||
FingerprintHalProperties::enrollment_hit(25);
|
FingerprintHalProperties::enrollment_hit(25);
|
||||||
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
|
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,6 +352,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectError) {
|
|||||||
FingerprintHalProperties::detect_interaction(true);
|
FingerprintHalProperties::detect_interaction(true);
|
||||||
FingerprintHalProperties::operation_detect_interaction_error(8);
|
FingerprintHalProperties::operation_detect_interaction_error(8);
|
||||||
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
|
ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
|
||||||
ASSERT_EQ(mCallback->mError, (Error)8);
|
ASSERT_EQ(mCallback->mError, (Error)8);
|
||||||
ASSERT_EQ(mCallback->mErrorVendorCode, 0);
|
ASSERT_EQ(mCallback->mErrorVendorCode, 0);
|
||||||
@@ -345,6 +365,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectAcquired) {
|
|||||||
FingerprintHalProperties::operation_detect_interaction_acquired("4,1013");
|
FingerprintHalProperties::operation_detect_interaction_acquired("4,1013");
|
||||||
int32_t prevCount = mCallback->mLastAcquiredCount;
|
int32_t prevCount = mCallback->mLastAcquiredCount;
|
||||||
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
|
||||||
|
mEngine.fingerDownAction();
|
||||||
ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
|
ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
|
||||||
ASSERT_EQ(prevCount + 2, mCallback->mLastAcquiredCount);
|
ASSERT_EQ(prevCount + 2, mCallback->mLastAcquiredCount);
|
||||||
ASSERT_EQ(7, mCallback->mLastAcquiredInfo);
|
ASSERT_EQ(7, mCallback->mLastAcquiredInfo);
|
||||||
|
|||||||
Reference in New Issue
Block a user