#pragma once #include #include #include #include #include #include class DeviceScreener final : public QObject { Q_OBJECT public: explicit DeviceScreener(QObject *parent = nullptr); ~DeviceScreener() override; static constexpr qint64 kOfflineDebounceSecs = 30; public slots: void start(); void stop(); signals: void finished(); void firstPassDone(); void deviceWentOnline(const QString &deviceId); void deviceWentOffline(const QString &deviceId); private: bool m_running = true; bool m_firstScan = true; QString m_urlAppUpdate; QString m_token; QString m_apiBase; QNetworkAccessManager *m_manager = nullptr; QMap m_lastApiUpdate; // deviceId → unix timestamp последнего PATCH QSet m_onlineDevices; // дебаунс-онлайн (true online после dedup) QMap m_offlineSince; // deviceId → когда пропал из ADB (для дебаунса) static QList > readAdbDevices(); static QByteArray takeScreenshot(const QString &deviceId); static DeviceInfo readDeviceInfo(const QString &adbSerial); void postDevicesData(const QList &devices); QJsonValue apiGet(const QString &path); QJsonValue apiPost(const QString &path, const QJsonObject &body); void apiPatch(const QString &path, const QJsonObject &body); QString createDeviceOnApi(const DeviceInfo &device); void updateDeviceOnApi(const DeviceInfo &device); void postScreenshotToApi(const QString &apiId, const QByteArray &image); };