Android: Transform AndroidSdkDownloader into a pure recipe

Get rid of AndroidSdkDownloader class.
This will enable easy chaining of recipes for different workflows.

Change-Id: Ia048597148a2a1e7573fc0d4192cf7e678f39c4f
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-04-22 20:10:37 +02:00
committed by Alessandro Portale
parent b97434cca7
commit d73c22cd95
3 changed files with 23 additions and 34 deletions

View File

@@ -31,7 +31,7 @@ namespace Android::Internal {
static void logError(const QString &error) static void logError(const QString &error)
{ {
qCDebug(sdkDownloaderLog, "%s", error.toUtf8().data()); qCDebug(sdkDownloaderLog, "%s", error.toUtf8().data());
QMessageBox::warning(Core::ICore::dialogParent(), AndroidSdkDownloader::dialogTitle(), error); QMessageBox::warning(Core::ICore::dialogParent(), dialogTitle(), error);
} }
static bool isHttpRedirect(QNetworkReply *reply) static bool isHttpRedirect(QNetworkReply *reply)
@@ -85,7 +85,7 @@ static bool verifyFileIntegrity(const FilePath fileName, const QByteArray &sha25
return false; return false;
} }
void AndroidSdkDownloader::downloadAndExtractSdk() GroupItem downloadSdkRecipe()
{ {
struct StorageStruct struct StorageStruct
{ {
@@ -96,6 +96,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
progressDialog->setWindowTitle(dialogTitle()); progressDialog->setWindowTitle(dialogTitle());
progressDialog->setFixedSize(progressDialog->sizeHint()); progressDialog->setFixedSize(progressDialog->sizeHint());
progressDialog->setAutoClose(false); progressDialog->setAutoClose(false);
progressDialog->show(); // TODO: Should not be needed. Investigate possible QT_BUG
} }
std::unique_ptr<QProgressDialog> progressDialog; std::unique_ptr<QProgressDialog> progressDialog;
std::optional<FilePath> sdkFileName; std::optional<FilePath> sdkFileName;
@@ -116,7 +117,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
query.setNetworkAccessManager(NetworkAccessManager::instance()); query.setNetworkAccessManager(NetworkAccessManager::instance());
NetworkQuery *queryPtr = &query; NetworkQuery *queryPtr = &query;
QProgressDialog *progressDialog = storage->progressDialog.get(); QProgressDialog *progressDialog = storage->progressDialog.get();
connect(queryPtr, &NetworkQuery::started, progressDialog, [queryPtr, progressDialog] { QObject::connect(queryPtr, &NetworkQuery::started, progressDialog, [queryPtr, progressDialog] {
QNetworkReply *reply = queryPtr->reply(); QNetworkReply *reply = queryPtr->reply();
if (!reply) if (!reply)
return; return;
@@ -126,7 +127,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
progressDialog->setValue(received); progressDialog->setValue(received);
}); });
#if QT_CONFIG(ssl) #if QT_CONFIG(ssl)
connect(reply, &QNetworkReply::sslErrors, QObject::connect(reply, &QNetworkReply::sslErrors,
reply, [reply](const QList<QSslError> &sslErrors) { reply, [reply](const QList<QSslError> &sslErrors) {
for (const QSslError &error : sslErrors) for (const QSslError &error : sslErrors)
qCDebug(sdkDownloaderLog, "SSL error: %s\n", qPrintable(error.errorString())); qCDebug(sdkDownloaderLog, "SSL error: %s\n", qPrintable(error.errorString()));
@@ -180,7 +181,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
unarchiver.setDestDir(sdkFileName.parentDir()); unarchiver.setDestDir(sdkFileName.parentDir());
return SetupResult::Continue; return SetupResult::Continue;
}; };
const auto onUnarchiverDone = [this, storage](DoneWith result) { const auto onUnarchiverDone = [storage](DoneWith result) {
if (result == DoneWith::Cancel) if (result == DoneWith::Cancel)
return; return;
@@ -190,7 +191,6 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
} }
androidConfig().setTemporarySdkToolsPath( androidConfig().setTemporarySdkToolsPath(
storage->sdkFileName->parentDir().pathAppended(Constants::cmdlineToolsName)); storage->sdkFileName->parentDir().pathAppended(Constants::cmdlineToolsName));
QMetaObject::invokeMethod(this, [this] { emit sdkExtracted(); }, Qt::QueuedConnection);
}; };
const auto onCanceled = [storage](Barrier &barrier) { const auto onCanceled = [storage](Barrier &barrier) {
@@ -199,7 +199,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
&barrier, &Barrier::advance, Qt::QueuedConnection); &barrier, &Barrier::advance, Qt::QueuedConnection);
}; };
const Group root { return Group {
storage, storage,
parallel, parallel,
stopOnSuccessOrError, stopOnSuccessOrError,
@@ -210,13 +210,8 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
}, },
BarrierTask(onCanceled, [] { return DoneResult::Error; }) BarrierTask(onCanceled, [] { return DoneResult::Error; })
}; };
m_taskTreeRunner.start(root);
} }
QString AndroidSdkDownloader::dialogTitle() QString dialogTitle() { return Tr::tr("Download SDK Tools"); }
{
return Tr::tr("Download SDK Tools");
}
} // namespace Android::Internal } // namespace Android::Internal

