forked from qt-creator/qt-creator
Android: Enclose the progress dialog inside the recipe
Change-Id: Ibf119550438ab1bb8407fc3fbbdf6bba8d5e7bd8 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
committed by
Alessandro Portale
parent
5f00584b38
commit
53c75898ee
@@ -6,6 +6,7 @@
|
|||||||
#include "androidsdkdownloader.h"
|
#include "androidsdkdownloader.h"
|
||||||
#include "androidtr.h"
|
#include "androidtr.h"
|
||||||
|
|
||||||
|
#include <solutions/tasking/barrier.h>
|
||||||
#include <solutions/tasking/networkquery.h>
|
#include <solutions/tasking/networkquery.h>
|
||||||
|
|
||||||
#include <utils/filepath.h>
|
#include <utils/filepath.h>
|
||||||
@@ -33,17 +34,6 @@ static void logError(const QString &error)
|
|||||||
QMessageBox::warning(Core::ICore::dialogParent(), AndroidSdkDownloader::dialogTitle(), error);
|
QMessageBox::warning(Core::ICore::dialogParent(), AndroidSdkDownloader::dialogTitle(), error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @class SdkDownloader
|
|
||||||
* @brief Download Android SDK tools package from within Qt Creator.
|
|
||||||
*/
|
|
||||||
AndroidSdkDownloader::AndroidSdkDownloader()
|
|
||||||
{
|
|
||||||
connect(&m_taskTreeRunner, &TaskTreeRunner::done, this, [this] { m_progressDialog.reset(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
AndroidSdkDownloader::~AndroidSdkDownloader() = default;
|
|
||||||
|
|
||||||
static bool isHttpRedirect(QNetworkReply *reply)
|
static bool isHttpRedirect(QNetworkReply *reply)
|
||||||
{
|
{
|
||||||
const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
const int statusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
|
||||||
@@ -102,37 +92,39 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_progressDialog.reset(new QProgressDialog(Tr::tr("Downloading SDK Tools package..."),
|
struct StorageStruct
|
||||||
|
{
|
||||||
|
StorageStruct() {
|
||||||
|
progressDialog.reset(new QProgressDialog(Tr::tr("Downloading SDK Tools package..."),
|
||||||
Tr::tr("Cancel"), 0, 100, Core::ICore::dialogParent()));
|
Tr::tr("Cancel"), 0, 100, Core::ICore::dialogParent()));
|
||||||
m_progressDialog->setWindowModality(Qt::ApplicationModal);
|
progressDialog->setWindowModality(Qt::ApplicationModal);
|
||||||
m_progressDialog->setWindowTitle(dialogTitle());
|
progressDialog->setWindowTitle(dialogTitle());
|
||||||
m_progressDialog->setFixedSize(m_progressDialog->sizeHint());
|
progressDialog->setFixedSize(progressDialog->sizeHint());
|
||||||
m_progressDialog->setAutoClose(false);
|
progressDialog->setAutoClose(false);
|
||||||
connect(m_progressDialog.get(), &QProgressDialog::canceled, this, [this] {
|
}
|
||||||
m_taskTreeRunner.reset();
|
std::unique_ptr<QProgressDialog> progressDialog;
|
||||||
m_progressDialog.release()->deleteLater();
|
std::optional<FilePath> sdkFileName;
|
||||||
});
|
};
|
||||||
|
|
||||||
Storage<std::optional<FilePath>> storage;
|
Storage<StorageStruct> storage;
|
||||||
|
|
||||||
const auto onQuerySetup = [this](NetworkQuery &query) {
|
const auto onQuerySetup = [storage](NetworkQuery &query) {
|
||||||
query.setRequest(QNetworkRequest(androidConfig().sdkToolsUrl()));
|
query.setRequest(QNetworkRequest(androidConfig().sdkToolsUrl()));
|
||||||
query.setNetworkAccessManager(NetworkAccessManager::instance());
|
query.setNetworkAccessManager(NetworkAccessManager::instance());
|
||||||
NetworkQuery *queryPtr = &query;
|
NetworkQuery *queryPtr = &query;
|
||||||
connect(queryPtr, &NetworkQuery::started, this, [this, queryPtr] {
|
QProgressDialog *progressDialog = storage->progressDialog.get();
|
||||||
|
connect(queryPtr, &NetworkQuery::started, progressDialog, [queryPtr, progressDialog] {
|
||||||
QNetworkReply *reply = queryPtr->reply();
|
QNetworkReply *reply = queryPtr->reply();
|
||||||
if (!reply)
|
if (!reply)
|
||||||
return;
|
return;
|
||||||
connect(reply, &QNetworkReply::downloadProgress,
|
QObject::connect(reply, &QNetworkReply::downloadProgress,
|
||||||
this, [this](qint64 received, qint64 max) {
|
progressDialog, [progressDialog](qint64 received, qint64 max) {
|
||||||
if (!m_progressDialog)
|
progressDialog->setRange(0, max);
|
||||||
return;
|
progressDialog->setValue(received);
|
||||||
m_progressDialog->setRange(0, max);
|
|
||||||
m_progressDialog->setValue(received);
|
|
||||||
});
|
});
|
||||||
#if QT_CONFIG(ssl)
|
#if QT_CONFIG(ssl)
|
||||||
connect(reply, &QNetworkReply::sslErrors,
|
connect(reply, &QNetworkReply::sslErrors,
|
||||||
this, [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()));
|
||||||
logError(Tr::tr("Encountered SSL errors, download is aborted."));
|
logError(Tr::tr("Encountered SSL errors, download is aborted."));
|
||||||
@@ -142,6 +134,9 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
const auto onQueryDone = [storage](const NetworkQuery &query, DoneWith result) {
|
const auto onQueryDone = [storage](const NetworkQuery &query, DoneWith result) {
|
||||||
|
if (result == DoneWith::Cancel)
|
||||||
|
return;
|
||||||
|
|
||||||
QNetworkReply *reply = query.reply();
|
QNetworkReply *reply = query.reply();
|
||||||
QTC_ASSERT(reply, return);
|
QTC_ASSERT(reply, return);
|
||||||
const QUrl url = reply->url();
|
const QUrl url = reply->url();
|
||||||
@@ -160,15 +155,15 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
|
|||||||
logError(*saveResult);
|
logError(*saveResult);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
*storage = sdkFileName;
|
storage->sdkFileName = sdkFileName;
|
||||||
};
|
};
|
||||||
|
|
||||||
const auto onUnarchiveSetup = [this, storage](Unarchiver &unarchiver) {
|
const auto onUnarchiveSetup = [storage](Unarchiver &unarchiver) {
|
||||||
m_progressDialog->setRange(0, 0);
|
storage->progressDialog->setRange(0, 0);
|
||||||
m_progressDialog->setLabelText(Tr::tr("Unarchiving SDK Tools package..."));
|
storage->progressDialog->setLabelText(Tr::tr("Unarchiving SDK Tools package..."));
|
||||||
if (!*storage)
|
if (!storage->sdkFileName)
|
||||||
return SetupResult::StopWithError;
|
return SetupResult::StopWithError;
|
||||||
const FilePath sdkFileName = **storage;
|
const FilePath sdkFileName = *storage->sdkFileName;
|
||||||
if (!verifyFileIntegrity(sdkFileName, androidConfig().getSdkToolsSha256())) {
|
if (!verifyFileIntegrity(sdkFileName, androidConfig().getSdkToolsSha256())) {
|
||||||
logError(Tr::tr("Verifying the integrity of the downloaded file has failed."));
|
logError(Tr::tr("Verifying the integrity of the downloaded file has failed."));
|
||||||
return SetupResult::StopWithError;
|
return SetupResult::StopWithError;
|
||||||
@@ -183,19 +178,33 @@ void AndroidSdkDownloader::downloadAndExtractSdk()
|
|||||||
return SetupResult::Continue;
|
return SetupResult::Continue;
|
||||||
};
|
};
|
||||||
const auto onUnarchiverDone = [this, storage](DoneWith result) {
|
const auto onUnarchiverDone = [this, storage](DoneWith result) {
|
||||||
|
if (result == DoneWith::Cancel)
|
||||||
|
return;
|
||||||
|
|
||||||
if (result != DoneWith::Success) {
|
if (result != DoneWith::Success) {
|
||||||
logError(Tr::tr("Unarchiving error."));
|
logError(Tr::tr("Unarchiving error."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
androidConfig().setTemporarySdkToolsPath(
|
androidConfig().setTemporarySdkToolsPath(
|
||||||
(*storage)->parentDir().pathAppended(Constants::cmdlineToolsName));
|
storage->sdkFileName->parentDir().pathAppended(Constants::cmdlineToolsName));
|
||||||
QMetaObject::invokeMethod(this, [this] { emit sdkExtracted(); }, Qt::QueuedConnection);
|
QMetaObject::invokeMethod(this, [this] { emit sdkExtracted(); }, Qt::QueuedConnection);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const auto onCanceled = [storage](Barrier &barrier) {
|
||||||
|
// Avoid deleting progress dialog from its signal handler.
|
||||||
|
QObject::connect(storage->progressDialog.get(), &QProgressDialog::canceled,
|
||||||
|
&barrier, &Barrier::advance, Qt::QueuedConnection);
|
||||||
|
};
|
||||||
|
|
||||||
const Group root {
|
const Group root {
|
||||||
storage,
|
storage,
|
||||||
|
parallel,
|
||||||
|
stopOnSuccessOrError,
|
||||||
|
Group {
|
||||||
NetworkQueryTask(onQuerySetup, onQueryDone),
|
NetworkQueryTask(onQuerySetup, onQueryDone),
|
||||||
UnarchiverTask(onUnarchiveSetup, onUnarchiverDone)
|
UnarchiverTask(onUnarchiveSetup, onUnarchiverDone)
|
||||||
|
},
|
||||||
|
BarrierTask(onCanceled, [] { return DoneResult::Error; })
|
||||||
};
|
};
|
||||||
|
|
||||||
m_taskTreeRunner.start(root);
|
m_taskTreeRunner.start(root);
|
||||||
|
|||||||
@@ -5,10 +5,6 @@
|
|||||||
|
|
||||||
#include <solutions/tasking/tasktreerunner.h>
|
#include <solutions/tasking/tasktreerunner.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
|
||||||
class QProgressDialog;
|
|
||||||
QT_END_NAMESPACE
|
|
||||||
|
|
||||||
namespace Android::Internal {
|
namespace Android::Internal {
|
||||||
|
|
||||||
class AndroidSdkDownloader : public QObject
|
class AndroidSdkDownloader : public QObject
|
||||||
@@ -16,9 +12,6 @@ class AndroidSdkDownloader : public QObject
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AndroidSdkDownloader();
|
|
||||||
~AndroidSdkDownloader();
|
|
||||||
|
|
||||||
void downloadAndExtractSdk();
|
void downloadAndExtractSdk();
|
||||||
static QString dialogTitle();
|
static QString dialogTitle();
|
||||||
|
|
||||||
@@ -26,7 +19,6 @@ signals:
|
|||||||
void sdkExtracted();
|
void sdkExtracted();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<QProgressDialog> m_progressDialog;
|
|
||||||
Tasking::TaskTreeRunner m_taskTreeRunner;
|
Tasking::TaskTreeRunner m_taskTreeRunner;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user