diff --git a/android/dushanbe/GetProfileInfoScript.cpp b/android/dushanbe/GetProfileInfoScript.cpp index e28d2ab..7548ea9 100644 --- a/android/dushanbe/GetProfileInfoScript.cpp +++ b/android/dushanbe/GetProfileInfoScript.cpp @@ -50,12 +50,30 @@ void GetProfileInfoScript::doStart() { xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter)); } - // Парсим баланс с домашнего экрана - const double parsedBalance = xmlScreenParser.parseBalanceFromHomeScreen(); + // Парсим баланс с домашнего экрана. Если баланс не подгрузился (==0), + // тапаем кнопку обновления и перечитываем дамп. Лоадера у refresh нет, + // поэтому ждём фиксированно. + double parsedBalance = xmlScreenParser.parseBalanceFromHomeScreen(); qDebug() << "[Dushanbe::GetProfileInfo] Parsed balance:" << parsedBalance; - if (parsedBalance > 0.0) { - BankProfileDAO::updateAmount(app.id, parsedBalance); + if (parsedBalance <= 0.0) { + Node refreshBtn = xmlScreenParser.findRefreshButtonOnHomeScreen(); + if (refreshBtn.x() > 0) { + qDebug() << "[Dushanbe::GetProfileInfo] Balance is 0, tapping refresh and retrying"; + AdbUtils::makeTap(m_deviceId, refreshBtn.x(), refreshBtn.y()); + QThread::msleep(3000); + xmlScreenParser.parseAndSaveXml(AdbUtils::getScreenDumpAsXml(m_deviceId, ++m_counter)); + parsedBalance = xmlScreenParser.parseBalanceFromHomeScreen(); + qDebug() << "[Dushanbe::GetProfileInfo] Parsed balance after refresh:" << parsedBalance; + } + if (parsedBalance <= 0.0) { + m_error = "Balance is zero after refresh: " + m_deviceId + " " + m_appCode; + qWarning() << m_error; + AdbUtils::tryToKillApplication(m_deviceId, app.package); + emit finishedWithResult(m_error); + return; + } } + BankProfileDAO::updateAmount(app.id, parsedBalance); // Тапаем по кнопке меню (гамбургер, левый верхний угол) // Это первый clickable ImageView в верхней панели diff --git a/android/dushanbe/ScreenXmlParser.cpp b/android/dushanbe/ScreenXmlParser.cpp index 2338c94..c16c6d5 100644 --- a/android/dushanbe/ScreenXmlParser.cpp +++ b/android/dushanbe/ScreenXmlParser.cpp @@ -212,6 +212,33 @@ QString ScreenXmlParser::parseUserNameFromHomeScreen() { return {}; } +Node ScreenXmlParser::findRefreshButtonOnHomeScreen() { + // В блоке content-desc="TJS\n<дата>" три clickable дочерних элемента: + // View с балансом, Button (глазик) и ImageView (рефреш). Тапать нужно + // именно ImageView — он правее глазика и единственный ImageView внутри + // bounds parent'а. + Node parent; + for (const Node &node : m_nodes) { + if (node.contentDesc.startsWith("TJS") && node.contentDesc.contains('\n')) { + parent = node; + break; + } + } + if (parent.x1() < 0) return {}; + + Node best; + for (const Node &node : m_nodes) { + if (!node.clickable) continue; + if (node.className != "android.widget.ImageView") continue; + if (node.x1() < parent.x1() || node.x2() > parent.x2()) continue; + if (node.y1() < parent.y1() || node.y2() > parent.y2()) continue; + if (best.x1() < 0 || node.x1() > best.x1()) { + best = node; + } + } + return best; +} + bool ScreenXmlParser::isSideMenu() { bool hasVyhod = false; bool hasIdentified = false; diff --git a/android/dushanbe/ScreenXmlParser.h b/android/dushanbe/ScreenXmlParser.h index 7f26299..771aa94 100644 --- a/android/dushanbe/ScreenXmlParser.h +++ b/android/dushanbe/ScreenXmlParser.h @@ -39,6 +39,10 @@ public: // Парсит баланс с домашнего экрана double parseBalanceFromHomeScreen(); + // Находит кнопку обновления данных в блоке "TJS\n<дата>" — правый clickable + // ImageView (рядом слева сидит глазик-Button, его не трогаем). + Node findRefreshButtonOnHomeScreen(); + // Парсит имя пользователя с домашнего экрана QString parseUserNameFromHomeScreen(); diff --git a/tests/mock_server/default_profile.json b/tests/mock_server/default_profile.json index fe17381..39a5514 100644 --- a/tests/mock_server/default_profile.json +++ b/tests/mock_server/default_profile.json @@ -1,5 +1,25 @@ { "bank_profiles": [ + { + "id": "047fd3d6-f2a2-40e0-9a39-1d11422e8832", + "bank_name": "dushanbe_city_bank", + "state": "enabled", + "phone_number": "+992185555519", + "first_name": "Мехрубон", + "middle_name": null, + "last_name": "Имомкулзода", + "currency": 972, + "device_id": "986cb259-dfec-4421-8735-4fb126cd1917", + "device_label": "Pixel 7", + "materials": [ + { + "id": "83606831-7688-42cf-b2d7-2034e04f68f2", + "state": "enabled", + "card_number": "9762000207113258", + "currency": 972 + } + ] + }, { "id": "21aa26c8-ea89-45ea-a283-ee6d55ead82b", "bank_name": "ozon",