From 38d6f4080d3836e1bf144c2809d28eae0e443e6f Mon Sep 17 00:00:00 2001 From: Florian RICHER Date: Sun, 20 Jul 2025 21:30:49 +0200 Subject: [PATCH] kcm: Load applications in signal handler instead of waitForFinished for Waydroid --- .../waydroidapplicationlistmodel.cpp | 58 ++++++++++--------- .../waydroidapplicationlistmodel.h | 2 +- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/components/waydroidintegrationplugin/waydroidapplicationlistmodel.cpp b/components/waydroidintegrationplugin/waydroidapplicationlistmodel.cpp index cb47b295..eec19842 100644 --- a/components/waydroidintegrationplugin/waydroidapplicationlistmodel.cpp +++ b/components/waydroidintegrationplugin/waydroidapplicationlistmodel.cpp @@ -33,7 +33,7 @@ WaydroidApplicationListModel::WaydroidApplicationListModel(WaydroidState *parent WaydroidApplicationListModel::~WaydroidApplicationListModel() = default; -void WaydroidApplicationListModel::refreshApplications() +void WaydroidApplicationListModel::loadApplications(const QList applications) { if (m_waydroidState->sessionStatus() != WaydroidState::SessionRunning) { return; @@ -47,10 +47,9 @@ void WaydroidApplicationListModel::refreshApplications() appIdMap.insert(application->packageName(), i); } - QList currentApps = queryApplications(); QList toInsert; - for (const WaydroidApplication::Ptr &application : currentApps) { + for (const WaydroidApplication::Ptr &application : applications) { auto it = appIdMap.find(application->packageName()); if (it != appIdMap.end()) { // Application already in m_applications @@ -85,7 +84,7 @@ void WaydroidApplicationListModel::refreshApplications() } } -QList WaydroidApplicationListModel::queryApplications() const +void WaydroidApplicationListModel::refreshApplications() { QList applications; @@ -93,33 +92,36 @@ QList WaydroidApplicationListModel::queryApplications( QProcess *process = new QProcess(m_waydroidState); process->start(WAYDROID_COMMAND, arguments); - process->waitForFinished(); - if (process->exitCode() != 0) { - qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to run waydroid app list command: " << process->readAllStandardError(); - return applications; - } - - const QByteArray data = process->readAllStandardOutput(); - if (data.isEmpty()) { - qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Empty data: " << process->readAllStandardError(); - return applications; - } - - qCDebug(WAYDROIDINTEGRATIONPLUGIN) << "Waydroid output: " << data; - QTextStream output = QTextStream(data); - - while (!output.atEnd()) { - const WaydroidApplication::Ptr app = WaydroidApplication::fromWaydroidLog(output); - if (app == nullptr) { - qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to fetch the application: Maybe wrong QTextStream cursor position."; - break; + connect(process, &QProcess::finished, this, [this, process](int exitCode, QProcess::ExitStatus exitStatus) { + if (exitCode != 0 || exitStatus == QProcess::ExitStatus::CrashExit) { + qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to run waydroid app list command: " << process->readAllStandardError(); + return; } - qCDebug(WAYDROIDINTEGRATIONPLUGIN) << "Waydroid application found: " << app.get()->name() << " (" << app.get()->packageName() << ")"; - applications.append(app); - } - return applications; + const QByteArray data = process->readAllStandardOutput(); + if (data.isEmpty()) { + qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Empty data: " << process->readAllStandardError(); + return; + } + + qCDebug(WAYDROIDINTEGRATIONPLUGIN) << "Waydroid output: " << data; + QTextStream output = QTextStream(data); + + QList applications; + while (!output.atEnd()) { + const WaydroidApplication::Ptr app = WaydroidApplication::fromWaydroidLog(output); + if (app == nullptr) { + qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to fetch the application: Maybe wrong QTextStream cursor position."; + break; + } + + qCDebug(WAYDROIDINTEGRATIONPLUGIN) << "Waydroid application found: " << app.get()->name() << " (" << app.get()->packageName() << ")"; + applications.append(app); + } + + loadApplications(applications); + }); } QHash WaydroidApplicationListModel::roleNames() const diff --git a/components/waydroidintegrationplugin/waydroidapplicationlistmodel.h b/components/waydroidintegrationplugin/waydroidapplicationlistmodel.h index 5c058179..57f037e3 100644 --- a/components/waydroidintegrationplugin/waydroidapplicationlistmodel.h +++ b/components/waydroidintegrationplugin/waydroidapplicationlistmodel.h @@ -45,6 +45,6 @@ private: QList m_applications; QTimer *m_refreshTimer{nullptr}; + void loadApplications(const QList applications); void refreshApplications(); - QList queryApplications() const; }; \ No newline at end of file