forked from qt-creator/qt-creator
Android: Reuse recipes
Change-Id: I9b4a0fdc793a5eb2ea80be38f1a48b51a6bdeeb1 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -21,6 +21,7 @@
|
|||||||
#include <QFutureWatcher>
|
#include <QFutureWatcher>
|
||||||
#include <QDialogButtonBox>
|
#include <QDialogButtonBox>
|
||||||
#include <QLoggingCategory>
|
#include <QLoggingCategory>
|
||||||
|
#include <QMessageBox>
|
||||||
#include <QPlainTextEdit>
|
#include <QPlainTextEdit>
|
||||||
#include <QProgressBar>
|
#include <QProgressBar>
|
||||||
#include <QReadWriteLock>
|
#include <QReadWriteLock>
|
||||||
@@ -467,14 +468,16 @@ public:
|
|||||||
void reloadSdkPackages();
|
void reloadSdkPackages();
|
||||||
void clearPackages();
|
void clearPackages();
|
||||||
|
|
||||||
|
void runDialogRecipe(const Storage<DialogStorage> &dialogStorage,
|
||||||
|
const GroupItem &licenseRecipe, const GroupItem &continuationRecipe);
|
||||||
|
|
||||||
AndroidSdkManager &m_sdkManager;
|
AndroidSdkManager &m_sdkManager;
|
||||||
AndroidSdkPackageList m_allPackages;
|
AndroidSdkPackageList m_allPackages;
|
||||||
FilePath lastSdkManagerPath;
|
FilePath lastSdkManagerPath;
|
||||||
QByteArray m_licenseUserInput;
|
QByteArray m_licenseUserInput;
|
||||||
mutable QReadWriteLock m_licenseInputLock;
|
mutable QReadWriteLock m_licenseInputLock;
|
||||||
|
|
||||||
public:
|
|
||||||
bool m_packageListingSuccessful = false;
|
bool m_packageListingSuccessful = false;
|
||||||
|
TaskTreeRunner m_taskTreeRunner;
|
||||||
};
|
};
|
||||||
|
|
||||||
AndroidSdkManager::AndroidSdkManager()
|
AndroidSdkManager::AndroidSdkManager()
|
||||||
@@ -927,6 +930,67 @@ void AndroidSdkManagerPrivate::clearPackages()
|
|||||||
m_allPackages.clear();
|
m_allPackages.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AndroidSdkManagerPrivate::runDialogRecipe(const Storage<DialogStorage> &dialogStorage,
|
||||||
|
const GroupItem &licensesRecipe,
|
||||||
|
const GroupItem &continuationRecipe)
|
||||||
|
{
|
||||||
|
const auto onCancelSetup = [dialogStorage] {
|
||||||
|
return std::make_pair(dialogStorage->m_dialog.get(), &QDialog::rejected);
|
||||||
|
};
|
||||||
|
const Group root {
|
||||||
|
dialogStorage,
|
||||||
|
Group {
|
||||||
|
licensesRecipe,
|
||||||
|
Sync([dialogStorage] { dialogStorage->m_dialog->setQuestionVisible(false); }),
|
||||||
|
continuationRecipe
|
||||||
|
}.withCancel(onCancelSetup)
|
||||||
|
};
|
||||||
|
m_taskTreeRunner.start(root, {}, [this](DoneWith) {
|
||||||
|
QMetaObject::invokeMethod(&m_sdkManager, &AndroidSdkManager::reloadPackages,
|
||||||
|
Qt::QueuedConnection);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidSdkManager::runInstallationChange(const InstallationChange &change,
|
||||||
|
const QString &extraMessage)
|
||||||
|
{
|
||||||
|
QString message = Tr::tr("%n Android SDK packages shall be updated.", "", change.count());
|
||||||
|
if (!extraMessage.isEmpty())
|
||||||
|
message.prepend(extraMessage + "\n\n");
|
||||||
|
|
||||||
|
QMessageBox messageDlg(QMessageBox::Information, Tr::tr("Android SDK Changes"),
|
||||||
|
message, QMessageBox::Ok | QMessageBox::Cancel,
|
||||||
|
Core::ICore::dialogParent());
|
||||||
|
|
||||||
|
QString details;
|
||||||
|
if (!change.toUninstall.isEmpty()) {
|
||||||
|
QStringList toUninstall = {Tr::tr("[Packages to be uninstalled:]")};
|
||||||
|
toUninstall += change.toUninstall;
|
||||||
|
details += toUninstall.join("\n ");
|
||||||
|
}
|
||||||
|
if (!change.toInstall.isEmpty()) {
|
||||||
|
if (!change.toUninstall.isEmpty())
|
||||||
|
details.append("\n\n");
|
||||||
|
QStringList toInstall = {Tr::tr("[Packages to be installed:]")};
|
||||||
|
toInstall += change.toInstall;
|
||||||
|
details += toInstall.join("\n ");
|
||||||
|
}
|
||||||
|
messageDlg.setDetailedText(details);
|
||||||
|
if (messageDlg.exec() == QMessageBox::Cancel)
|
||||||
|
return;
|
||||||
|
|
||||||
|
const Storage<DialogStorage> dialogStorage;
|
||||||
|
m_d->runDialogRecipe(dialogStorage,
|
||||||
|
change.toInstall.count() ? licensesRecipe(dialogStorage) : nullItem,
|
||||||
|
installationRecipe(dialogStorage, change));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AndroidSdkManager::runUpdate()
|
||||||
|
{
|
||||||
|
const Storage<DialogStorage> dialogStorage;
|
||||||
|
m_d->runDialogRecipe(dialogStorage, licensesRecipe(dialogStorage), updateRecipe(dialogStorage));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace Android
|
} // namespace Android
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,9 @@ public:
|
|||||||
void cancelOperatons();
|
void cancelOperatons();
|
||||||
void acceptSdkLicense(bool accept);
|
void acceptSdkLicense(bool accept);
|
||||||
|
|
||||||
|
void runInstallationChange(const InstallationChange &change, const QString &extraMessage = {});
|
||||||
|
void runUpdate();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void packageReloadBegin();
|
void packageReloadBegin();
|
||||||
void packageReloadFinished();
|
void packageReloadFinished();
|
||||||
@@ -91,7 +94,6 @@ private:
|
|||||||
std::unique_ptr<AndroidSdkManagerPrivate> m_d;
|
std::unique_ptr<AndroidSdkManagerPrivate> m_d;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int parseProgress(const QString &out, bool &foundAssertion);
|
int parseProgress(const QString &out, bool &foundAssertion);
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
} // namespace Android
|
} // namespace Android
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidSdkManager *sdkManager,
|
|||||||
packagesView->collapseAll();
|
packagesView->collapseAll();
|
||||||
});
|
});
|
||||||
connect(updateInstalledButton, &QPushButton::clicked,
|
connect(updateInstalledButton, &QPushButton::clicked,
|
||||||
this, &AndroidSdkManagerWidget::onUpdateInstalled);
|
m_sdkManager, &AndroidSdkManager::runUpdate);
|
||||||
connect(showAllRadio, &QRadioButton::toggled, this, [this, proxyModel](bool checked) {
|
connect(showAllRadio, &QRadioButton::toggled, this, [this, proxyModel](bool checked) {
|
||||||
if (checked) {
|
if (checked) {
|
||||||
proxyModel->setAcceptedPackageState(AndroidSdkPackage::AnyValidState);
|
proxyModel->setAcceptedPackageState(AndroidSdkPackage::AnyValidState);
|
||||||
@@ -205,8 +205,9 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidSdkManager *sdkManager,
|
|||||||
expandCheck->setChecked(!text.isEmpty());
|
expandCheck->setChecked(!text.isEmpty());
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(m_buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked,
|
connect(m_buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, [this] {
|
||||||
this, &AndroidSdkManagerWidget::onApplyButton);
|
m_sdkManager->runInstallationChange(m_sdkModel->installationChange());
|
||||||
|
});
|
||||||
connect(m_buttonBox, &QDialogButtonBox::rejected, this, &AndroidSdkManagerWidget::onCancel);
|
connect(m_buttonBox, &QDialogButtonBox::rejected, this, &AndroidSdkManagerWidget::onCancel);
|
||||||
|
|
||||||
connect(optionsButton, &QPushButton::clicked,
|
connect(optionsButton, &QPushButton::clicked,
|
||||||
@@ -271,22 +272,6 @@ AndroidSdkManagerWidget::~AndroidSdkManagerWidget()
|
|||||||
delete m_formatter;
|
delete m_formatter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidSdkManagerWidget::installMissingEssentials()
|
|
||||||
{
|
|
||||||
const QStringList notFoundEssentials = m_sdkManager->notFoundEssentialSdkPackages();
|
|
||||||
if (!notFoundEssentials.isEmpty()) {
|
|
||||||
QMessageBox::warning(Core::ICore::dialogParent(),
|
|
||||||
Tr::tr("Android SDK Changes"),
|
|
||||||
Tr::tr("%1 cannot find the following essential packages: \"%2\".\n"
|
|
||||||
"Install them manually after the current operation is done.\n")
|
|
||||||
.arg(QGuiApplication::applicationDisplayName(),
|
|
||||||
notFoundEssentials.join("\", \"")));
|
|
||||||
}
|
|
||||||
applyInstallationChange({m_sdkManager->missingEssentialSdkPackages()},
|
|
||||||
Tr::tr("Android SDK installation is missing necessary packages. "
|
|
||||||
"Do you want to install the missing packages?"));
|
|
||||||
}
|
|
||||||
|
|
||||||
void AndroidSdkManagerWidget::licenseCheck()
|
void AndroidSdkManagerWidget::licenseCheck()
|
||||||
{
|
{
|
||||||
m_formatter->appendMessage(Tr::tr("Checking pending licenses...") + "\n", NormalMessageFormat);
|
m_formatter->appendMessage(Tr::tr("Checking pending licenses...") + "\n", NormalMessageFormat);
|
||||||
@@ -297,76 +282,6 @@ void AndroidSdkManagerWidget::licenseCheck()
|
|||||||
addPackageFuture(m_sdkManager->licenseCheck());
|
addPackageFuture(m_sdkManager->licenseCheck());
|
||||||
}
|
}
|
||||||
|
|
||||||
void AndroidSdkManagerWidget::applyInstallationChange(const InstallationChange &change,
|
|
||||||
const QString &extraMessage)
|
|
||||||
{
|
|
||||||
m_installationChange = change;
|
|
||||||
|
|
||||||
if (m_sdkManager->isBusy()) {
|
|
||||||
m_formatter->appendMessage("\n" + Tr::tr("SDK Manager is busy."), StdErrFormat);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_installationChange.count() == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
QString message = Tr::tr("%n Android SDK packages shall be updated.", "", change.count());
|
|
||||||
if (!extraMessage.isEmpty())
|
|
||||||
message.prepend(extraMessage + "\n\n");
|
|
||||||
|
|
||||||
QMessageBox messageDlg(QMessageBox::Information, Tr::tr("Android SDK Changes"),
|
|
||||||
message, QMessageBox::Ok | QMessageBox::Cancel,
|
|
||||||
Core::ICore::dialogParent());
|
|
||||||
|
|
||||||
QString details;
|
|
||||||
if (!change.toUninstall.isEmpty()) {
|
|
||||||
QStringList toUninstall = {Tr::tr("[Packages to be uninstalled:]")};
|
|
||||||
toUninstall += change.toUninstall;
|
|
||||||
details += toUninstall.join("\n ");
|
|
||||||
}
|
|
||||||
if (!change.toInstall.isEmpty()) {
|
|
||||||
if (!change.toUninstall.isEmpty())
|
|
||||||
details.append("\n\n");
|
|
||||||
QStringList toInstall = {Tr::tr("[Packages to be installed:]")};
|
|
||||||
toInstall += change.toInstall;
|
|
||||||
details += toInstall.join("\n ");
|
|
||||||
}
|
|
||||||
messageDlg.setDetailedText(details);
|
|
||||||
if (messageDlg.exec() == QMessageBox::Cancel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Open the SDK Manager dialog after accepting to continue with the installation
|
|
||||||
show();
|
|
||||||
|
|
||||||
switchView(Operations);
|
|
||||||
m_pendingCommand = AndroidSdkManager::UpdatePackages;
|
|
||||||
// User agreed with the selection. Check for licenses.
|
|
||||||
if (!change.toInstall.isEmpty()) {
|
|
||||||
// Pending license affects installtion only.
|
|
||||||
licenseCheck();
|
|
||||||
} else {
|
|
||||||
// Uninstall only. Go Ahead.
|
|
||||||
updatePackages();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AndroidSdkManagerWidget::onApplyButton()
|
|
||||||
{
|
|
||||||
QTC_ASSERT(m_currentView == PackageListing, return);
|
|
||||||
applyInstallationChange(m_sdkModel->installationChange());
|
|
||||||
}
|
|
||||||
|
|
||||||
void AndroidSdkManagerWidget::onUpdateInstalled()
|
|
||||||
{
|
|
||||||
if (m_sdkManager->isBusy()) {
|
|
||||||
m_formatter->appendMessage("\n" + Tr::tr("SDK Manager is busy."), StdErrFormat);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
switchView(Operations);
|
|
||||||
m_pendingCommand = AndroidSdkManager::UpdateInstalled;
|
|
||||||
licenseCheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AndroidSdkManagerWidget::onCancel()
|
void AndroidSdkManagerWidget::onCancel()
|
||||||
{
|
{
|
||||||
cancelPendingOperations();
|
cancelPendingOperations();
|
||||||
|
|||||||
@@ -70,12 +70,7 @@ public:
|
|||||||
AndroidSdkManagerWidget(AndroidSdkManager *sdkManager, QWidget *parent = nullptr);
|
AndroidSdkManagerWidget(AndroidSdkManager *sdkManager, QWidget *parent = nullptr);
|
||||||
~AndroidSdkManagerWidget() override;
|
~AndroidSdkManagerWidget() override;
|
||||||
|
|
||||||
void installMissingEssentials();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void applyInstallationChange(const InstallationChange &change, const QString &extraMessage = {});
|
|
||||||
void onApplyButton();
|
|
||||||
void onUpdateInstalled();
|
|
||||||
void onCancel();
|
void onCancel();
|
||||||
void onOperationResult(int index);
|
void onOperationResult(int index);
|
||||||
void onSdkManagerOptions();
|
void onSdkManagerOptions();
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "androidtr.h"
|
#include "androidtr.h"
|
||||||
|
|
||||||
#include <coreplugin/dialogs/ioptionspage.h>
|
#include <coreplugin/dialogs/ioptionspage.h>
|
||||||
|
#include <coreplugin/icore.h>
|
||||||
#include <coreplugin/messagemanager.h>
|
#include <coreplugin/messagemanager.h>
|
||||||
|
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
@@ -669,8 +670,20 @@ void AndroidSettingsWidget::validateSdk()
|
|||||||
PlatformSdkInstalledRow,
|
PlatformSdkInstalledRow,
|
||||||
AllEssentialsInstalledRow});
|
AllEssentialsInstalledRow});
|
||||||
androidConfig().setSdkFullyConfigured(sdkToolsOk && componentsOk);
|
androidConfig().setSdkFullyConfigured(sdkToolsOk && componentsOk);
|
||||||
if (sdkToolsOk && !componentsOk)
|
if (sdkToolsOk && !componentsOk) {
|
||||||
m_sdkManagerWidget->installMissingEssentials();
|
const QStringList notFoundEssentials = m_sdkManager.notFoundEssentialSdkPackages();
|
||||||
|
if (!notFoundEssentials.isEmpty()) {
|
||||||
|
QMessageBox::warning(Core::ICore::dialogParent(),
|
||||||
|
Tr::tr("Android SDK Changes"),
|
||||||
|
Tr::tr("%1 cannot find the following essential packages: \"%2\".\n"
|
||||||
|
"Install them manually after the current operation is done.\n")
|
||||||
|
.arg(QGuiApplication::applicationDisplayName(),
|
||||||
|
notFoundEssentials.join("\", \"")));
|
||||||
|
}
|
||||||
|
m_sdkManager.runInstallationChange({m_sdkManager.missingEssentialSdkPackages()},
|
||||||
|
Tr::tr("Android SDK installation is missing necessary packages. "
|
||||||
|
"Do you want to install the missing packages?"));
|
||||||
|
}
|
||||||
|
|
||||||
updateNdkList();
|
updateNdkList();
|
||||||
updateUI();
|
updateUI();
|
||||||
|
|||||||
Reference in New Issue
Block a user