From 0a8d675c668e9c3820a5cd6b307766edce098782 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 10 Feb 2020 20:25:24 +0200 Subject: [PATCH] Android: fix Android options page blocking behavior The change 286266 was causing an unwanted modal dialog upon entering Options > Devices page, this fixes that. Also, this fixes the synchronous SDK and AVD list reloading that was causing some hang time upon opening Devices page. Fixes: QTCREATORBUG-23581 Change-Id: I1a55aaadb873c77612aced1c687cc5a0ded3441d Reviewed-by: Christian Stenger --- src/plugins/android/androidsettingswidget.cpp | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index e70a7ce34fb..f00e08e31f8 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -132,6 +132,7 @@ private: bool allEssentialsInstalled(); bool sdkToolsOk() const; Utils::FilePath getDefaultSdkPath(); + void showEvent(QShowEvent *event) override; Ui_AndroidSettingsWidget *m_ui; AndroidSdkManagerWidget *m_sdkManagerWidget = nullptr; @@ -143,6 +144,7 @@ private: QString m_lastAddedAvd; std::unique_ptr m_avdManager; std::unique_ptr m_sdkManager; + bool m_isInitialReloadDone = false; }; enum JavaValidation { @@ -330,7 +332,21 @@ Utils::FilePath AndroidSettingsWidget::getDefaultSdkPath() } return Utils::FilePath::fromString( - QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/Android/Sdk"); + QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + "/Android/Sdk"); +} + +void AndroidSettingsWidget::showEvent(QShowEvent *event) +{ + Q_UNUSED(event) + if (!m_isInitialReloadDone) { + QTimer::singleShot(0, this, &AndroidSettingsWidget::onSdkPathChanged); + + // Reloading SDK packages (force) is still synchronous. Use zero timer + // to let settings dialog open first. + QTimer::singleShot(0, std::bind(&AndroidSdkManager::reloadPackages, + m_sdkManager.get(), true)); + m_isInitialReloadDone = true; + } } void AndroidSettingsWidget::updateNdkList() @@ -398,8 +414,6 @@ AndroidSettingsWidget::AndroidSettingsWidget() m_ui->OpenJDKLocationPathChooser->setFileName(currentJdkPath); m_ui->OpenJDKLocationPathChooser->setPromptDialogTitle(tr("Select JDK Path")); - connect(m_ui->SDKLocationPathChooser, &Utils::PathChooser::rawPathChanged, - this, &AndroidSettingsWidget::onSdkPathChanged); Utils::FilePath currentSDKPath = m_androidConfig.sdkLocation(); if (currentSDKPath.isEmpty()) currentSDKPath = getDefaultSdkPath(); @@ -421,6 +435,8 @@ AndroidSettingsWidget::AndroidSettingsWidget() m_ui->downloadOpenJDKToolButton->setIcon(downloadIcon); m_ui->sdkToolsAutoDownloadButton->setIcon(Utils::Icons::RELOAD.icon()); + connect(m_ui->SDKLocationPathChooser, &Utils::PathChooser::rawPathChanged, + this, &AndroidSettingsWidget::onSdkPathChanged); connect(m_ui->ndkListComboBox, QOverload::of(&QComboBox::currentIndexChanged), [this](const QString) { validateNdk(); }); connect(&m_virtualDevicesWatcher, &QFutureWatcherBase::finished, @@ -464,20 +480,6 @@ AndroidSettingsWidget::AndroidSettingsWidget() } downloadSdk(); }); - - auto startOneShot = QSharedPointer::create(); - *startOneShot = connect(m_sdkManager.get(), - &AndroidSdkManager::packageReloadFinished, [this, startOneShot] { - QObject::disconnect(*startOneShot); - if (!sdkToolsOk()) - downloadSdk(); - }); - - // Reloading SDK packages (force) is still synchronous. Use zero timer to let settings dialog open - // first. - QTimer::singleShot(0, std::bind(&AndroidSdkManager::reloadPackages, m_sdkManager.get(), true)); - - startUpdateAvd(); } AndroidSettingsWidget::~AndroidSettingsWidget() @@ -648,6 +650,7 @@ void AndroidSettingsWidget::validateSdk() } } + startUpdateAvd(); updateNdkList(); validateNdk(); } @@ -769,9 +772,8 @@ void AndroidSettingsWidget::manageAVD() void AndroidSettingsWidget::downloadSdk() { - QString message(tr("Android SDK Tools package is not installed. Do you want to download it?\n" - "The final location: ") - + QDir::toNativeSeparators(m_ui->SDKLocationPathChooser->rawPath())); + QString message(tr("Do you want to download and install Android SDK Tools to: %1?") + .arg(QDir::toNativeSeparators(m_ui->SDKLocationPathChooser->rawPath()))); auto userInput = QMessageBox::information(this, AndroidSdkDownloader::dialogTitle(), message, QMessageBox::Yes | QMessageBox::No); if (userInput == QMessageBox::Yes) {