Android: Reuse recipes

Change-Id: I9b4a0fdc793a5eb2ea80be38f1a48b51a6bdeeb1
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Jarek Kobus
2024-05-02 14:43:08 +02:00
parent f0ea3a0db5
commit 5b7dbf129d
5 changed files with 88 additions and 99 deletions

View File

@@ -21,6 +21,7 @@
#include <QFutureWatcher>
#include <QDialogButtonBox>
#include <QLoggingCategory>
#include <QMessageBox>
#include <QPlainTextEdit>
#include <QProgressBar>
#include <QReadWriteLock>
@@ -467,14 +468,16 @@ public:
void reloadSdkPackages();
void clearPackages();
void runDialogRecipe(const Storage<DialogStorage> &dialogStorage,
const GroupItem &licenseRecipe, const GroupItem &continuationRecipe);
AndroidSdkManager &m_sdkManager;
AndroidSdkPackageList m_allPackages;
FilePath lastSdkManagerPath;
QByteArray m_licenseUserInput;
mutable QReadWriteLock m_licenseInputLock;
public:
bool m_packageListingSuccessful = false;
TaskTreeRunner m_taskTreeRunner;
};
AndroidSdkManager::AndroidSdkManager()
@@ -927,6 +930,67 @@ void AndroidSdkManagerPrivate::clearPackages()
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 Android

View File

@@ -81,6 +81,9 @@ public:
void cancelOperatons();
void acceptSdkLicense(bool accept);
void runInstallationChange(const InstallationChange &change, const QString &extraMessage = {});
void runUpdate();
signals:
void packageReloadBegin();
void packageReloadFinished();
@@ -91,7 +94,6 @@ private:
std::unique_ptr<AndroidSdkManagerPrivate> m_d;
};
int parseProgress(const QString &out, bool &foundAssertion);
} // namespace Internal
} // namespace Android

View File

@@ -176,7 +176,7 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidSdkManager *sdkManager,
packagesView->collapseAll();
});
connect(updateInstalledButton, &QPushButton::clicked,
this, &AndroidSdkManagerWidget::onUpdateInstalled);
m_sdkManager, &AndroidSdkManager::runUpdate);
connect(showAllRadio, &QRadioButton::toggled, this, [this, proxyModel](bool checked) {
if (checked) {
proxyModel->setAcceptedPackageState(AndroidSdkPackage::AnyValidState);
@@ -205,8 +205,9 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidSdkManager *sdkManager,
expandCheck->setChecked(!text.isEmpty());
});
connect(m_buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked,
this, &AndroidSdkManagerWidget::onApplyButton);
connect(m_buttonBox->button(QDialogButtonBox::Apply), &QAbstractButton::clicked, this, [this] {
m_sdkManager->runInstallationChange(m_sdkModel->installationChange());
});
connect(m_buttonBox, &QDialogButtonBox::rejected, this, &AndroidSdkManagerWidget::onCancel);
connect(optionsButton, &QPushButton::clicked,
@@ -271,22 +272,6 @@ AndroidSdkManagerWidget::~AndroidSdkManagerWidget()
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()
{
m_formatter->appendMessage(Tr::tr("Checking pending licenses...") + "\n", NormalMessageFormat);
@@ -297,76 +282,6 @@ void AndroidSdkManagerWidget::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()
{
cancelPendingOperations();

View File

@@ -70,12 +70,7 @@ public:
AndroidSdkManagerWidget(AndroidSdkManager *sdkManager, QWidget *parent = nullptr);
~AndroidSdkManagerWidget() override;
void installMissingEssentials();
private:
void applyInstallationChange(const InstallationChange &change, const QString &extraMessage = {});
void onApplyButton();
void onUpdateInstalled();
void onCancel();
void onOperationResult(int index);
void onSdkManagerOptions();

View File

@@ -10,6 +10,7 @@
#include "androidtr.h"
#include <coreplugin/dialogs/ioptionspage.h>
#include <coreplugin/icore.h>
#include <coreplugin/messagemanager.h>
#include <projectexplorer/projectexplorerconstants.h>
@@ -669,8 +670,20 @@ void AndroidSettingsWidget::validateSdk()
PlatformSdkInstalledRow,
AllEssentialsInstalledRow});
androidConfig().setSdkFullyConfigured(sdkToolsOk && componentsOk);
if (sdkToolsOk && !componentsOk)
m_sdkManagerWidget->installMissingEssentials();
if (sdkToolsOk && !componentsOk) {
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();
updateUI();