#pragma once #include #include class AdbUtils final : public QObject { Q_OBJECT public: explicit AdbUtils(QObject *parent = nullptr); static QString adbPath(); static QList > getListDevices(); static QString tryToGetRunningAppPid(const QString &deviceId, const QString &packageName); static bool tryToStartApplication(const QString &deviceId, const QString &packageName); static bool tryToKillApplication(const QString &deviceId, const QString &packageName); static QString getScreenDumpAsXml(const QString &deviceId, int idx, bool screenshot = false); // Сырой дамп без фильтра "useful UI" — для ручного превью оператора: // отдаёт что есть на экране, даже если это PIN-пад / сплэш / WebView-shell. static QString getRawScreenDumpAsXml(const QString &deviceId); static bool takeScreenshot(const QString &deviceId, const QString &name); // Захватывает скриншот напрямую в память (PNG-байты), без временного файла static QByteArray captureScreenshotBytes(const QString &deviceId); static bool takeXmlDump(const QString &deviceId, const QString &name); static bool makeTap(const QString &deviceId, int x, int y); static bool enableAdbIMEKeyboard(const QString &deviceId); static bool inputAdbIMEText(const QString &deviceId, const QString &text); static bool disableAdbIMEKeyboard(const QString &deviceId); static bool makeSwipe(const QString &deviceId, int x1, int y1, int x2, int y2); static bool makeSwipe(const QString &deviceId, int x1, int y1, int x2, int y2, int durationMs); static bool inputText(const QString &deviceId, const QString &text); static bool hideKeyboard(const QString &deviceId); static bool goBack(const QString &deviceId); static void unlockScreen(const QString &deviceId, int screenWidth, int screenHeight); static QSet getListApps(const QString &deviceId); // Возвращает таймзону устройства (напр. "Asia/Bangkok"), либо пустую строку при ошибке static QString getDeviceTimezone(const QString &deviceId); // Возвращает versionName установленного пакета (напр. "19.17.0"), либо пустую строку при ошибке/отсутствии static QString getAppVersion(const QString &deviceId, const QString &packageName); // Возвращает пакет приложения на переднем плане (foreground), либо пустую строку при ошибке static QString getForegroundPackage(const QString &deviceId); // Проверяет реальную ориентацию экрана (dumpsys input → SurfaceOrientation). // Если экран в горизонтальной ориентации (landscape, 90°/270°), принудительно // ставит вертикальную: выключает автоповорот и выставляет user_rotation=0. // Best-effort: при ошибке adb просто ничего не делает. Возвращает true, если // экран в портрете (изначально или после форсирования). static bool ensurePortraitOrientation(const QString &deviceId); private: static QString adbDir(); static bool startProcess(const QString &program, const QStringList &args, QString *stdOut = nullptr, QString *stdErr = nullptr); };