kcm: Load applications in signal handler instead of waitForFinished for Waydroid

This commit is contained in:
Florian RICHER 2025-07-20 21:30:49 +02:00
parent de7b63572f
commit 38d6f4080d
2 changed files with 31 additions and 29 deletions

View file

@ -33,7 +33,7 @@ WaydroidApplicationListModel::WaydroidApplicationListModel(WaydroidState *parent
WaydroidApplicationListModel::~WaydroidApplicationListModel() = default; WaydroidApplicationListModel::~WaydroidApplicationListModel() = default;
void WaydroidApplicationListModel::refreshApplications() void WaydroidApplicationListModel::loadApplications(const QList<WaydroidApplication::Ptr> applications)
{ {
if (m_waydroidState->sessionStatus() != WaydroidState::SessionRunning) { if (m_waydroidState->sessionStatus() != WaydroidState::SessionRunning) {
return; return;
@ -47,10 +47,9 @@ void WaydroidApplicationListModel::refreshApplications()
appIdMap.insert(application->packageName(), i); appIdMap.insert(application->packageName(), i);
} }
QList<WaydroidApplication::Ptr> currentApps = queryApplications();
QList<WaydroidApplication::Ptr> toInsert; QList<WaydroidApplication::Ptr> toInsert;
for (const WaydroidApplication::Ptr &application : currentApps) { for (const WaydroidApplication::Ptr &application : applications) {
auto it = appIdMap.find(application->packageName()); auto it = appIdMap.find(application->packageName());
if (it != appIdMap.end()) { if (it != appIdMap.end()) {
// Application already in m_applications // Application already in m_applications
@ -85,7 +84,7 @@ void WaydroidApplicationListModel::refreshApplications()
} }
} }
QList<WaydroidApplication::Ptr> WaydroidApplicationListModel::queryApplications() const void WaydroidApplicationListModel::refreshApplications()
{ {
QList<WaydroidApplication::Ptr> applications; QList<WaydroidApplication::Ptr> applications;
@ -93,33 +92,36 @@ QList<WaydroidApplication::Ptr> WaydroidApplicationListModel::queryApplications(
QProcess *process = new QProcess(m_waydroidState); QProcess *process = new QProcess(m_waydroidState);
process->start(WAYDROID_COMMAND, arguments); process->start(WAYDROID_COMMAND, arguments);
process->waitForFinished();
if (process->exitCode() != 0) { connect(process, &QProcess::finished, this, [this, process](int exitCode, QProcess::ExitStatus exitStatus) {
qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to run waydroid app list command: " << process->readAllStandardError(); if (exitCode != 0 || exitStatus == QProcess::ExitStatus::CrashExit) {
return applications; qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to run waydroid app list command: " << process->readAllStandardError();
} return;
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;
} }
qCDebug(WAYDROIDINTEGRATIONPLUGIN) << "Waydroid application found: " << app.get()->name() << " (" << app.get()->packageName() << ")"; const QByteArray data = process->readAllStandardOutput();
applications.append(app); if (data.isEmpty()) {
} qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Empty data: " << process->readAllStandardError();
return applications; return;
}
qCDebug(WAYDROIDINTEGRATIONPLUGIN) << "Waydroid output: " << data;
QTextStream output = QTextStream(data);
QList<WaydroidApplication::Ptr> 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<int, QByteArray> WaydroidApplicationListModel::roleNames() const QHash<int, QByteArray> WaydroidApplicationListModel::roleNames() const

View file

@ -45,6 +45,6 @@ private:
QList<WaydroidApplication::Ptr> m_applications; QList<WaydroidApplication::Ptr> m_applications;
QTimer *m_refreshTimer{nullptr}; QTimer *m_refreshTimer{nullptr};
void loadApplications(const QList<WaydroidApplication::Ptr> applications);
void refreshApplications(); void refreshApplications();
QList<WaydroidApplication::Ptr> queryApplications() const;
}; };