Android: Reuse static instance of AndroidSdkManager

Use the instance from AndroidConfigurations inside
AndroidSettingsWidget.

This prevents recursive call to reloadPackages() in both
instances.

Minimize the chaos by reordering update items for m_androidSummary field
inside validateSdk(), to match the original order of creation.

Change-Id: I6253043c278e2e503e9114fbdc11ea17f9df4d8e
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
This commit is contained in:
Jarek Kobus
2024-10-24 17:33:08 +02:00
parent 61ea74d6a9
commit ca8e5dbb4e
2 changed files with 24 additions and 24 deletions

View File

@@ -338,7 +338,6 @@ public:
AndroidSdkPackageList filteredPackages(AndroidSdkPackage::PackageState state, AndroidSdkPackageList filteredPackages(AndroidSdkPackage::PackageState state,
AndroidSdkPackage::PackageType type) AndroidSdkPackage::PackageType type)
{ {
m_sdkManager.refreshPackages();
return Utils::filtered(m_allPackages, [state, type](const AndroidSdkPackage *p) { return Utils::filtered(m_allPackages, [state, type](const AndroidSdkPackage *p) {
return p->state() & state && p->type() & type; return p->state() & state && p->type() & type;
}); });
@@ -469,6 +468,8 @@ void AndroidSdkManager::refreshPackages()
{ {
if (AndroidConfig::sdkManagerToolPath() != m_d->lastSdkManagerPath) if (AndroidConfig::sdkManagerToolPath() != m_d->lastSdkManagerPath)
reloadPackages(); reloadPackages();
else
emit packageReloadFinished();
} }
void AndroidSdkManager::reloadPackages() void AndroidSdkManager::reloadPackages()
@@ -512,7 +513,6 @@ AndroidSdkManagerPrivate::~AndroidSdkManagerPrivate()
const AndroidSdkPackageList &AndroidSdkManagerPrivate::allPackages() const AndroidSdkPackageList &AndroidSdkManagerPrivate::allPackages()
{ {
m_sdkManager.refreshPackages();
return m_allPackages; return m_allPackages;
} }

View File

@@ -47,8 +47,6 @@
#include <QUrl> #include <QUrl>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <memory>
using namespace Utils; using namespace Utils;
namespace Android::Internal { namespace Android::Internal {
@@ -183,7 +181,7 @@ private:
bool isDefaultNdkSelected() const; bool isDefaultNdkSelected() const;
void validateOpenSsl(); void validateOpenSsl();
AndroidSdkManager m_sdkManager; AndroidSdkManager *m_sdkManager;
Tasking::TaskTreeRunner m_sdkDownloader; Tasking::TaskTreeRunner m_sdkDownloader;
bool m_isInitialReloadDone = false; bool m_isInitialReloadDone = false;
@@ -268,6 +266,7 @@ static expected_str<void> testJavaC(const FilePath &jdkPath)
AndroidSettingsWidget::AndroidSettingsWidget() AndroidSettingsWidget::AndroidSettingsWidget()
{ {
m_sdkManager = AndroidConfigurations::sdkManager();
setWindowTitle(Tr::tr("Android Configuration")); setWindowTitle(Tr::tr("Android Configuration"));
const QIcon downloadIcon = Icons::ONLINE.icon(); const QIcon downloadIcon = Icons::ONLINE.icon();
@@ -487,16 +486,16 @@ AndroidSettingsWidget::AndroidSettingsWidget()
this, &AndroidSettingsWidget::openOpenJDKDownloadUrl); this, &AndroidSettingsWidget::openOpenJDKDownloadUrl);
// Validate SDK again after any change in SDK packages. // Validate SDK again after any change in SDK packages.
connect(&m_sdkManager, &AndroidSdkManager::packageReloadFinished, connect(m_sdkManager, &AndroidSdkManager::packageReloadFinished,
this, &AndroidSettingsWidget::validateSdk); this, &AndroidSettingsWidget::validateSdk);
connect(&m_sdkManager, &AndroidSdkManager::packageReloadFinished, connect(m_sdkManager, &AndroidSdkManager::packageReloadFinished,
m_androidProgress, &ProgressIndicator::hide); m_androidProgress, &ProgressIndicator::hide);
connect(&m_sdkManager, &AndroidSdkManager::packageReloadBegin, this, [this] { connect(m_sdkManager, &AndroidSdkManager::packageReloadBegin, this, [this] {
m_androidSummary->setInProgressText("Retrieving packages information"); m_androidSummary->setInProgressText("Retrieving packages information");
m_androidProgress->show(); m_androidProgress->show();
}); });
connect(sdkManagerToolButton, &QAbstractButton::clicked, this, [this] { connect(sdkManagerToolButton, &QAbstractButton::clicked, this, [this] {
executeAndroidSdkManagerDialog(&m_sdkManager, this); executeAndroidSdkManagerDialog(m_sdkManager, this);
}); });
connect(sdkToolsAutoDownloadButton, &QAbstractButton::clicked, connect(sdkToolsAutoDownloadButton, &QAbstractButton::clicked,
this, &AndroidSettingsWidget::downloadSdk); this, &AndroidSettingsWidget::downloadSdk);
@@ -510,11 +509,11 @@ AndroidSettingsWidget::AndroidSettingsWidget()
Tr::tr("Failed to create the SDK Tools path %1.") Tr::tr("Failed to create the SDK Tools path %1.")
.arg("\n\"" + sdkPath.toUserOutput() + "\"")); .arg("\n\"" + sdkPath.toUserOutput() + "\""));
} }
m_sdkManager.reloadPackages(); m_sdkManager->reloadPackages();
updateUI(); updateUI();
apply(); apply();
connect(&m_sdkManager, &AndroidSdkManager::packageReloadFinished, this, [this] { connect(m_sdkManager, &AndroidSdkManager::packageReloadFinished, this, [this] {
downloadOpenSslRepo(true); downloadOpenSslRepo(true);
}, Qt::SingleShotConnection); }, Qt::SingleShotConnection);
}); });
@@ -529,7 +528,7 @@ void AndroidSettingsWidget::showEvent(QShowEvent *event)
validateJdk(); validateJdk();
// Reloading SDK packages (force) is still synchronous. Use zero timer // Reloading SDK packages (force) is still synchronous. Use zero timer
// to let settings dialog open first. // to let settings dialog open first.
QTimer::singleShot(0, &m_sdkManager, &AndroidSdkManager::refreshPackages); QTimer::singleShot(0, m_sdkManager, &AndroidSdkManager::refreshPackages);
validateOpenSsl(); validateOpenSsl();
m_isInitialReloadDone = true; m_isInitialReloadDone = true;
} }
@@ -538,7 +537,7 @@ void AndroidSettingsWidget::showEvent(QShowEvent *event)
void AndroidSettingsWidget::updateNdkList() void AndroidSettingsWidget::updateNdkList()
{ {
m_ndkListWidget->clear(); m_ndkListWidget->clear();
const auto installedPkgs = m_sdkManager.installedNdkPackages(); const auto installedPkgs = m_sdkManager->installedNdkPackages();
for (const Ndk *ndk : installedPkgs) { for (const Ndk *ndk : installedPkgs) {
m_ndkListWidget->addItem(new QListWidgetItem(Icons::LOCKED.icon(), m_ndkListWidget->addItem(new QListWidgetItem(Icons::LOCKED.icon(),
ndk->installedLocation().toUserOutput())); ndk->installedLocation().toUserOutput()));
@@ -601,7 +600,7 @@ void AndroidSettingsWidget::validateJdk()
updateUI(); updateUI();
if (m_isInitialReloadDone) if (m_isInitialReloadDone)
m_sdkManager.reloadPackages(); m_sdkManager->reloadPackages();
} }
void AndroidSettingsWidget::validateOpenSsl() void AndroidSettingsWidget::validateOpenSsl()
@@ -628,7 +627,7 @@ void AndroidSettingsWidget::onSdkPathChanged()
currentOpenSslPath = sdkPath.pathAppended("android_openssl"); currentOpenSslPath = sdkPath.pathAppended("android_openssl");
m_openSslPathChooser->setFilePath(currentOpenSslPath); m_openSslPathChooser->setFilePath(currentOpenSslPath);
// Package reload will trigger validateSdk. // Package reload will trigger validateSdk.
m_sdkManager.refreshPackages(); m_sdkManager->refreshPackages();
} }
void AndroidSettingsWidget::validateSdk() void AndroidSettingsWidget::validateSdk()
@@ -640,17 +639,18 @@ void AndroidSettingsWidget::validateSdk()
sdkPath.exists() && sdkPath.isWritableDir()); sdkPath.exists() && sdkPath.isWritableDir());
m_androidSummary->setPointValid(SdkToolsInstalledRow, m_androidSummary->setPointValid(SdkToolsInstalledRow,
!AndroidConfig::sdkToolsVersion().isNull()); !AndroidConfig::sdkToolsVersion().isNull());
m_androidSummary->setPointValid(PlatformToolsInstalledRow, m_androidSummary->setPointValid(SdkManagerSuccessfulRow, // TODO: track me
m_sdkManager->packageListingSuccessful());
m_androidSummary->setPointValid(PlatformToolsInstalledRow, // TODO: track me
AndroidConfig::adbToolPath().exists()); AndroidConfig::adbToolPath().exists());
m_androidSummary->setPointValid(AllEssentialsInstalledRow,
AndroidConfig::allEssentialsInstalled(m_sdkManager));
m_androidSummary->setPointValid(BuildToolsInstalledRow, m_androidSummary->setPointValid(BuildToolsInstalledRow,
!AndroidConfig::buildToolsVersion().isNull()); !AndroidConfig::buildToolsVersion().isNull());
m_androidSummary->setPointValid(SdkManagerSuccessfulRow, m_sdkManager.packageListingSuccessful());
// installedSdkPlatforms should not trigger a package reload as validate SDK is only called // installedSdkPlatforms should not trigger a package reload as validate SDK is only called
// after AndroidSdkManager::packageReloadFinished. // after AndroidSdkManager::packageReloadFinished.
m_androidSummary->setPointValid(PlatformSdkInstalledRow, m_androidSummary->setPointValid(PlatformSdkInstalledRow,
!m_sdkManager.installedSdkPlatforms().isEmpty()); !m_sdkManager->installedSdkPlatforms().isEmpty());
m_androidSummary->setPointValid(AllEssentialsInstalledRow,
AndroidConfig::allEssentialsInstalled(&m_sdkManager));
const bool sdkToolsOk = m_androidSummary->rowsOk({SdkPathExistsAndWritableRow, const bool sdkToolsOk = m_androidSummary->rowsOk({SdkPathExistsAndWritableRow,
SdkToolsInstalledRow, SdkToolsInstalledRow,
@@ -661,7 +661,7 @@ void AndroidSettingsWidget::validateSdk()
AllEssentialsInstalledRow}); AllEssentialsInstalledRow});
AndroidConfig::setSdkFullyConfigured(sdkToolsOk && componentsOk); AndroidConfig::setSdkFullyConfigured(sdkToolsOk && componentsOk);
if (sdkToolsOk && !componentsOk) { if (sdkToolsOk && !componentsOk) {
const QStringList notFoundEssentials = m_sdkManager.notFoundEssentialSdkPackages(); const QStringList notFoundEssentials = m_sdkManager->notFoundEssentialSdkPackages();
if (!notFoundEssentials.isEmpty()) { if (!notFoundEssentials.isEmpty()) {
QMessageBox::warning(Core::ICore::dialogParent(), QMessageBox::warning(Core::ICore::dialogParent(),
Tr::tr("Android SDK Changes"), Tr::tr("Android SDK Changes"),
@@ -670,15 +670,15 @@ void AndroidSettingsWidget::validateSdk()
.arg(QGuiApplication::applicationDisplayName(), .arg(QGuiApplication::applicationDisplayName(),
notFoundEssentials.join("\", \""))); notFoundEssentials.join("\", \"")));
} }
QStringList missingPkgs = m_sdkManager.missingEssentialSdkPackages(); QStringList missingPkgs = m_sdkManager->missingEssentialSdkPackages();
// Add the a system image with highest API level only if there are other // Add the a system image with highest API level only if there are other
// essentials needed, so it would practicaly be somewhat optional. // essentials needed, so it would practicaly be somewhat optional.
if (!missingPkgs.isEmpty()) { if (!missingPkgs.isEmpty()) {
const QString sysImage = AndroidConfig::optionalSystemImagePackage(&m_sdkManager); const QString sysImage = AndroidConfig::optionalSystemImagePackage(m_sdkManager);
if (!sysImage.isEmpty()) if (!sysImage.isEmpty())
missingPkgs.append(sysImage); missingPkgs.append(sysImage);
} }
m_sdkManager.runInstallationChange({missingPkgs}, m_sdkManager->runInstallationChange({missingPkgs},
Tr::tr("Android SDK installation is missing necessary packages. " Tr::tr("Android SDK installation is missing necessary packages. "
"Do you want to install the missing packages?")); "Do you want to install the missing packages?"));
} }