diff --git a/android/adb/AdbUtils.cpp b/android/adb/AdbUtils.cpp
index f8063c3..b22554e 100644
--- a/android/adb/AdbUtils.cpp
+++ b/android/adb/AdbUtils.cpp
@@ -755,6 +755,43 @@ QString AdbUtils::getAppVersion(const QString &deviceId, const QString &packageN
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) {
const QString adb = adbPath();
diff --git a/android/adb/AdbUtils.h b/android/adb/AdbUtils.h
index 154ff6f..52dd923 100644
--- a/android/adb/AdbUtils.h
+++ b/android/adb/AdbUtils.h
@@ -59,6 +59,9 @@ public:
// Возвращает versionName установленного пакета (напр. "19.17.0"), либо пустую строку при ошибке/отсутствии
static QString getAppVersion(const QString &deviceId, const QString &packageName);
+ // Возвращает пакет приложения на переднем плане (foreground), либо пустую строку при ошибке
+ static QString getForegroundPackage(const QString &deviceId);
+
private:
static QString adbDir();
static bool startProcess(const QString &program, const QStringList &args,
diff --git a/assets/dushanbe/3.2.39/card_detail.xml b/assets/dushanbe/3.2.39/card_detail.xml
new file mode 100644
index 0000000..8d4d810
--- /dev/null
+++ b/assets/dushanbe/3.2.39/card_detail.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/card_transfer_confirm.xml b/assets/dushanbe/3.2.39/card_transfer_confirm.xml
new file mode 100644
index 0000000..b33d50f
--- /dev/null
+++ b/assets/dushanbe/3.2.39/card_transfer_confirm.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/card_transfer_input.xml b/assets/dushanbe/3.2.39/card_transfer_input.xml
new file mode 100644
index 0000000..cb6615d
--- /dev/null
+++ b/assets/dushanbe/3.2.39/card_transfer_input.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/card_transfer_success.xml b/assets/dushanbe/3.2.39/card_transfer_success.xml
new file mode 100644
index 0000000..c28a5bc
--- /dev/null
+++ b/assets/dushanbe/3.2.39/card_transfer_success.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/card_transfer_tx_detail.xml b/assets/dushanbe/3.2.39/card_transfer_tx_detail.xml
new file mode 100644
index 0000000..b947dfe
--- /dev/null
+++ b/assets/dushanbe/3.2.39/card_transfer_tx_detail.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/cards_screen.xml b/assets/dushanbe/3.2.39/cards_screen.xml
new file mode 100644
index 0000000..09672d9
--- /dev/null
+++ b/assets/dushanbe/3.2.39/cards_screen.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/history_screen.xml b/assets/dushanbe/3.2.39/history_screen.xml
new file mode 100644
index 0000000..e12754c
--- /dev/null
+++ b/assets/dushanbe/3.2.39/history_screen.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/home_screen.xml b/assets/dushanbe/3.2.39/home_screen.xml
new file mode 100644
index 0000000..2869f98
--- /dev/null
+++ b/assets/dushanbe/3.2.39/home_screen.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/phone_transfer_confirm.jpg b/assets/dushanbe/3.2.39/phone_transfer_confirm.jpg
new file mode 100644
index 0000000..1a7b112
Binary files /dev/null and b/assets/dushanbe/3.2.39/phone_transfer_confirm.jpg differ
diff --git a/assets/dushanbe/3.2.39/phone_transfer_confirm.xml b/assets/dushanbe/3.2.39/phone_transfer_confirm.xml
new file mode 100644
index 0000000..7413fa4
--- /dev/null
+++ b/assets/dushanbe/3.2.39/phone_transfer_confirm.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/phone_transfer_input.jpg b/assets/dushanbe/3.2.39/phone_transfer_input.jpg
new file mode 100644
index 0000000..518e98c
Binary files /dev/null and b/assets/dushanbe/3.2.39/phone_transfer_input.jpg differ
diff --git a/assets/dushanbe/3.2.39/phone_transfer_input.xml b/assets/dushanbe/3.2.39/phone_transfer_input.xml
new file mode 100644
index 0000000..5b745ac
--- /dev/null
+++ b/assets/dushanbe/3.2.39/phone_transfer_input.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/side_menu.jpg b/assets/dushanbe/3.2.39/side_menu.jpg
new file mode 100644
index 0000000..06a3b8d
Binary files /dev/null and b/assets/dushanbe/3.2.39/side_menu.jpg differ
diff --git a/assets/dushanbe/3.2.39/side_menu.xml b/assets/dushanbe/3.2.39/side_menu.xml
new file mode 100644
index 0000000..86aeb45
--- /dev/null
+++ b/assets/dushanbe/3.2.39/side_menu.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.39/statement_screen.jpg b/assets/dushanbe/3.2.39/statement_screen.jpg
new file mode 100644
index 0000000..1266d08
Binary files /dev/null and b/assets/dushanbe/3.2.39/statement_screen.jpg differ
diff --git a/assets/dushanbe/3.2.39/statement_screen.xml b/assets/dushanbe/3.2.39/statement_screen.xml
new file mode 100644
index 0000000..7909a3f
--- /dev/null
+++ b/assets/dushanbe/3.2.39/statement_screen.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/card_detail.xml b/assets/dushanbe/3.2.41/card_detail.xml
new file mode 100644
index 0000000..a59bc3d
--- /dev/null
+++ b/assets/dushanbe/3.2.41/card_detail.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/card_transfer_confirm.xml b/assets/dushanbe/3.2.41/card_transfer_confirm.xml
new file mode 100644
index 0000000..5fda342
--- /dev/null
+++ b/assets/dushanbe/3.2.41/card_transfer_confirm.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/card_transfer_input.xml b/assets/dushanbe/3.2.41/card_transfer_input.xml
new file mode 100644
index 0000000..e0707c8
--- /dev/null
+++ b/assets/dushanbe/3.2.41/card_transfer_input.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/card_transfer_success.xml b/assets/dushanbe/3.2.41/card_transfer_success.xml
new file mode 100644
index 0000000..f49bc35
--- /dev/null
+++ b/assets/dushanbe/3.2.41/card_transfer_success.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/card_transfer_tx_detail.xml b/assets/dushanbe/3.2.41/card_transfer_tx_detail.xml
new file mode 100644
index 0000000..4fd15eb
--- /dev/null
+++ b/assets/dushanbe/3.2.41/card_transfer_tx_detail.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/cards_screen.xml b/assets/dushanbe/3.2.41/cards_screen.xml
new file mode 100644
index 0000000..bf0c602
--- /dev/null
+++ b/assets/dushanbe/3.2.41/cards_screen.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/history_screen.xml b/assets/dushanbe/3.2.41/history_screen.xml
new file mode 100644
index 0000000..89c400d
--- /dev/null
+++ b/assets/dushanbe/3.2.41/history_screen.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/home_screen.xml b/assets/dushanbe/3.2.41/home_screen.xml
new file mode 100644
index 0000000..758cbfb
--- /dev/null
+++ b/assets/dushanbe/3.2.41/home_screen.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/phone_transfer_confirm.jpg b/assets/dushanbe/3.2.41/phone_transfer_confirm.jpg
new file mode 100644
index 0000000..32d5e09
Binary files /dev/null and b/assets/dushanbe/3.2.41/phone_transfer_confirm.jpg differ
diff --git a/assets/dushanbe/3.2.41/phone_transfer_confirm.xml b/assets/dushanbe/3.2.41/phone_transfer_confirm.xml
new file mode 100644
index 0000000..de824a5
--- /dev/null
+++ b/assets/dushanbe/3.2.41/phone_transfer_confirm.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/phone_transfer_input.jpg b/assets/dushanbe/3.2.41/phone_transfer_input.jpg
new file mode 100644
index 0000000..20f77ad
Binary files /dev/null and b/assets/dushanbe/3.2.41/phone_transfer_input.jpg differ
diff --git a/assets/dushanbe/3.2.41/phone_transfer_input.xml b/assets/dushanbe/3.2.41/phone_transfer_input.xml
new file mode 100644
index 0000000..5c4bdca
--- /dev/null
+++ b/assets/dushanbe/3.2.41/phone_transfer_input.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/phone_transfer_success.jpg b/assets/dushanbe/3.2.41/phone_transfer_success.jpg
new file mode 100644
index 0000000..38815e4
Binary files /dev/null and b/assets/dushanbe/3.2.41/phone_transfer_success.jpg differ
diff --git a/assets/dushanbe/3.2.41/phone_transfer_success.xml b/assets/dushanbe/3.2.41/phone_transfer_success.xml
new file mode 100644
index 0000000..22df106
--- /dev/null
+++ b/assets/dushanbe/3.2.41/phone_transfer_success.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/side_menu.jpg b/assets/dushanbe/3.2.41/side_menu.jpg
new file mode 100644
index 0000000..9ea48d7
Binary files /dev/null and b/assets/dushanbe/3.2.41/side_menu.jpg differ
diff --git a/assets/dushanbe/3.2.41/side_menu.xml b/assets/dushanbe/3.2.41/side_menu.xml
new file mode 100644
index 0000000..9793620
--- /dev/null
+++ b/assets/dushanbe/3.2.41/side_menu.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/dushanbe/3.2.41/statement_screen.jpg b/assets/dushanbe/3.2.41/statement_screen.jpg
new file mode 100644
index 0000000..9bd37d1
Binary files /dev/null and b/assets/dushanbe/3.2.41/statement_screen.jpg differ
diff --git a/assets/dushanbe/3.2.41/statement_screen.xml b/assets/dushanbe/3.2.41/statement_screen.xml
new file mode 100644
index 0000000..cf89dcf
--- /dev/null
+++ b/assets/dushanbe/3.2.41/statement_screen.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/views/device/DeviceWidget.cpp b/views/device/DeviceWidget.cpp
index 8f69b29..591ed9b 100644
--- a/views/device/DeviceWidget.cpp
+++ b/views/device/DeviceWidget.cpp
@@ -462,7 +462,7 @@ DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(p
// ADB-захват блокирует поток на несколько секунд — выносим в воркер,
// чтобы прогресс-диалог не замораживался.
- struct DumpData { QByteArray screenshot; QString xml; };
+ struct DumpData { QByteArray screenshot; QString xml; QString appVersion; };
auto *data = new DumpData;
auto *worker = QThread::create([data, adbSerial]() {
qDebug() << "[Dump] worker: capturing screenshot";
@@ -471,6 +471,13 @@ DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(p
qDebug() << "[Dump] worker: capturing xml";
data->xml = AdbUtils::getRawScreenDumpAsXml(adbSerial);
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 QString xml = data->xml;
+ const QString appVersion = data->appVersion;
delete data;
worker->deleteLater();
@@ -552,6 +560,14 @@ DeviceWidget::DeviceWidget(const DeviceInfo &device, QWidget *parent): QWidget(p
textPart.setBody(text.toUtf8());
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()) {
QString safeName = device.name;
safeName.replace(QRegularExpression(R"([^\w\-.])"), "_");