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]); }