From d356257bd6dd12608aa2be50993ac924bc8dc63a Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 3 May 2024 10:29:35 +0200 Subject: [PATCH] Android: Run Process asynchronously from the main thread Instead of running it blocking from a separate thread. Change-Id: Ia971395faf7d34062ab4bcfa91082c0bf77cdccf Reviewed-by: Reviewed-by: Alessandro Portale --- src/plugins/android/androidsdkmanager.cpp | 27 --------------- src/plugins/android/androidsdkmanager.h | 3 -- .../android/androidsdkmanagerwidget.cpp | 33 ++++++++++--------- src/plugins/android/androidsdkmanagerwidget.h | 5 +-- 4 files changed, 20 insertions(+), 48 deletions(-) diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index 437719e33ab..ed1ca4af9cf 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -11,7 +11,6 @@ #include #include -#include #include #include #include @@ -27,7 +26,6 @@ namespace { Q_LOGGING_CATEGORY(sdkManagerLog, "qtc.android.sdkManager", QtWarningMsg) -const char commonArgsKey[] = "Common Arguments:"; } using namespace Tasking; @@ -498,31 +496,6 @@ static bool sdkManagerCommand(const AndroidConfig &config, const QStringList &ar return proc.result() == ProcessResult::FinishedWithSuccess; } -static void parseCommonArguments(QPromise &promise) -{ - QString argumentDetails; - QString output; - sdkManagerCommand(androidConfig(), QStringList("--help"), &output); - bool foundTag = false; - const auto lines = output.split('\n'); - for (const QString& line : lines) { - if (promise.isCanceled()) - break; - if (foundTag) - argumentDetails.append(line + "\n"); - else if (line.startsWith(commonArgsKey)) - foundTag = true; - } - - if (!promise.isCanceled()) - promise.addResult(argumentDetails); -} - -QFuture AndroidSdkManager::availableArguments() const -{ - return Utils::asyncRun(parseCommonArguments); -} - AndroidSdkManagerPrivate::AndroidSdkManagerPrivate(AndroidSdkManager &sdkManager) : m_sdkManager(sdkManager) {} diff --git a/src/plugins/android/androidsdkmanager.h b/src/plugins/android/androidsdkmanager.h index 13d905408be..47611368f42 100644 --- a/src/plugins/android/androidsdkmanager.h +++ b/src/plugins/android/androidsdkmanager.h @@ -7,7 +7,6 @@ #include #include -#include #include @@ -55,8 +54,6 @@ public: bool packageListingSuccessful() const; - QFuture availableArguments() const; - void runInstallationChange(const InstallationChange &change, const QString &extraMessage = {}); void runUpdate(); diff --git a/src/plugins/android/androidsdkmanagerwidget.cpp b/src/plugins/android/androidsdkmanagerwidget.cpp index 42537c8ba33..edf15f40afc 100644 --- a/src/plugins/android/androidsdkmanagerwidget.cpp +++ b/src/plugins/android/androidsdkmanagerwidget.cpp @@ -7,7 +7,6 @@ #include "androidsdkmodel.h" #include "androidtr.h" -#include #include #include @@ -270,16 +269,24 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a m_argumentDetailsEdit = new QPlainTextEdit(this); m_argumentDetailsEdit->setReadOnly(true); - auto populateOptions = [this](const QString& options) { - if (options.isEmpty()) { - m_argumentDetailsEdit->setPlainText(Tr::tr("Cannot load available arguments for " - "\"sdkmanager\" command.")); - } else { - m_argumentDetailsEdit->setPlainText(options); + m_process.setEnvironment(androidConfig().toolsEnvironment()); + m_process.setCommand({androidConfig().sdkManagerToolPath(), + {"--help", "--sdk_root=" + androidConfig().sdkLocation().toString()}}); + connect(&m_process, &Process::done, this, [this] { + QString argumentDetails; + bool foundTag = false; + const QStringList lines = m_process.allOutput().split('\n'); + for (const QString &line : lines) { + if (foundTag) + argumentDetails.append(line + "\n"); + else if (line.startsWith("Common Arguments:")) + foundTag = true; } - }; - m_optionsFuture = sdkManager->availableArguments(); - Utils::onResultReady(m_optionsFuture, this, populateOptions); + if (argumentDetails.isEmpty()) + argumentDetails = Tr::tr("Cannot load available arguments for \"sdkmanager\" command."); + m_argumentDetailsEdit->setPlainText(argumentDetails); + }); + m_process.start(); auto dialogButtons = new QDialogButtonBox(this); dialogButtons->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); @@ -298,12 +305,6 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a }.attachTo(this); } -OptionsDialog::~OptionsDialog() -{ - m_optionsFuture.cancel(); - m_optionsFuture.waitForFinished(); -} - QStringList OptionsDialog::sdkManagerArguments() const { QString userInput = m_argumentsEdit->text().simplified(); diff --git a/src/plugins/android/androidsdkmanagerwidget.h b/src/plugins/android/androidsdkmanagerwidget.h index 27b859c80cb..d33d0125c04 100644 --- a/src/plugins/android/androidsdkmanagerwidget.h +++ b/src/plugins/android/androidsdkmanagerwidget.h @@ -4,6 +4,8 @@ #include "androidsdkmanager.h" +#include + #include QT_BEGIN_NAMESPACE @@ -23,14 +25,13 @@ class OptionsDialog : public QDialog { public: OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &args, QWidget *parent = nullptr); - ~OptionsDialog() override; QStringList sdkManagerArguments() const; private: QPlainTextEdit *m_argumentDetailsEdit = nullptr; QLineEdit *m_argumentsEdit = nullptr; - QFuture m_optionsFuture; + Utils::Process m_process; }; class AndroidSdkManagerWidget : public QDialog