From daa0123f7f41c536e10744b319e2e8a11a82c6b8 Mon Sep 17 00:00:00 2001 From: slava Date: Thu, 7 May 2026 23:09:56 +0700 Subject: [PATCH] Refine sum field detection logic in `findSumEditText` to account for an additional EditText above the anchor. --- android/dushanbe/ScreenXmlParser.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/android/dushanbe/ScreenXmlParser.cpp b/android/dushanbe/ScreenXmlParser.cpp index 0f121e0..b15eaee 100644 --- a/android/dushanbe/ScreenXmlParser.cpp +++ b/android/dushanbe/ScreenXmlParser.cpp @@ -527,7 +527,9 @@ Node ScreenXmlParser::findEditTextByHint(const QString &hint) { } Node ScreenXmlParser::findSumEditText() { - // Якорь: View "Мин. сумма: ..." расположен сразу под полем суммы. + // Якорь: View "Мин. сумма: ..." расположен под полем "Комментарий", + // которое следует за полем суммы. То есть над якорем два EditText'а: + // ближайший = "Комментарий", следующий вверх = "Сумма". Node anchor; for (const Node &node : m_nodes) { if (node.contentDesc.contains(QString::fromUtf8("Мин. сумма"))) { @@ -537,14 +539,20 @@ Node ScreenXmlParser::findSumEditText() { } if (anchor.x1() < 0) return {}; - // Ближайший EditText, который заканчивается выше якоря. - Node best; + QList aboveAnchor; for (const Node &node : m_nodes) { if (node.className != "android.widget.EditText") continue; if (node.y2() > anchor.y1()) continue; - if (best.x1() < 0 || node.y2() > best.y2()) best = node; + aboveAnchor.append(node); } - return best; + // Сортируем по нижней границе по убыванию: [0] — ближайший (Комментарий), + // [1] — следующий выше (Сумма). + std::sort(aboveAnchor.begin(), aboveAnchor.end(), + [](const Node &a, const Node &b) { return a.y2() > b.y2(); }); + + if (aboveAnchor.size() >= 2) return aboveAnchor[1]; + if (aboveAnchor.size() == 1) return aboveAnchor[0]; // нестандартная разметка + return {}; } Node ScreenXmlParser::tryToFindSystemPermissionDenyButton() {