From 5c93d1e77aa39d245f45d6ad7773eeb764171f6c Mon Sep 17 00:00:00 2001 From: Florian RICHER Date: Mon, 28 Jul 2025 19:20:33 +0200 Subject: [PATCH] waydroid: Refactor with QCoro --- CMakeLists.txt | 2 +- .../waydroidintegrationplugin/CMakeLists.txt | 2 + .../waydroidstate.cpp | 75 ++++++++++++------- .../waydroidintegrationplugin/waydroidstate.h | 12 ++- .../ui/WaydroidConfigurationForm.qml | 2 +- .../ui/WaydroidInitialConfigurationForm.qml | 2 +- kcms/waydroidintegration/ui/main.qml | 2 +- quicksettings/waydroid/contents/ui/main.qml | 4 +- 8 files changed, 63 insertions(+), 38 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 73446d46..1d80369a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,7 +87,7 @@ find_package(KPipeWire ${PROJECT_DEP_VERSION} REQUIRED) find_package(PkgConfig REQUIRED) -find_package(QCoro6 REQUIRED COMPONENTS DBus) +find_package(QCoro6 REQUIRED COMPONENTS DBus Qml) qcoro_enable_coroutines() kde_enable_exceptions() diff --git a/components/waydroidintegrationplugin/CMakeLists.txt b/components/waydroidintegrationplugin/CMakeLists.txt index 023256bf..4e42e5f9 100644 --- a/components/waydroidintegrationplugin/CMakeLists.txt +++ b/components/waydroidintegrationplugin/CMakeLists.txt @@ -10,6 +10,8 @@ target_link_libraries(waydroidintegrationplugin PRIVATE Qt::Quick KF6::AuthCore KF6::I18n + QCoro::Core + QCoro::Qml ) ecm_finalize_qml_module(waydroidintegrationplugin) diff --git a/components/waydroidintegrationplugin/waydroidstate.cpp b/components/waydroidintegrationplugin/waydroidstate.cpp index 057d1f1b..fcc2abde 100644 --- a/components/waydroidintegrationplugin/waydroidstate.cpp +++ b/components/waydroidintegrationplugin/waydroidstate.cpp @@ -9,6 +9,7 @@ #include "waydroidshared.h" #include +#include #include #include #include @@ -175,10 +176,15 @@ void WaydroidState::resetError() } } -void WaydroidState::initialize(const SystemType systemType, const RomType romType, const bool forced) +QCoro::QmlTask WaydroidState::initializeQml(const SystemType systemType, const RomType romType, const bool forced) +{ + return initialize(systemType, romType, forced); +} + +QCoro::Task WaydroidState::initialize(const SystemType systemType, const RomType romType, const bool forced) { if (m_status == Initializing) { - return; + co_return; } m_status = Initializing; @@ -230,27 +236,32 @@ void WaydroidState::initialize(const SystemType systemType, const RomType romTyp Q_EMIT downloadStatusChanged(downloaded, total, speed); }); - connect(job, &KAuth::ExecuteJob::finished, this, [this](KJob *job, auto) { - if (job->error() == 0) { - m_status = Initialized; - } else { - m_errorTitle = i18n("Failed to initialize Waydroid."); - Q_EMIT errorTitleChanged(); - m_errorMessage = job->errorString(); - Q_EMIT errorMessageChanged(); + co_await qCoro(job, &KAuth::ExecuteJob::finished); - m_status = NotInitialized; - qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "KAuth returned an error code:" << job->error() << " message: " << job->errorString(); - } + if (job->error() == 0) { + m_status = Initialized; + } else { + m_errorTitle = i18n("Failed to initialize Waydroid."); + Q_EMIT errorTitleChanged(); + m_errorMessage = job->errorString(); + Q_EMIT errorMessageChanged(); - Q_EMIT statusChanged(); - }); + m_status = NotInitialized; + qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "KAuth returned an error code:" << job->error() << " message: " << job->errorString(); + } + + Q_EMIT statusChanged(); } -void WaydroidState::startSession() +QCoro::QmlTask WaydroidState::startSessionQml() +{ + return startSession(); +} + +QCoro::Task WaydroidState::startSession() { if (m_sessionStatus == SessionStarting || m_sessionStatus == SessionRunning) { - return; + co_return; } m_sessionStatus = SessionStarting; @@ -258,11 +269,11 @@ void WaydroidState::startSession() const QStringList arguments{u"session"_s, u"start"_s}; - // Don't wait for result because the command is blocking - QProcess *process = new QProcess(this); - process->start(WAYDROID_COMMAND, arguments); + QProcess *basicProcess = new QProcess(this); + auto process = qCoro(basicProcess); + co_await process.start(WAYDROID_COMMAND, arguments); - connect(process, &QProcess::finished, this, [this, process](int exitCode, QProcess::ExitStatus exitStatus) { + connect(basicProcess, &QProcess::finished, this, [this, basicProcess](int exitCode, QProcess::ExitStatus exitStatus) { Q_UNUSED(exitStatus); if (exitCode == 0) { @@ -272,7 +283,7 @@ void WaydroidState::startSession() m_sessionStatus = SessionStopped; Q_EMIT sessionStatusChanged(); - QByteArray errorData = process->readAllStandardError(); + QByteArray errorData = basicProcess->readAllStandardError(); QString errorString = QString::fromUtf8(errorData); m_errorTitle = i18n("Failed to start the Waydroid session."); @@ -286,23 +297,29 @@ void WaydroidState::startSession() checkSessionStarting(10); } -void WaydroidState::stopSession() +QCoro::QmlTask WaydroidState::stopSessionQml() +{ + return stopSession(); +} + +QCoro::Task WaydroidState::stopSession() { if (m_sessionStatus == SessionStopped) { - return; + co_return; } const QStringList arguments{u"session"_s, u"stop"_s}; - QProcess *process = new QProcess(this); - process->start(WAYDROID_COMMAND, arguments); - process->waitForFinished(); + QProcess basicProcess = QProcess(this); + auto process = qCoro(basicProcess); + co_await process.start(WAYDROID_COMMAND, arguments); + co_await process.waitForFinished(); - if (process->exitCode() == 0) { + if (basicProcess.exitCode() == 0) { m_sessionStatus = SessionStopped; Q_EMIT sessionStatusChanged(); } else { - qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to stop the Waydroid session: " << process->readAllStandardError(); + qCWarning(WAYDROIDINTEGRATIONPLUGIN) << "Failed to stop the Waydroid session: " << basicProcess.readAllStandardError(); } } diff --git a/components/waydroidintegrationplugin/waydroidstate.h b/components/waydroidintegrationplugin/waydroidstate.h index c9765c20..5228a8af 100644 --- a/components/waydroidintegrationplugin/waydroidstate.h +++ b/components/waydroidintegrationplugin/waydroidstate.h @@ -8,6 +8,8 @@ #include "waydroidapplicationlistmodel.h" +#include +#include #include #include @@ -95,9 +97,13 @@ public: Q_INVOKABLE void refreshAndroidId(); Q_INVOKABLE void refreshPropsInfo(); Q_INVOKABLE void resetError(); - Q_INVOKABLE void initialize(const SystemType systemType, const RomType romType, const bool forced = false); - Q_INVOKABLE void startSession(); - Q_INVOKABLE void stopSession(); + Q_INVOKABLE QCoro::QmlTask initializeQml(const SystemType systemType, const RomType romType, const bool forced = false); + QCoro::Task initialize(const SystemType systemType, const RomType romType, const bool forced = false); + Q_INVOKABLE QCoro::QmlTask startSessionQml(); + QCoro::Task startSession(); + Q_INVOKABLE QCoro::QmlTask stopSessionQml(); + QCoro::Task stopSession(); + Q_INVOKABLE void copyToClipboard(const QString text); Status status() const; diff --git a/kcms/waydroidintegration/ui/WaydroidConfigurationForm.qml b/kcms/waydroidintegration/ui/WaydroidConfigurationForm.qml index 101dde99..af86a51c 100644 --- a/kcms/waydroidintegration/ui/WaydroidConfigurationForm.qml +++ b/kcms/waydroidintegration/ui/WaydroidConfigurationForm.qml @@ -37,7 +37,7 @@ ColumnLayout { trailing: PC3.Button { text: i18n("Stop session") - onClicked: AIP.WaydroidState.stopSession() + onClicked: AIP.WaydroidState.stopSessionQml() } } diff --git a/kcms/waydroidintegration/ui/WaydroidInitialConfigurationForm.qml b/kcms/waydroidintegration/ui/WaydroidInitialConfigurationForm.qml index 4bda6510..3a2a39a7 100644 --- a/kcms/waydroidintegration/ui/WaydroidInitialConfigurationForm.qml +++ b/kcms/waydroidintegration/ui/WaydroidInitialConfigurationForm.qml @@ -36,6 +36,6 @@ ColumnLayout { Layout.alignment: Qt.AlignHCenter enabled: systemType.currentValue !== undefined - onClicked: AIP.WaydroidState.initialize(systemType.currentValue, AIP.WaydroidState.Lineage) + onClicked: AIP.WaydroidState.initializeQml(systemType.currentValue, AIP.WaydroidState.Lineage) } } \ No newline at end of file diff --git a/kcms/waydroidintegration/ui/main.qml b/kcms/waydroidintegration/ui/main.qml index b055ceae..06600d7d 100644 --- a/kcms/waydroidintegration/ui/main.qml +++ b/kcms/waydroidintegration/ui/main.qml @@ -76,7 +76,7 @@ KCM.SimpleKCM { PC3.Button { text: i18n("Start the session") Layout.alignment: Qt.AlignHCenter - onClicked: AIP.WaydroidState.startSession() + onClicked: AIP.WaydroidState.startSessionQml() } } diff --git a/quicksettings/waydroid/contents/ui/main.qml b/quicksettings/waydroid/contents/ui/main.qml index f046e387..696bf142 100644 --- a/quicksettings/waydroid/contents/ui/main.qml +++ b/quicksettings/waydroid/contents/ui/main.qml @@ -18,9 +18,9 @@ QS.QuickSetting { function toggle(): void { if (AIP.WaydroidState.sessionStatus === AIP.WaydroidState.SessionRunning) { - AIP.WaydroidState.stopSession() + AIP.WaydroidState.stopSessionQml() } else { - AIP.WaydroidState.startSession() + AIP.WaydroidState.startSessionQml() } } }