#pragma once #include #include namespace Dushanbe { // «Трек» формата UI приложения Dushanbe City Bank. Экранные дампы и порядок // нод в content-desc менялись между версиями приложения; трек — это // нормализованный ярлык версии, по которому код выбирает версионно-зависимую // ветку парсинга (см. ScreenXmlParser::setVersionTrack). // // На момент введения каркаса форматы 3.2.33 и 3.2.38 практически идентичны, // поэтому отдельных веток ещё нет — трек служит явным швом для будущих // расхождений и читаемым маркером в логах/дампах. // // ───────────────────────────────────────────────────────────────────────── // КАК ДОБАВЛЯТЬ НОВУЮ ВЕРСИЮ ПРИЛОЖЕНИЯ // ───────────────────────────────────────────────────────────────────────── // Отдельные скрипты на каждую версию НЕ нужны — по умолчанию все версии // обслуживает один общий комплект скриптов. Выбирайте по объёму изменений: // // 1) Формат экранов не изменился (типичный апдейт банка — косметика, // переименование полей в той же структуре). // → НИЧЕГО не делаем. Новая версия новее последнего порога и автоматически // трактуется как новейший трек (см. trackForVersion). Можно опционально // завести эталонные дампы в assets/dushanbe/<версия>/ для сверки. // // 2) Изменился один-два экрана. // → Добавляем новый элемент в enum (например V3_2_45) и НОВЫЙ порог в // trackForVersion(). Затем в методе, который парсит изменившийся экран, // ставим точечную ветку: // if (m_track >= AppVersionTrack::V3_2_45) { …новый формат… } // else { …существующий… } // Скрипты остаются ОБЩИМИ. Старые ветки (Legacy/3.2.33) не удаляем — // на устройствах в поле могут оставаться старые версии. // Версионно-зависимые точки сегодня: ScreenXmlParser (профиль/боковое // меню, label-value пары), GetLastTransactionsScript (детали транзакции), // PayBy{Card,Phone}Script (чек «Платеж выполнен»). // // 3) Версия разошлась радикально (другой флоу, другие экраны почти везде) — // КРАЙНИЙ случай. // → Только тогда выносим версию в отдельный класс скрипта и выбираем его // по треку в EventHandler::startThreadForTask(). Точка ветвления по // версии уже есть (app.appVersion → trackForVersion), переход дешёвый. // // Значения enum упорядочены по возрастанию версии — можно сравнивать через // <, <=, >, >= (например `m_track >= V3_2_38`). enum class AppVersionTrack { Legacy, // < 3.2.33 — старый blob-формат (один content-desc с "Версия:"/"Сборка:") V3_2_33, // 3.2.33 .. < 3.2.38 V3_2_38, // >= 3.2.38 (и новейший по умолчанию) }; // Резолвит трек из строки версии (например "3.2.38", полученной через // AdbUtils::getAppVersion → BankProfileInfo.appVersion). Сравнение — // через QVersionNumber, а не лексикографически по строке. // // Неизвестная/непарсящаяся версия, а также любая версия новее последнего // известного порога, трактуется как новейший известный трек (V3_2_38): свежие // апдейты по умолчанию должны идти по последнему формату, а не падать на Legacy. inline AppVersionTrack trackForVersion(const QString &appVersion) { static const QVersionNumber kV3_2_33(3, 2, 33); static const QVersionNumber kV3_2_38(3, 2, 38); qsizetype suffixIndex = 0; const QVersionNumber v = QVersionNumber::fromString(appVersion.trimmed(), &suffixIndex); if (v.isNull()) { // Не смогли распарсить — считаем новейшим известным форматом. return AppVersionTrack::V3_2_38; } if (v < kV3_2_33) return AppVersionTrack::Legacy; if (v < kV3_2_38) return AppVersionTrack::V3_2_33; return AppVersionTrack::V3_2_38; } // Человекочитаемое имя трека для логов. inline const char *trackName(AppVersionTrack track) { switch (track) { case AppVersionTrack::Legacy: return "Legacy(<3.2.33)"; case AppVersionTrack::V3_2_33: return "3.2.33"; case AppVersionTrack::V3_2_38: return "3.2.38"; } return "unknown"; } } // namespace Dushanbe