1
0
forked from BRT/arc
arc/android/dushanbe/AppVersionTrack.h

88 lines
5.9 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <QString>
#include <QVersionNumber>
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