From 01f8801a7305eff3e2d7bf59b5bcb02c8f5e9e9b Mon Sep 17 00:00:00 2001 From: slava Date: Sat, 21 Mar 2026 18:41:02 +0700 Subject: [PATCH] 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. --- android/ozon/ScreenXmlParser.cpp | 40 +++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/android/ozon/ScreenXmlParser.cpp b/android/ozon/ScreenXmlParser.cpp index 0c71a85..9d91bc9 100644 --- a/android/ozon/ScreenXmlParser.cpp +++ b/android/ozon/ScreenXmlParser.cpp @@ -397,6 +397,7 @@ QString ScreenXmlParser::parseProfilePhone() { } QList ScreenXmlParser::findPinCodeNodes(const QString &pinCode) { + const QString cleanPin = QString(pinCode).remove(' '); // Способ 1: ищем кликабельные ноды с текстом-цифрой (0-9) // Поддерживаем форматы: "1", "key 1", и т.п. QMap digitMap; @@ -409,9 +410,11 @@ QList ScreenXmlParser::findPinCodeNodes(const QString &pinCode) { } } + qDebug() << "[findPinCodeNodes] digitMap size:" << digitMap.size() + << "keys:" << digitMap.keys(); if (digitMap.size() >= 10) { QList 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 ScreenXmlParser::findPinCodeNodes(const QString &pinCode) { QList 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 ScreenXmlParser::findPinCodeNodes(const QString &pinCode) { // Сначала квадратные, потом любые QList 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 ScreenXmlParser::findPinCodeNodes(const QString &pinCode) { }); } - QList> gridRows; + // Строки по 3 — основные ряды (1-9), строки по 1-3 в конце — ряд с "0" + QList> fullRows; // строки по 3 кнопки + QList> shortRows; // строки с 1-2 кнопками (последний ряд) for (const QList &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 result; - for (const QChar &c : pinCode) { + for (const QChar &c : cleanPin) { if (const QString d = QString(c); digitMap.contains(d)) { result.append(digitMap[d]); }