Skip to content

Commit fef5e95

Browse files
committed
fix: fingerprint enrollment dialog becomes unresponsive after losing focus
Root cause: It's a timing/race condition. After stopEnroll(), Claim(false) was called immediately, causing DA to release the fingerprint device. However, the EnrollStatus state update from DA arrives after the device is released. Since the device is already released, DA discards the pending state change and does not emit the signal. As a result, the control center never receives the state update, leaving the UI stuck in Processing state with no error message or retry option. Changes: 1. Move Claim(false) from stopFingerEnroll() to signal handlers (onFingerEnrollFailed, onFingerEnrollCompleted, onFingerEnrollDisconnected), ensuring it is called only after DA's state change signal is received 2. Add releaseFingerClaim() to CharaMangerWorker for device claim release after enrollment ends 3. Add Suspended state to represent enrollment interrupted by focus loss, showing grayed icon and retry option 4. Reset addStage to StartState when dialog is closed fix: 指纹录入界面失去焦点后不可操作 问题根因: 这是一个时序/竞态条件问题。stopEnroll() 之后立即调用了 Claim(false), 导致 DA 立即释放指纹设备。但 DA 的 EnrollStatus 状态更新比设备释放 晚到达,由于设备已释放,DA 丢弃了该状态变更,不会发出状态变更信号。 因此控制中心收不到 DA 的状态更新,界面停留在 Processing 状态,没有 错误信息也没有重试选项。 修改内容: 1. 将 Claim(false) 从 stopFingerEnroll() 移至信号回调 (onFingerEnrollFailed、onFingerEnrollCompleted、 onFingerEnrollDisconnected) 中,确保在收到 DA 状态变更信号后 才释放设备声明 2. 新增 releaseFingerClaim() 方法,在录入结束后释放设备声明 3. 新增 Suspended 状态表示焦点中断的录入,显示置灰图标和重试选项 4. 关闭对话框时重置 addStage 为 StartState PMS: BUG-364881
1 parent b033073 commit fef5e95

3 files changed

Lines changed: 10 additions & 2 deletions

File tree

src/plugin-authentication/operation/charamangerworker.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
//SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd.
22
//
33
//SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -377,6 +377,10 @@ void CharaMangerWorker::stopFingerEnroll(const QString &userName)
377377
{
378378
qDebug() << "stopEnroll";
379379
m_charaMangerInter->StopEnroll();
380+
}
381+
382+
void CharaMangerWorker::releaseFingerClaim(const QString &userName)
383+
{
380384
auto callClaim = m_charaMangerInter->Claim(userName, false);
381385
callClaim.waitForFinished();
382386
if (callClaim.isError()) {

src/plugin-authentication/operation/charamangerworker.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
//SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
1+
//SPDX-FileCopyrightText: 2026 UnionTech Software Technology Co., Ltd.
22
//
33
//SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -79,6 +79,7 @@ public Q_SLOTS:
7979
void tryEnroll(const QString &name, const QString &thumb);
8080
void refreshFingerEnrollList(const QString &id);
8181
void stopFingerEnroll(const QString& userName);
82+
void releaseFingerClaim(const QString& userName);
8283
void deleteFingerItem(const QString& userName, const QString& finger);
8384
void renameFingerItem(const QString& userName, const QString& finger, const QString& newName);
8485
void onDefaultDeviceChanged(const QString &device);

src/plugin-authentication/operation/fingerprintauthcontroller.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ void FingerprintAuthController::onFingerEnrollFailed(const QString &title, const
161161
setAddStage(CharaMangerModel::Fail);
162162
emit fingerTipsChanged();
163163
stopEnroll();
164+
m_worker->releaseFingerClaim(m_model->userName());
164165
}
165166

166167
void FingerprintAuthController::onFingerEnrollCompleted()
@@ -169,6 +170,7 @@ void FingerprintAuthController::onFingerEnrollCompleted()
169170
setAddStage(CharaMangerModel::Success);
170171
emit enrollCompleted();
171172
stopEnroll();
173+
m_worker->releaseFingerClaim(m_model->userName());
172174
}
173175

174176
void FingerprintAuthController::onFingerEnrollDisconnected()
@@ -178,6 +180,7 @@ void FingerprintAuthController::onFingerEnrollDisconnected()
178180
setAddStage(CharaMangerModel::Fail);
179181
emit fingerTipsChanged();
180182
stopEnroll();
183+
m_worker->releaseFingerClaim(m_model->userName());
181184
}
182185

183186
void FingerprintAuthController::onFingerLiftTimerTimeout()

0 commit comments

Comments
 (0)