forked from qt-creator/qt-creator
Android: Run Process asynchronously from the main thread
Instead of running it blocking from a separate thread. Change-Id: Ia971395faf7d34062ab4bcfa91082c0bf77cdccf Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -11,7 +11,6 @@
|
|||||||
#include <solutions/tasking/tasktreerunner.h>
|
#include <solutions/tasking/tasktreerunner.h>
|
||||||
|
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
#include <utils/async.h>
|
|
||||||
#include <utils/layoutbuilder.h>
|
#include <utils/layoutbuilder.h>
|
||||||
#include <utils/outputformatter.h>
|
#include <utils/outputformatter.h>
|
||||||
#include <utils/qtcprocess.h>
|
#include <utils/qtcprocess.h>
|
||||||
@@ -27,7 +26,6 @@
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
Q_LOGGING_CATEGORY(sdkManagerLog, "qtc.android.sdkManager", QtWarningMsg)
|
Q_LOGGING_CATEGORY(sdkManagerLog, "qtc.android.sdkManager", QtWarningMsg)
|
||||||
const char commonArgsKey[] = "Common Arguments:";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
using namespace Tasking;
|
using namespace Tasking;
|
||||||
@@ -498,31 +496,6 @@ static bool sdkManagerCommand(const AndroidConfig &config, const QStringList &ar
|
|||||||
return proc.result() == ProcessResult::FinishedWithSuccess;
|
return proc.result() == ProcessResult::FinishedWithSuccess;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parseCommonArguments(QPromise<QString> &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<QString> AndroidSdkManager::availableArguments() const
|
|
||||||
{
|
|
||||||
return Utils::asyncRun(parseCommonArguments);
|
|
||||||
}
|
|
||||||
|
|
||||||
AndroidSdkManagerPrivate::AndroidSdkManagerPrivate(AndroidSdkManager &sdkManager)
|
AndroidSdkManagerPrivate::AndroidSdkManagerPrivate(AndroidSdkManager &sdkManager)
|
||||||
: m_sdkManager(sdkManager)
|
: m_sdkManager(sdkManager)
|
||||||
{}
|
{}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include <utils/filepath.h>
|
#include <utils/filepath.h>
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QFuture>
|
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
@@ -55,8 +54,6 @@ public:
|
|||||||
|
|
||||||
bool packageListingSuccessful() const;
|
bool packageListingSuccessful() const;
|
||||||
|
|
||||||
QFuture<QString> availableArguments() const;
|
|
||||||
|
|
||||||
void runInstallationChange(const InstallationChange &change, const QString &extraMessage = {});
|
void runInstallationChange(const InstallationChange &change, const QString &extraMessage = {});
|
||||||
void runUpdate();
|
void runUpdate();
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,6 @@
|
|||||||
#include "androidsdkmodel.h"
|
#include "androidsdkmodel.h"
|
||||||
#include "androidtr.h"
|
#include "androidtr.h"
|
||||||
|
|
||||||
#include <utils/async.h>
|
|
||||||
#include <utils/layoutbuilder.h>
|
#include <utils/layoutbuilder.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
@@ -270,16 +269,24 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a
|
|||||||
m_argumentDetailsEdit = new QPlainTextEdit(this);
|
m_argumentDetailsEdit = new QPlainTextEdit(this);
|
||||||
m_argumentDetailsEdit->setReadOnly(true);
|
m_argumentDetailsEdit->setReadOnly(true);
|
||||||
|
|
||||||
auto populateOptions = [this](const QString& options) {
|
m_process.setEnvironment(androidConfig().toolsEnvironment());
|
||||||
if (options.isEmpty()) {
|
m_process.setCommand({androidConfig().sdkManagerToolPath(),
|
||||||
m_argumentDetailsEdit->setPlainText(Tr::tr("Cannot load available arguments for "
|
{"--help", "--sdk_root=" + androidConfig().sdkLocation().toString()}});
|
||||||
"\"sdkmanager\" command."));
|
connect(&m_process, &Process::done, this, [this] {
|
||||||
} else {
|
QString argumentDetails;
|
||||||
m_argumentDetailsEdit->setPlainText(options);
|
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;
|
||||||
}
|
}
|
||||||
};
|
if (argumentDetails.isEmpty())
|
||||||
m_optionsFuture = sdkManager->availableArguments();
|
argumentDetails = Tr::tr("Cannot load available arguments for \"sdkmanager\" command.");
|
||||||
Utils::onResultReady(m_optionsFuture, this, populateOptions);
|
m_argumentDetailsEdit->setPlainText(argumentDetails);
|
||||||
|
});
|
||||||
|
m_process.start();
|
||||||
|
|
||||||
auto dialogButtons = new QDialogButtonBox(this);
|
auto dialogButtons = new QDialogButtonBox(this);
|
||||||
dialogButtons->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
|
dialogButtons->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
|
||||||
@@ -298,12 +305,6 @@ OptionsDialog::OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &a
|
|||||||
}.attachTo(this);
|
}.attachTo(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
OptionsDialog::~OptionsDialog()
|
|
||||||
{
|
|
||||||
m_optionsFuture.cancel();
|
|
||||||
m_optionsFuture.waitForFinished();
|
|
||||||
}
|
|
||||||
|
|
||||||
QStringList OptionsDialog::sdkManagerArguments() const
|
QStringList OptionsDialog::sdkManagerArguments() const
|
||||||
{
|
{
|
||||||
QString userInput = m_argumentsEdit->text().simplified();
|
QString userInput = m_argumentsEdit->text().simplified();
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
|
|
||||||
#include "androidsdkmanager.h"
|
#include "androidsdkmanager.h"
|
||||||
|
|
||||||
|
#include <utils/qtcprocess.h>
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
@@ -23,14 +25,13 @@ class OptionsDialog : public QDialog
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &args, QWidget *parent = nullptr);
|
OptionsDialog(AndroidSdkManager *sdkManager, const QStringList &args, QWidget *parent = nullptr);
|
||||||
~OptionsDialog() override;
|
|
||||||
|
|
||||||
QStringList sdkManagerArguments() const;
|
QStringList sdkManagerArguments() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QPlainTextEdit *m_argumentDetailsEdit = nullptr;
|
QPlainTextEdit *m_argumentDetailsEdit = nullptr;
|
||||||
QLineEdit *m_argumentsEdit = nullptr;
|
QLineEdit *m_argumentsEdit = nullptr;
|
||||||
QFuture<QString> m_optionsFuture;
|
Utils::Process m_process;
|
||||||
};
|
};
|
||||||
|
|
||||||
class AndroidSdkManagerWidget : public QDialog
|
class AndroidSdkManagerWidget : public QDialog
|
||||||
|
|||||||
Reference in New Issue
Block a user