1
0
forked from BRT/arc

Refactor findPinCodeNodes in ScreenXmlParser for improved PIN handling and grid detection

Optimized PIN processing by trimming spaces from input to support flexible PIN formats. Enhanced grid detection logic by introducing distinct handling for full and short rows, refining the "0" digit node assignment. Updated size thresholds for better fallback support and added debug outputs for enhanced troubleshooting.
This commit is contained in:
slava 2026-03-21 18:41:02 +07:00
parent cefad834c7
commit 01f8801a73

View File

@ -397,6 +397,7 @@ QString ScreenXmlParser::parseProfilePhone() {
} }
QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) { QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
const QString cleanPin = QString(pinCode).remove(' ');
// Способ 1: ищем кликабельные ноды с текстом-цифрой (0-9) // Способ 1: ищем кликабельные ноды с текстом-цифрой (0-9)
// Поддерживаем форматы: "1", "key 1", и т.п. // Поддерживаем форматы: "1", "key 1", и т.п.
QMap<QString, Node> digitMap; QMap<QString, Node> digitMap;
@ -409,9 +410,11 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
} }
} }
qDebug() << "[findPinCodeNodes] digitMap size:" << digitMap.size()
<< "keys:" << digitMap.keys();
if (digitMap.size() >= 10) { if (digitMap.size() >= 10) {
QList<Node> result; QList<Node> result;
for (const QChar &c : pinCode) { for (const QChar &c : cleanPin) {
const QString d = QString(c); const QString d = QString(c);
if (digitMap.contains(d)) { if (digitMap.contains(d)) {
result.append(digitMap[d]); result.append(digitMap[d]);
@ -459,7 +462,7 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
QList<Node> best; QList<Node> best;
for (const auto &grp : groups) { for (const auto &grp : groups) {
if (grp.size() >= 12 && (best.size() < 12 || grp.size() < best.size())) if (grp.size() >= 10 && (best.size() < 10 || grp.size() < best.size()))
best = grp; best = grp;
} }
return best; return best;
@ -467,10 +470,10 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
// Сначала квадратные, потом любые // Сначала квадратные, потом любые
QList<Node> candidates = fuzzyGroup(true); QList<Node> candidates = fuzzyGroup(true);
if (candidates.size() < 12) if (candidates.size() < 10)
candidates = fuzzyGroup(false); candidates = fuzzyGroup(false);
if (candidates.size() < 12) { if (candidates.size() < 10) {
// Дебаг: выводим все clickable ноды и их размеры // Дебаг: выводим все clickable ноды и их размеры
qWarning() << "[findPinCodeNodes] grid not found. Total clickable nodes:" << allClickable.size(); qWarning() << "[findPinCodeNodes] grid not found. Total clickable nodes:" << allClickable.size();
for (const Node &n : allClickable) { for (const Node &n : allClickable) {
@ -506,30 +509,41 @@ QList<Node> ScreenXmlParser::findPinCodeNodes(const QString &pinCode) {
}); });
} }
QList<QList<Node>> gridRows; // Строки по 3 — основные ряды (1-9), строки по 1-3 в конце — ряд с "0"
QList<QList<Node>> fullRows; // строки по 3 кнопки
QList<QList<Node>> shortRows; // строки с 1-2 кнопками (последний ряд)
for (const QList<Node> &row : rows) { for (const QList<Node> &row : rows) {
if (row.size() == 3) gridRows.append(row); if (row.size() == 3) fullRows.append(row);
else if (row.size() >= 1 && row.size() <= 2) shortRows.append(row);
} }
if (gridRows.size() < 4) { if (fullRows.size() < 3) {
qWarning() << "[findPinCodeNodes] grid not found: gridRows=" << gridRows.size() qWarning() << "[findPinCodeNodes] grid not found: fullRows=" << fullRows.size()
<< "candidates=" << candidates.size(); << "candidates=" << candidates.size();
return {}; return {};
} }
const QStringList digits19 = {"1", "2", "3", "4", "5", "6", "7", "8", "9"}; const QStringList digits19 = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
int idx = 0; int idx = 0;
for (int r = 0; r < gridRows.size() - 1 && idx < digits19.size(); ++r) { for (int r = 0; r < fullRows.size() && idx < digits19.size(); ++r) {
for (const Node &n : gridRows[r]) { for (const Node &n : fullRows[r]) {
if (idx < digits19.size()) digitMap[digits19[idx++]] = n; if (idx < digits19.size()) digitMap[digits19[idx++]] = n;
} }
} }
if (gridRows.last().size() >= 2) { // "0" — в последнем ряду: если 3 кнопки — средняя, если 1 — единственная
digitMap["0"] = gridRows.last()[1]; if (!shortRows.isEmpty()) {
const auto &lastRow = shortRows.last();
if (lastRow.size() >= 2)
digitMap["0"] = lastRow[1]; // средняя кнопка
else
digitMap["0"] = lastRow[0]; // единственная кнопка
} else if (fullRows.size() >= 4) {
// fallback: "0" — средняя кнопка последнего полного ряда
digitMap["0"] = fullRows.last()[1];
} }
QList<Node> result; QList<Node> result;
for (const QChar &c : pinCode) { for (const QChar &c : cleanPin) {
if (const QString d = QString(c); digitMap.contains(d)) { if (const QString d = QString(c); digitMap.contains(d)) {
result.append(digitMap[d]); result.append(digitMap[d]);
} }