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