View File

@@ -3,23 +3,13 @@
#pragma once #pragma once
#include <solutions/tasking/tasktreerunner.h> #include <QString>
namespace Tasking { class GroupItem; }
namespace Android::Internal { namespace Android::Internal {
class AndroidSdkDownloader : public QObject Tasking::GroupItem downloadSdkRecipe();
{ QString dialogTitle();
Q_OBJECT
public:
void downloadAndExtractSdk();
static QString dialogTitle();
signals:
void sdkExtracted();
private:
Tasking::TaskTreeRunner m_taskTreeRunner;
};
} // namespace Android::Internal } // namespace Android::Internal

View File

@@ -14,6 +14,8 @@
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <solutions/tasking/tasktreerunner.h>
#include <utils/async.h> #include <utils/async.h>
#include <utils/detailswidget.h> #include <utils/detailswidget.h>
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
@@ -183,7 +185,7 @@ private:
AndroidSdkManagerWidget *m_sdkManagerWidget = nullptr; AndroidSdkManagerWidget *m_sdkManagerWidget = nullptr;
AndroidSdkManager m_sdkManager; AndroidSdkManager m_sdkManager;
AndroidSdkDownloader m_sdkDownloader; Tasking::TaskTreeRunner m_sdkDownloader;
bool m_isInitialReloadDone = false; bool m_isInitialReloadDone = false;
SummaryWidget *m_androidSummary = nullptr; SummaryWidget *m_androidSummary = nullptr;
@@ -500,11 +502,13 @@ AndroidSettingsWidget::AndroidSettingsWidget()
this, [this] { m_sdkManagerWidget->exec(); }); this, [this] { m_sdkManagerWidget->exec(); });
connect(sdkToolsAutoDownloadButton, &QAbstractButton::clicked, connect(sdkToolsAutoDownloadButton, &QAbstractButton::clicked,
this, &AndroidSettingsWidget::downloadSdk); this, &AndroidSettingsWidget::downloadSdk);
connect(&m_sdkDownloader, &AndroidSdkDownloader::sdkExtracted, this, [this] { connect(&m_sdkDownloader, &Tasking::TaskTreeRunner::done, this, [this](Tasking::DoneWith result) {
if (result != Tasking::DoneWith::Success)
return;
// Make sure the sdk path is created before installing packages // Make sure the sdk path is created before installing packages
const FilePath sdkPath = androidConfig().sdkLocation(); const FilePath sdkPath = androidConfig().sdkLocation();
if (!sdkPath.createDir()) { if (!sdkPath.createDir()) {
QMessageBox::warning(this, AndroidSdkDownloader::dialogTitle(), QMessageBox::warning(this, Android::Internal::dialogTitle(),
Tr::tr("Failed to create the SDK Tools path %1.") Tr::tr("Failed to create the SDK Tools path %1.")
.arg("\n\"" + sdkPath.toUserOutput() + "\"")); .arg("\n\"" + sdkPath.toUserOutput() + "\""));
} }
@@ -813,7 +817,7 @@ void AndroidSettingsWidget::updateUI()
void AndroidSettingsWidget::downloadSdk() void AndroidSettingsWidget::downloadSdk()
{ {
if (androidConfig().sdkToolsOk()) { if (androidConfig().sdkToolsOk()) {
QMessageBox::warning(this, AndroidSdkDownloader::dialogTitle(), QMessageBox::warning(this, Android::Internal::dialogTitle(),
Tr::tr("The selected path already has a valid SDK Tools package.")); Tr::tr("The selected path already has a valid SDK Tools package."));
validateSdk(); validateSdk();
return; return;
@@ -822,10 +826,10 @@ void AndroidSettingsWidget::downloadSdk()
const QString message = Tr::tr("Download and install Android SDK Tools to %1?") const QString message = Tr::tr("Download and install Android SDK Tools to %1?")
.arg("\n\"" + m_sdkLocationPathChooser->filePath().cleanPath().toUserOutput() .arg("\n\"" + m_sdkLocationPathChooser->filePath().cleanPath().toUserOutput()
+ "\""); + "\"");
auto userInput = QMessageBox::information(this, AndroidSdkDownloader::dialogTitle(), auto userInput = QMessageBox::information(this, Android::Internal::dialogTitle(),
message, QMessageBox::Yes | QMessageBox::No); message, QMessageBox::Yes | QMessageBox::No);
if (userInput == QMessageBox::Yes) if (userInput == QMessageBox::Yes)
m_sdkDownloader.downloadAndExtractSdk(); m_sdkDownloader.start({Android::Internal::downloadSdkRecipe()});
} }
// AndroidSettingsPage // AndroidSettingsPage