Expand AppVersionTrack documentation with guidelines for adding new app versions.
@ -755,6 +755,43 @@ QString AdbUtils::getAppVersion(const QString &deviceId, const QString &packageN
|
|||||||
return m.hasMatch() ? m.captured(1).trimmed() : QString();
|
return m.hasMatch() ? m.captured(1).trimmed() : QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Достаёт имя пакета из строки фокуса вида "... u0 com.bank.app/.MainActivity ...".
|
||||||
|
static QString packageFromFocusLine(const QString &out, const QString &marker) {
|
||||||
|
const qsizetype idx = out.indexOf(marker);
|
||||||
|
if (idx < 0) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
const qsizetype end = out.indexOf(QChar('\n'), idx);
|
||||||
|
const QString line = out.mid(idx, end < 0 ? -1 : end - idx);
|
||||||
|
static const QRegularExpression rePkg(R"(\bu0\s+([A-Za-z0-9_.]+)/)");
|
||||||
|
const QRegularExpressionMatch m = rePkg.match(line);
|
||||||
|
return m.hasMatch() ? m.captured(1) : QString();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString AdbUtils::getForegroundPackage(const QString &deviceId) {
|
||||||
|
if (deviceId.isEmpty()) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
// mResumedActivity — реально активная (foreground) активность.
|
||||||
|
QString out;
|
||||||
|
if (startProcess(adbPath(),
|
||||||
|
{"-s", deviceId, "shell", "dumpsys", "activity", "activities"}, &out)) {
|
||||||
|
const QString pkg = packageFromFocusLine(out, "mResumedActivity");
|
||||||
|
if (!pkg.isEmpty()) {
|
||||||
|
return pkg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fallback: mCurrentFocus из dumpsys window (формат отличается между версиями Android).
|
||||||
|
out.clear();
|
||||||
|
if (startProcess(adbPath(), {"-s", deviceId, "shell", "dumpsys", "window"}, &out)) {
|
||||||
|
const QString pkg = packageFromFocusLine(out, "mCurrentFocus");
|
||||||
|
if (!pkg.isEmpty()) {
|
||||||
|
return pkg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
void AdbUtils::unlockScreen(const QString &deviceId, const int screenWidth, const int screenHeight) {
|
void AdbUtils::unlockScreen(const QString &deviceId, const int screenWidth, const int screenHeight) {
|
||||||
const QString adb = adbPath();
|
const QString adb = adbPath();
|
||||||
|
|
||||||
|
|||||||
@ -59,6 +59,9 @@ public:
|
|||||||
// Возвращает versionName установленного пакета (напр. "19.17.0"), либо пустую строку при ошибке/отсутствии
|
// Возвращает versionName установленного пакета (напр. "19.17.0"), либо пустую строку при ошибке/отсутствии
|
||||||
static QString getAppVersion(const QString &deviceId, const QString &packageName);
|
static QString getAppVersion(const QString &deviceId, const QString &packageName);
|
||||||
|
|
||||||
|
// Возвращает пакет приложения на переднем плане (foreground), либо пустую строку при ошибке
|
||||||
|
static QString getForegroundPackage(const QString &deviceId);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static QString adbDir();
|
static QString adbDir();
|
||||||
static bool startProcess(const QString &program, const QStringList &args,
|
static bool startProcess(const QString &program, const QStringList &args,
|
||||||
|
|||||||
1
assets/dushanbe/3.2.39/card_detail.xml
Normal file
1
assets/dushanbe/3.2.39/card_transfer_confirm.xml
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><hierarchy rotation="0"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1600]"><node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.widget.Button" package="tj.dc.next1" content-desc="Подтверждение платежа 1.00 TJS Поставщик: DC (по номеру карты) Номер/Счет 9762000186263942 Способ оплаты: 9762 **** **** 5947 Сумма зачисления: 1.00 TJS Комиссия: 0.00 TJS Сумма списания: 1.00 TJS Подтверждаю" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]" /></node></node></node><node index="1" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="Закрыть" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]" /></node></node></node></node></node></node><node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,1504][720,1600]" /></node></hierarchy>
|
||||||
1
assets/dushanbe/3.2.39/card_transfer_input.xml
Normal file
1
assets/dushanbe/3.2.39/card_transfer_success.xml
Normal file
1
assets/dushanbe/3.2.39/card_transfer_tx_detail.xml
Normal file
1
assets/dushanbe/3.2.39/cards_screen.xml
Normal file
1
assets/dushanbe/3.2.39/history_screen.xml
Normal file
1
assets/dushanbe/3.2.39/home_screen.xml
Normal file
BIN
assets/dushanbe/3.2.39/phone_transfer_confirm.jpg
Normal file
|
After Width: | Height: | Size: 109 KiB |
1
assets/dushanbe/3.2.39/phone_transfer_confirm.xml
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><hierarchy rotation="0"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1600]"><node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.widget.Button" package="tj.dc.next1" content-desc="Подтверждение платежа 1.00 TJS Поставщик: DC (по номеру телефона) Номер/Счет 559411001 Способ оплаты: 9762 **** **** 5947 Сумма зачисления: 1.00 TJS Комиссия: 0.00 TJS Сумма списания: 1.00 TJS Подтверждаю" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]" /></node></node></node><node index="1" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="Закрыть" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1504]" /></node></node></node></node></node></node><node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,1504][720,1600]" /></node></hierarchy>
|
||||||
BIN
assets/dushanbe/3.2.39/phone_transfer_input.jpg
Normal file
|
After Width: | Height: | Size: 182 KiB |
1
assets/dushanbe/3.2.39/phone_transfer_input.xml
Normal file
BIN
assets/dushanbe/3.2.39/side_menu.jpg
Normal file
|
After Width: | Height: | Size: 252 KiB |
1
assets/dushanbe/3.2.39/side_menu.xml
Normal file
BIN
assets/dushanbe/3.2.39/statement_screen.jpg
Normal file
|
After Width: | Height: | Size: 183 KiB |
1
assets/dushanbe/3.2.39/statement_screen.xml
Normal file
1
assets/dushanbe/3.2.41/card_detail.xml
Normal file
1
assets/dushanbe/3.2.41/card_transfer_confirm.xml
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><hierarchy rotation="0"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.widget.Button" package="tj.dc.next1" content-desc="Подтверждение платежа 1.00 TJS Поставщик: DC (по номеру карты) Номер/Счет 9762000186263942 Способ оплаты: 9762 **** **** 9536 Сумма зачисления: 1.00 TJS Комиссия: 0.00 TJS Сумма списания: 1.00 TJS Подтверждаю" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]" /></node></node></node><node index="1" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="Закрыть" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]" /></node></node></node></node></node></node><node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,1544][720,1640]" /></node></hierarchy>
|
||||||
1
assets/dushanbe/3.2.41/card_transfer_input.xml
Normal file
1
assets/dushanbe/3.2.41/card_transfer_success.xml
Normal file
1
assets/dushanbe/3.2.41/card_transfer_tx_detail.xml
Normal file
1
assets/dushanbe/3.2.41/cards_screen.xml
Normal file
1
assets/dushanbe/3.2.41/history_screen.xml
Normal file
1
assets/dushanbe/3.2.41/home_screen.xml
Normal file
BIN
assets/dushanbe/3.2.41/phone_transfer_confirm.jpg
Normal file
|
After Width: | Height: | Size: 112 KiB |
1
assets/dushanbe/3.2.41/phone_transfer_confirm.xml
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><hierarchy rotation="0"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.widget.LinearLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="android:id/content" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="true" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.widget.Button" package="tj.dc.next1" content-desc="Подтверждение платежа 1.00 TJS Поставщик: DC (по номеру телефона) Номер/Счет 559411001 Способ оплаты: 9762 **** **** 9536 Сумма зачисления: 1.00 TJS Комиссия: 0.00 TJS Сумма списания: 1.00 TJS Подтверждаю" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="true" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]"><node index="0" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]" /></node></node></node><node index="1" text="" resource-id="" class="android.view.View" package="tj.dc.next1" content-desc="Закрыть" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,0][720,1640]" /></node></node></node></node></node></node><node index="1" text="" resource-id="android:id/navigationBarBackground" class="android.view.View" package="tj.dc.next1" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[0,1544][720,1640]" /></node></hierarchy>
|
||||||
BIN
assets/dushanbe/3.2.41/phone_transfer_input.jpg
Normal file
|
After Width: | Height: | Size: 177 KiB |
1
assets/dushanbe/3.2.41/phone_transfer_input.xml
Normal file
BIN
assets/dushanbe/3.2.41/phone_transfer_success.jpg
Normal file
|
After Width: | Height: | Size: 91 KiB |
1
assets/dushanbe/3.2.41/phone_transfer_success.xml
Normal file
BIN
assets/dushanbe/3.2.41/side_menu.jpg
Normal file
|
After Width: | Height: | Size: 256 KiB |
1
assets/dushanbe/3.2.41/side_menu.xml
Normal file
BIN
assets/dushanbe/3.2.41/statement_screen.jpg
Normal file
|
After Width: | Height: | Size: 193 KiB |
1
assets/dushanbe/3.2.41/statement_screen.xml
Normal file
@ -462,7 +462,7 @@ DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(p
|
|||||||
|
|
||||||
// ADB-захват блокирует поток на несколько секунд — выносим в воркер,
|
// ADB-захват блокирует поток на несколько секунд — выносим в воркер,
|
||||||
// чтобы прогресс-диалог не замораживался.
|
// чтобы прогресс-диалог не замораживался.
|
||||||
struct DumpData { QByteArray screenshot; QString xml; };
|
struct DumpData { QByteArray screenshot; QString xml; QString appVersion; };
|
||||||
auto *data = new DumpData;
|
auto *data = new DumpData;
|
||||||
auto *worker = QThread::create([data, adbSerial]() {
|
auto *worker = QThread::create([data, adbSerial]() {
|
||||||
qDebug() << "[Dump] worker: capturing screenshot";
|
qDebug() << "[Dump] worker: capturing screenshot";
|
||||||
@ -471,6 +471,13 @@ DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(p
|
|||||||
qDebug() << "[Dump] worker: capturing xml";
|
qDebug() << "[Dump] worker: capturing xml";
|
||||||
data->xml = AdbUtils::getRawScreenDumpAsXml(adbSerial);
|
data->xml = AdbUtils::getRawScreenDumpAsXml(adbSerial);
|
||||||
qDebug() << "[Dump] worker: xml size=" << data->xml.size();
|
qDebug() << "[Dump] worker: xml size=" << data->xml.size();
|
||||||
|
// Версия приложения на переднем плане — ровно того, чей экран дампим.
|
||||||
|
const QString fgPkg = AdbUtils::getForegroundPackage(adbSerial);
|
||||||
|
data->appVersion = fgPkg.isEmpty()
|
||||||
|
? QString()
|
||||||
|
: AdbUtils::getAppVersion(adbSerial, fgPkg);
|
||||||
|
qDebug() << "[Dump] worker: fgPkg=" << fgPkg
|
||||||
|
<< "appVersion=" << data->appVersion;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Общий флаг "уже обработано" — чтобы страховочный таймаут не сработал
|
// Общий флаг "уже обработано" — чтобы страховочный таймаут не сработал
|
||||||
@ -525,6 +532,7 @@ DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(p
|
|||||||
|
|
||||||
const QByteArray screenshot = data->screenshot;
|
const QByteArray screenshot = data->screenshot;
|
||||||
const QString xml = data->xml;
|
const QString xml = data->xml;
|
||||||
|
const QString appVersion = data->appVersion;
|
||||||
delete data;
|
delete data;
|
||||||
worker->deleteLater();
|
worker->deleteLater();
|
||||||
|
|
||||||
@ -552,6 +560,14 @@ DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(p
|
|||||||
textPart.setBody(text.toUtf8());
|
textPart.setBody(text.toUtf8());
|
||||||
mp->append(textPart);
|
mp->append(textPart);
|
||||||
|
|
||||||
|
if (!appVersion.isEmpty()) {
|
||||||
|
QHttpPart verPart;
|
||||||
|
verPart.setHeader(QNetworkRequest::ContentDispositionHeader,
|
||||||
|
R"(form-data; name="app_version")");
|
||||||
|
verPart.setBody(appVersion.toUtf8());
|
||||||
|
mp->append(verPart);
|
||||||
|
}
|
||||||
|
|
||||||
if (!xml.isEmpty()) {
|
if (!xml.isEmpty()) {
|
||||||
QString safeName = device.name;
|
QString safeName = device.name;
|
||||||
safeName.replace(QRegularExpression(R"([^\w\-.])"), "_");
|
safeName.replace(QRegularExpression(R"([^\w\-.])"), "_");
|
||||||
|
|||||||