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\-.])"), "_");