diff --git a/src/plugins/android/androidsdkdownloader.cpp b/src/plugins/android/androidsdkdownloader.cpp index 32fe9a9fd66..8eb03412696 100644 --- a/src/plugins/android/androidsdkdownloader.cpp +++ b/src/plugins/android/androidsdkdownloader.cpp @@ -31,7 +31,7 @@ namespace Android::Internal { static void logError(const QString &error) { 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) @@ -85,7 +85,7 @@ static bool verifyFileIntegrity(const FilePath fileName, const QByteArray &sha25 return false; } -void AndroidSdkDownloader::downloadAndExtractSdk() +GroupItem downloadSdkRecipe() { struct StorageStruct { @@ -96,6 +96,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk() progressDialog->setWindowTitle(dialogTitle()); progressDialog->setFixedSize(progressDialog->sizeHint()); progressDialog->setAutoClose(false); + progressDialog->show(); // TODO: Should not be needed. Investigate possible QT_BUG } std::unique_ptr progressDialog; std::optional sdkFileName; @@ -116,7 +117,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk() query.setNetworkAccessManager(NetworkAccessManager::instance()); NetworkQuery *queryPtr = &query; QProgressDialog *progressDialog = storage->progressDialog.get(); - connect(queryPtr, &NetworkQuery::started, progressDialog, [queryPtr, progressDialog] { + QObject::connect(queryPtr, &NetworkQuery::started, progressDialog, [queryPtr, progressDialog] { QNetworkReply *reply = queryPtr->reply(); if (!reply) return; @@ -126,7 +127,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk() progressDialog->setValue(received); }); #if QT_CONFIG(ssl) - connect(reply, &QNetworkReply::sslErrors, + QObject::connect(reply, &QNetworkReply::sslErrors, reply, [reply](const QList &sslErrors) { for (const QSslError &error : sslErrors) qCDebug(sdkDownloaderLog, "SSL error: %s\n", qPrintable(error.errorString())); @@ -180,7 +181,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk() unarchiver.setDestDir(sdkFileName.parentDir()); return SetupResult::Continue; }; - const auto onUnarchiverDone = [this, storage](DoneWith result) { + const auto onUnarchiverDone = [storage](DoneWith result) { if (result == DoneWith::Cancel) return; @@ -190,7 +191,6 @@ void AndroidSdkDownloader::downloadAndExtractSdk() } androidConfig().setTemporarySdkToolsPath( storage->sdkFileName->parentDir().pathAppended(Constants::cmdlineToolsName)); - QMetaObject::invokeMethod(this, [this] { emit sdkExtracted(); }, Qt::QueuedConnection); }; const auto onCanceled = [storage](Barrier &barrier) { @@ -199,7 +199,7 @@ void AndroidSdkDownloader::downloadAndExtractSdk() &barrier, &Barrier::advance, Qt::QueuedConnection); }; - const Group root { + return Group { storage, parallel, stopOnSuccessOrError, @@ -210,13 +210,8 @@ void AndroidSdkDownloader::downloadAndExtractSdk() }, BarrierTask(onCanceled, [] { return DoneResult::Error; }) }; - - m_taskTreeRunner.start(root); } -QString AndroidSdkDownloader::dialogTitle() -{ - return Tr::tr("Download SDK Tools"); -} +QString dialogTitle() { return Tr::tr("Download SDK Tools"); } } // namespace Android::Internal diff --git a/src/plugins/android/androidsdkdownloader.h b/src/plugins/android/androidsdkdownloader.h index 1dbc0a7991a..e156420db71 100644 --- a/src/plugins/android/androidsdkdownloader.h +++ b/src/plugins/android/androidsdkdownloader.h @@ -3,23 +3,13 @@ #pragma once -#include +#include + +namespace Tasking { class GroupItem; } namespace Android::Internal { -class AndroidSdkDownloader : public QObject -{ - Q_OBJECT - -public: - void downloadAndExtractSdk(); - static QString dialogTitle(); - -signals: - void sdkExtracted(); - -private: - Tasking::TaskTreeRunner m_taskTreeRunner; -}; +Tasking::GroupItem downloadSdkRecipe(); +QString dialogTitle(); } // namespace Android::Internal diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index a81205e5a96..ce572a0888e 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -14,6 +14,8 @@ #include +#include + #include #include #include @@ -183,7 +185,7 @@ private: AndroidSdkManagerWidget *m_sdkManagerWidget = nullptr; AndroidSdkManager m_sdkManager; - AndroidSdkDownloader m_sdkDownloader; + Tasking::TaskTreeRunner m_sdkDownloader; bool m_isInitialReloadDone = false; SummaryWidget *m_androidSummary = nullptr; @@ -500,11 +502,13 @@ AndroidSettingsWidget::AndroidSettingsWidget() this, [this] { m_sdkManagerWidget->exec(); }); connect(sdkToolsAutoDownloadButton, &QAbstractButton::clicked, 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 const FilePath sdkPath = androidConfig().sdkLocation(); if (!sdkPath.createDir()) { - QMessageBox::warning(this, AndroidSdkDownloader::dialogTitle(), + QMessageBox::warning(this, Android::Internal::dialogTitle(), Tr::tr("Failed to create the SDK Tools path %1.") .arg("\n\"" + sdkPath.toUserOutput() + "\"")); } @@ -813,7 +817,7 @@ void AndroidSettingsWidget::updateUI() void AndroidSettingsWidget::downloadSdk() { 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.")); validateSdk(); return; @@ -822,10 +826,10 @@ void AndroidSettingsWidget::downloadSdk() const QString message = Tr::tr("Download and install Android SDK Tools to %1?") .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); if (userInput == QMessageBox::Yes) - m_sdkDownloader.downloadAndExtractSdk(); + m_sdkDownloader.start({Android::Internal::downloadSdkRecipe()}); } // AndroidSettingsPage