Android: Simplify SDK setup process by minimizing number of dialogs

SDK setup process currently downloads the SDK tools, then checks
the mandatory packages, asks the user if they want to install them,
then show a dialog with package details, then asks again whether
the user wants to check the licenses.

The following two steps are redundant because there's a dialog which
guards the package installation and waits for user's input:
* Asking the user if they want to install the mandatory packages
* Asking the user if they want to verify the licenses

Change-Id: If06c0adea9444107a149c3ec32be67061954d1bb
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Assam Boudjelthia
2022-01-30 11:37:39 +02:00
parent 4a228ab764
commit ef003ba769
3 changed files with 18 additions and 31 deletions

View File

@@ -137,7 +137,7 @@ AndroidSdkManagerWidget::AndroidSdkManagerWidget(AndroidConfig &config,
}); });
connect(m_ui->applySelectionButton, &QPushButton::clicked, connect(m_ui->applySelectionButton, &QPushButton::clicked,
this, &AndroidSdkManagerWidget::onApplyButton); this, [this]() { onApplyButton(); });
connect(m_ui->cancelButton, &QPushButton::clicked, this, connect(m_ui->cancelButton, &QPushButton::clicked, this,
&AndroidSdkManagerWidget::onCancel); &AndroidSdkManagerWidget::onCancel);
connect(m_ui->optionsButton, &QPushButton::clicked, connect(m_ui->optionsButton, &QPushButton::clicked,
@@ -204,7 +204,7 @@ AndroidSdkManagerWidget::~AndroidSdkManagerWidget()
delete m_ui; delete m_ui;
} }
void AndroidSdkManagerWidget::installEssentials() void AndroidSdkManagerWidget::installEssentials(const QString &extraMessage)
{ {
m_sdkModel->selectMissingEssentials(); m_sdkModel->selectMissingEssentials();
if (!m_sdkModel->missingEssentials().isEmpty()) { if (!m_sdkModel->missingEssentials().isEmpty()) {
@@ -215,16 +215,19 @@ void AndroidSdkManagerWidget::installEssentials()
.arg(Core::Constants::IDE_DISPLAY_NAME) .arg(Core::Constants::IDE_DISPLAY_NAME)
.arg(m_sdkModel->missingEssentials().join("\", \""))); .arg(m_sdkModel->missingEssentials().join("\", \"")));
} }
onApplyButton(); onApplyButton(extraMessage);
} }
void AndroidSdkManagerWidget::beginLicenseCheck() void AndroidSdkManagerWidget::beginLicenseCheck()
{ {
m_formatter->appendMessage(tr("Checking pending licenses...\n"), Utils::NormalMessageFormat); m_formatter->appendMessage(tr("Checking pending licenses...\n"), Utils::NormalMessageFormat);
m_formatter->appendMessage(tr("The installation of Android SDK packages may fail if the "
"respective licenses are not accepted.\n"),
Utils::LogMessageFormat);
addPackageFuture(m_sdkManager->checkPendingLicenses()); addPackageFuture(m_sdkManager->checkPendingLicenses());
} }
void AndroidSdkManagerWidget::onApplyButton() void AndroidSdkManagerWidget::onApplyButton(const QString &extraMessage)
{ {
QTC_ASSERT(m_currentView == PackageListing, return); QTC_ASSERT(m_currentView == PackageListing, return);
@@ -246,10 +249,11 @@ void AndroidSdkManagerWidget::onApplyButton()
installPackages << str; installPackages << str;
} }
QString message = tr("%n Android SDK packages shall be updated.", "", packagesToUpdate.count());
if (!extraMessage.isEmpty())
message.prepend(extraMessage + "\n\n");
QMessageBox messageDlg(QMessageBox::Information, tr("Android SDK Changes"), QMessageBox messageDlg(QMessageBox::Information, tr("Android SDK Changes"),
tr("%n Android SDK packages shall be updated.", message, QMessageBox::Ok | QMessageBox::Cancel, this);
"", packagesToUpdate.count()),
QMessageBox::Ok | QMessageBox::Cancel, this);
QString details; QString details;
if (!uninstallPackages.isEmpty()) if (!uninstallPackages.isEmpty())
@@ -317,20 +321,8 @@ void AndroidSdkManagerWidget::onLicenseCheckResult(const AndroidSdkManager::Oper
// No assertion was found. Looks like all license are accepted. Go Ahead. // No assertion was found. Looks like all license are accepted. Go Ahead.
runPendingCommand(); runPendingCommand();
} else { } else {
// Assertion was found. Provide user workflow to accept licenses.
QString warningMessage = tr("Review Android SDK package licenses that have not been "
"accepted?\nNote that the installation and use of "
"Android SDK packages may fail if respective licenses are not "
"accepted.");
int userSelection = QMessageBox::question(this, tr("Android SDK Licenses"), warningMessage,
QMessageBox::Yes | QMessageBox::No);
if (userSelection == QMessageBox::Yes) {
// Run license workflow. // Run license workflow.
beginLicenseWorkflow(); beginLicenseWorkflow();
} else {
// User decided to go ahead anyways.
runPendingCommand();
}
} }
} }

View File

@@ -80,7 +80,7 @@ public:
QWidget *parent = nullptr); QWidget *parent = nullptr);
~AndroidSdkManagerWidget() override; ~AndroidSdkManagerWidget() override;
void installEssentials(); void installEssentials(const QString &extraMessage = {});
signals: signals:
void updatingSdk(); void updatingSdk();
@@ -88,7 +88,7 @@ signals:
void licenseWorkflowStarted(); void licenseWorkflowStarted();
private: private:
void onApplyButton(); void onApplyButton(const QString &extraMessage = {});
void onUpdatePackages(); void onUpdatePackages();
void onCancel(); void onCancel();
void onOperationResult(int index); void onOperationResult(int index);

View File

@@ -544,14 +544,9 @@ void AndroidSettingsWidget::validateSdk()
AllEssentialsInstalledRow}); AllEssentialsInstalledRow});
m_androidConfig.setSdkFullyConfigured(sdkToolsOk && componentsOk); m_androidConfig.setSdkFullyConfigured(sdkToolsOk && componentsOk);
if (sdkToolsOk && !componentsOk) { if (sdkToolsOk && !componentsOk) {
// Ask user to install essential SDK components. Works only for sdk tools version >= 26.0.0 m_sdkManagerWidget->installEssentials(
QString message = tr("Android SDK installation is missing necessary packages. Do you " "Android SDK installation is missing necessary packages. "
"want to install the missing packages?"); "Do you want to install the missing packages?");
auto userInput = QMessageBox::information(this, tr("Missing Android SDK Packages"),
message, QMessageBox::Yes | QMessageBox::No);
if (userInput == QMessageBox::Yes) {
m_sdkManagerWidget->installEssentials();
}
} }
updateNdkList(); updateNdkList();