Support configuration reset and dump
Bug: 294254230 Test: atest android.hardware.biometrics.face.* -c adb shell cmd android.hardware.biometrics.face.IFace/virtual resetconfig adb shell dumpsys face Change-Id: I6dc5657104da103860cca133beba21e1b10cb423
This commit is contained in:
parent
50d605f8a1
commit
1e93ca6c74
5 changed files with 166 additions and 7 deletions
|
@ -14,11 +14,23 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#undef LOG_TAG
|
||||||
|
#define LOG_TAG "FaceVirtualHal"
|
||||||
|
|
||||||
#include "Face.h"
|
#include "Face.h"
|
||||||
#include "Session.h"
|
#include "Session.h"
|
||||||
|
|
||||||
#include "FakeFaceEngine.h"
|
#include "FakeFaceEngine.h"
|
||||||
|
|
||||||
|
#include <android-base/properties.h>
|
||||||
|
#include <face.sysprop.h>
|
||||||
|
|
||||||
|
#include <android-base/file.h>
|
||||||
|
#include <android-base/logging.h>
|
||||||
|
#include <android-base/stringprintf.h>
|
||||||
|
|
||||||
|
using namespace ::android::face::virt;
|
||||||
|
|
||||||
namespace aidl::android::hardware::biometrics::face {
|
namespace aidl::android::hardware::biometrics::face {
|
||||||
|
|
||||||
const int kSensorId = 4;
|
const int kSensorId = 4;
|
||||||
|
@ -68,11 +80,105 @@ ndk::ScopedAStatus Face::getSensorProps(std::vector<SensorProps>* return_val) {
|
||||||
return ndk::ScopedAStatus::ok();
|
return ndk::ScopedAStatus::ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
ndk::ScopedAStatus Face::createSession(int32_t /*sensorId*/, int32_t /*userId*/,
|
ndk::ScopedAStatus Face::createSession(int32_t sensorId, int32_t userId,
|
||||||
const std::shared_ptr<ISessionCallback>& cb,
|
const std::shared_ptr<ISessionCallback>& cb,
|
||||||
std::shared_ptr<ISession>* return_val) {
|
std::shared_ptr<ISession>* return_val) {
|
||||||
*return_val = SharedRefBase::make<Session>(std::make_unique<FakeFaceEngine>(), cb);
|
mSession = SharedRefBase::make<Session>(std::make_unique<FakeFaceEngine>(), cb);
|
||||||
|
*return_val = mSession;
|
||||||
|
|
||||||
|
mSession->linkToDeath(cb->asBinder().get());
|
||||||
|
|
||||||
|
LOG(INFO) << __func__ << ": sensorId:" << sensorId << " userId:" << userId;
|
||||||
return ndk::ScopedAStatus::ok();
|
return ndk::ScopedAStatus::ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binder_status_t Face::dump(int fd, const char** /*args*/, uint32_t numArgs) {
|
||||||
|
if (fd < 0) {
|
||||||
|
LOG(ERROR) << __func__ << "fd invalid: " << fd;
|
||||||
|
return STATUS_BAD_VALUE;
|
||||||
|
} else {
|
||||||
|
LOG(INFO) << __func__ << " fd:" << fd << "numArgs:" << numArgs;
|
||||||
|
}
|
||||||
|
|
||||||
|
dprintf(fd, "----- FaceVirtualHal::dump -----\n");
|
||||||
|
std::vector<SensorProps> sps(1);
|
||||||
|
getSensorProps(&sps);
|
||||||
|
for (auto& sp : sps) {
|
||||||
|
::android::base::WriteStringToFd(sp.toString(), fd);
|
||||||
|
}
|
||||||
|
if (mSession != nullptr) {
|
||||||
|
::android::base::WriteStringToFd(mSession->toString(), fd);
|
||||||
|
} else {
|
||||||
|
dprintf(fd, "\nWARNING: no ISession found\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
fsync(fd);
|
||||||
|
return STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
binder_status_t Face::handleShellCommand(int in, int out, int err, const char** args,
|
||||||
|
uint32_t numArgs) {
|
||||||
|
LOG(INFO) << __func__ << " in:" << in << " out:" << out << " err:" << err
|
||||||
|
<< " numArgs:" << numArgs;
|
||||||
|
|
||||||
|
if (numArgs == 0) {
|
||||||
|
LOG(INFO) << __func__ << ": available commands";
|
||||||
|
onHelp(out);
|
||||||
|
return STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto&& str : std::vector<std::string_view>(args, args + numArgs)) {
|
||||||
|
std::string option = str.data();
|
||||||
|
if (option.find("clearconfig") != std::string::npos ||
|
||||||
|
option.find("resetconfig") != std::string::npos) {
|
||||||
|
resetConfigToDefault();
|
||||||
|
}
|
||||||
|
if (option.find("help") != std::string::npos) {
|
||||||
|
onHelp(out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Face::onHelp(int fd) {
|
||||||
|
dprintf(fd, "Virtual Face HAL commands:\n");
|
||||||
|
dprintf(fd, " help: print this help\n");
|
||||||
|
dprintf(fd, " resetconfig: reset all configuration to default\n");
|
||||||
|
dprintf(fd, "\n");
|
||||||
|
fsync(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Face::resetConfigToDefault() {
|
||||||
|
LOG(INFO) << __func__ << ": reset virtual Face HAL configuration to default";
|
||||||
|
#define RESET_CONFIG_O(__NAME__) \
|
||||||
|
if (FaceHalProperties::__NAME__()) FaceHalProperties::__NAME__(std::nullopt)
|
||||||
|
#define RESET_CONFIG_V(__NAME__) \
|
||||||
|
if (!FaceHalProperties::__NAME__().empty()) FaceHalProperties::__NAME__({std::nullopt})
|
||||||
|
|
||||||
|
RESET_CONFIG_O(type);
|
||||||
|
RESET_CONFIG_O(strength);
|
||||||
|
RESET_CONFIG_V(enrollments);
|
||||||
|
RESET_CONFIG_O(enrollment_hit);
|
||||||
|
RESET_CONFIG_V(features);
|
||||||
|
RESET_CONFIG_O(next_enrollment);
|
||||||
|
RESET_CONFIG_O(authenticator_id);
|
||||||
|
RESET_CONFIG_O(challenge);
|
||||||
|
RESET_CONFIG_O(lockout);
|
||||||
|
RESET_CONFIG_O(operation_authenticate_fails);
|
||||||
|
RESET_CONFIG_O(operation_detect_interaction_fails);
|
||||||
|
RESET_CONFIG_O(operation_enroll_fails);
|
||||||
|
RESET_CONFIG_V(operation_authenticate_latency);
|
||||||
|
RESET_CONFIG_V(operation_detect_interaction_latency);
|
||||||
|
RESET_CONFIG_V(operation_enroll_latency);
|
||||||
|
RESET_CONFIG_O(operation_authenticate_duration);
|
||||||
|
RESET_CONFIG_O(operation_authenticate_error);
|
||||||
|
RESET_CONFIG_O(operation_authenticate_acquired);
|
||||||
|
RESET_CONFIG_O(lockout_enable);
|
||||||
|
RESET_CONFIG_O(lockout_timed_enable);
|
||||||
|
RESET_CONFIG_O(lockout_timed_threshold);
|
||||||
|
RESET_CONFIG_O(lockout_timed_duration);
|
||||||
|
RESET_CONFIG_O(lockout_permanent_threshold);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace aidl::android::hardware::biometrics::face
|
} // namespace aidl::android::hardware::biometrics::face
|
||||||
|
|
|
@ -17,16 +17,26 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <aidl/android/hardware/biometrics/face/BnFace.h>
|
#include <aidl/android/hardware/biometrics/face/BnFace.h>
|
||||||
|
#include "Session.h"
|
||||||
|
|
||||||
namespace aidl::android::hardware::biometrics::face {
|
namespace aidl::android::hardware::biometrics::face {
|
||||||
|
|
||||||
class Face : public BnFace {
|
class Face : public BnFace {
|
||||||
public:
|
public:
|
||||||
|
Face() : mSession(nullptr) {}
|
||||||
ndk::ScopedAStatus getSensorProps(std::vector<SensorProps>* _aidl_return) override;
|
ndk::ScopedAStatus getSensorProps(std::vector<SensorProps>* _aidl_return) override;
|
||||||
|
|
||||||
ndk::ScopedAStatus createSession(int32_t sensorId, int32_t userId,
|
ndk::ScopedAStatus createSession(int32_t sensorId, int32_t userId,
|
||||||
const std::shared_ptr<ISessionCallback>& cb,
|
const std::shared_ptr<ISessionCallback>& cb,
|
||||||
std::shared_ptr<ISession>* _aidl_return) override;
|
std::shared_ptr<ISession>* _aidl_return) override;
|
||||||
|
|
||||||
|
binder_status_t dump(int fd, const char** args, uint32_t numArgs);
|
||||||
|
binder_status_t handleShellCommand(int in, int out, int err, const char** argv, uint32_t argc);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<Session> mSession;
|
||||||
|
void resetConfigToDefault();
|
||||||
|
void onHelp(int);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aidl::android::hardware::biometrics::face
|
} // namespace aidl::android::hardware::biometrics::face
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#undef LOG_TAG
|
||||||
#define LOG_TAG "FaceVirtualHalEngine"
|
#define LOG_TAG "FaceVirtualHalEngine"
|
||||||
|
|
||||||
#include "FakeFaceEngine.h"
|
#include "FakeFaceEngine.h"
|
||||||
|
|
|
@ -14,20 +14,38 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#undef LOG_TAG
|
||||||
|
#define LOG_TAG "FaceVirtualHalSession"
|
||||||
|
|
||||||
#include <android-base/logging.h>
|
#include <android-base/logging.h>
|
||||||
|
|
||||||
#include "Session.h"
|
#include "Session.h"
|
||||||
|
|
||||||
#undef LOG_TAG
|
|
||||||
#define LOG_TAG "FaceVirtualHalSession"
|
|
||||||
|
|
||||||
namespace aidl::android::hardware::biometrics::face {
|
namespace aidl::android::hardware::biometrics::face {
|
||||||
|
|
||||||
constexpr size_t MAX_WORKER_QUEUE_SIZE = 5;
|
constexpr size_t MAX_WORKER_QUEUE_SIZE = 5;
|
||||||
|
|
||||||
|
void onClientDeath(void* cookie) {
|
||||||
|
LOG(INFO) << "FaceService has died";
|
||||||
|
Session* session = static_cast<Session*>(cookie);
|
||||||
|
if (session && !session->isClosed()) {
|
||||||
|
session->close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Session::Session(std::unique_ptr<FakeFaceEngine> engine, std::shared_ptr<ISessionCallback> cb)
|
Session::Session(std::unique_ptr<FakeFaceEngine> engine, std::shared_ptr<ISessionCallback> cb)
|
||||||
: mEngine(std::move(engine)), mCb(std::move(cb)), mRandom(std::mt19937::default_seed) {
|
: mEngine(std::move(engine)),
|
||||||
|
mCb(std::move(cb)),
|
||||||
|
mRandom(std::mt19937::default_seed),
|
||||||
|
mStateClosed(false) {
|
||||||
|
CHECK(mEngine);
|
||||||
|
CHECK(mCb);
|
||||||
mThread = std::make_unique<WorkerThread>(MAX_WORKER_QUEUE_SIZE);
|
mThread = std::make_unique<WorkerThread>(MAX_WORKER_QUEUE_SIZE);
|
||||||
|
mDeathRecipient = AIBinder_DeathRecipient_new(onClientDeath);
|
||||||
|
}
|
||||||
|
|
||||||
|
binder_status_t Session::linkToDeath(AIBinder* binder) {
|
||||||
|
return AIBinder_linkToDeath(binder, mDeathRecipient, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
ndk::ScopedAStatus Session::generateChallenge() {
|
ndk::ScopedAStatus Session::generateChallenge() {
|
||||||
|
@ -144,9 +162,12 @@ ndk::ScopedAStatus Session::resetLockout(const keymaster::HardwareAuthToken& hat
|
||||||
}
|
}
|
||||||
|
|
||||||
ndk::ScopedAStatus Session::close() {
|
ndk::ScopedAStatus Session::close() {
|
||||||
|
LOG(INFO) << "close";
|
||||||
if (mCb) {
|
if (mCb) {
|
||||||
mCb->onSessionClosed();
|
mCb->onSessionClosed();
|
||||||
}
|
}
|
||||||
|
AIBinder_DeathRecipient_delete(mDeathRecipient);
|
||||||
|
mStateClosed = true;
|
||||||
return ndk::ScopedAStatus::ok();
|
return ndk::ScopedAStatus::ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,11 @@ namespace keymaster = aidl::android::hardware::keymaster;
|
||||||
|
|
||||||
using aidl::android::hardware::common::NativeHandle;
|
using aidl::android::hardware::common::NativeHandle;
|
||||||
|
|
||||||
|
enum class SessionState {
|
||||||
|
IDLING,
|
||||||
|
CLOSED,
|
||||||
|
};
|
||||||
|
|
||||||
class Session : public BnSession {
|
class Session : public BnSession {
|
||||||
public:
|
public:
|
||||||
explicit Session(std::unique_ptr<FakeFaceEngine> engine, std::shared_ptr<ISessionCallback> cb);
|
explicit Session(std::unique_ptr<FakeFaceEngine> engine, std::shared_ptr<ISessionCallback> cb);
|
||||||
|
@ -93,12 +98,28 @@ class Session : public BnSession {
|
||||||
const FaceEnrollOptions& options,
|
const FaceEnrollOptions& options,
|
||||||
std::shared_ptr<common::ICancellationSignal>* out) override;
|
std::shared_ptr<common::ICancellationSignal>* out) override;
|
||||||
|
|
||||||
|
binder_status_t linkToDeath(AIBinder* binder);
|
||||||
|
|
||||||
|
virtual std::string toString() const {
|
||||||
|
std::ostringstream os;
|
||||||
|
os << std::endl << "----- Face::Session:: -----" << std::endl;
|
||||||
|
os << "mStateClosed:" << mStateClosed << std::endl;
|
||||||
|
os << mEngine->toString();
|
||||||
|
|
||||||
|
return os.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isClosed() { return mStateClosed; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<FakeFaceEngine> mEngine;
|
std::unique_ptr<FakeFaceEngine> mEngine;
|
||||||
std::shared_ptr<ISessionCallback> mCb;
|
std::shared_ptr<ISessionCallback> mCb;
|
||||||
std::mt19937 mRandom;
|
std::mt19937 mRandom;
|
||||||
std::unique_ptr<WorkerThread> mThread;
|
std::unique_ptr<WorkerThread> mThread;
|
||||||
std::shared_ptr<CancellationSignal> mCancellationSignal;
|
|
||||||
|
// Binder death handler.
|
||||||
|
AIBinder_DeathRecipient* mDeathRecipient;
|
||||||
|
bool mStateClosed;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace aidl::android::hardware::biometrics::face
|
} // namespace aidl::android::hardware::biometrics::face
|
||||||
|
|
Loading…
Reference in a new issue