diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index d55ef90a443..9ba6eb96ea1 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -108,6 +108,7 @@ namespace { const QLatin1String SettingsGroup("AndroidConfigurations"); const QLatin1String SDKLocationKey("SDKLocation"); const QLatin1String CustomNdkLocationsKey("CustomNdkLocations"); + const QLatin1String DefaultNdkLocationKey("DefaultNdkLocation"); const QLatin1String SdkFullyConfiguredKey("AllEssentialsInstalled"); const QLatin1String SDKManagerToolArgsKey("SDKManagerToolArgs"); const QLatin1String OpenJDKLocationKey("OpenJDKLocation"); @@ -226,6 +227,8 @@ void AndroidConfig::load(const QSettings &settings) QStringList({"-netdelay", "none", "-netspeed", "full"})).toStringList(); m_sdkLocation = FilePath::fromUserInput(settings.value(SDKLocationKey).toString()).cleanPath(); m_customNdkList = settings.value(CustomNdkLocationsKey).toStringList(); + m_defaultNdk = + FilePath::fromUserInput(settings.value(DefaultNdkLocationKey).toString()).cleanPath(); m_sdkManagerToolArgs = settings.value(SDKManagerToolArgsKey).toStringList(); m_openJDKLocation = FilePath::fromString(settings.value(OpenJDKLocationKey).toString()); m_openSslLocation = FilePath::fromString(settings.value(OpenSslPriLocationKey).toString()); @@ -246,6 +249,11 @@ void AndroidConfig::load(const QSettings &settings) // persistent settings } m_customNdkList.removeAll(""); + if (!m_defaultNdk.isEmpty() && ndkVersion(m_defaultNdk).isNull()) { + if (avdConfigLog().isDebugEnabled()) + qCDebug(avdConfigLog) << "Clearing invalid default NDK setting:" << m_defaultNdk.path(); + m_defaultNdk.clear(); + } parseDependenciesJson(); } @@ -258,6 +266,7 @@ void AndroidConfig::save(QSettings &settings) const // user settings settings.setValue(SDKLocationKey, m_sdkLocation.toString()); settings.setValue(CustomNdkLocationsKey, m_customNdkList); + settings.setValue(DefaultNdkLocationKey, m_defaultNdk.toString()); settings.setValue(SDKManagerToolArgsKey, m_sdkManagerToolArgs); settings.setValue(OpenJDKLocationKey, m_openJDKLocation.toString()); settings.setValue(OpenSslPriLocationKey, m_openSslLocation.toString()); @@ -396,6 +405,16 @@ void AndroidConfig::removeCustomNdk(const QString &customNdk) m_customNdkList.removeAll(customNdk); } +void AndroidConfig::setDefaultNdk(const Utils::FilePath &defaultNdk) +{ + m_defaultNdk = defaultNdk; +} + +FilePath AndroidConfig::defaultNdk() const +{ + return m_defaultNdk; +} + FilePath AndroidConfig::openSslLocation() const { return m_openSslLocation; @@ -927,6 +946,8 @@ void AndroidConfig::setSdkManagerToolArgs(const QStringList &args) FilePath AndroidConfig::ndkLocation(const BaseQtVersion *qtVersion) const { + if (!m_defaultNdk.isEmpty()) + return m_defaultNdk; // A selected default NDK is good for any Qt version return sdkLocation().pathAppended(ndkPathFromQtVersion(*qtVersion)); } @@ -1005,6 +1026,9 @@ bool AndroidConfig::allEssentialsInstalled(AndroidSdkManager *sdkManager) if (essentialPkgs.isEmpty()) break; } + if (!m_defaultNdk.isEmpty()) + essentialPkgs = Utils::filtered(essentialPkgs, + [](const QString &p){ return !p.startsWith("ndk;"); }); return essentialPkgs.isEmpty() ? true : false; } diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 84d1142cce4..f5cfa7f6531 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -167,6 +167,8 @@ public: QStringList getCustomNdkList() const; void addCustomNdk(const QString &customNdk); void removeCustomNdk(const QString &customNdk); + void setDefaultNdk(const Utils::FilePath &defaultNdk); + Utils::FilePath defaultNdk() const; Utils::FilePath openSslLocation() const; void setOpenSslLocation(const Utils::FilePath &openSslLocation); @@ -201,6 +203,7 @@ private: SdkForQtVersions m_defaultSdkDepends; QList m_specificQtVersions; QStringList m_customNdkList; + Utils::FilePath m_defaultNdk; bool m_sdkFullyConfigured = false; //caches diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 7f71ee88a54..abbbe2dd871 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -105,6 +105,7 @@ private: void downloadSdk(); void addCustomNdkItem(); + bool isDefaultNdkSelected() const; void validateOpenSsl(); Ui_AndroidSettingsWidget m_ui; @@ -263,6 +264,8 @@ void AndroidSettingsWidget::updateNdkList() } m_ui.ndkListWidget->setCurrentRow(0); + + updateUI(); } void AndroidSettingsWidget::addCustomNdkItem() @@ -287,6 +290,17 @@ void AndroidSettingsWidget::addCustomNdkItem() } } + +bool AndroidSettingsWidget::isDefaultNdkSelected() const +{ + if (!m_androidConfig.defaultNdk().isEmpty()) { + if (const QListWidgetItem *item = m_ui.ndkListWidget->currentItem()) { + return FilePath::fromUserInput(item->text()) == m_androidConfig.defaultNdk(); + } + } + return false; +} + AndroidSettingsWidget::AndroidSettingsWidget() { m_ui.setupUi(this); @@ -398,9 +412,18 @@ AndroidSettingsWidget::AndroidSettingsWidget() connect(m_ui.addCustomNdkButton, &QPushButton::clicked, this, &AndroidSettingsWidget::addCustomNdkItem); connect(m_ui.removeCustomNdkButton, &QPushButton::clicked, this, [this] { + if (isDefaultNdkSelected()) + m_androidConfig.setDefaultNdk({}); m_androidConfig.removeCustomNdk(m_ui.ndkListWidget->currentItem()->text()); m_ui.ndkListWidget->takeItem(m_ui.ndkListWidget->currentRow()); }); + connect(m_ui.makeDefaultNdkButton, &QPushButton::clicked, this, [this] { + const FilePath defaultNdk = isDefaultNdkSelected() + ? FilePath() + : FilePath::fromUserInput(m_ui.ndkListWidget->currentItem()->text()); + m_androidConfig.setDefaultNdk(defaultNdk); + updateUI(); + }); connect(m_ui.openSslPathChooser, &PathChooser::rawPathChanged, this, &AndroidSettingsWidget::validateOpenSsl); @@ -658,6 +681,22 @@ void AndroidSettingsWidget::updateUI() m_androidSummary->setSetupOk(androidSetupOk); m_openSslSummary->setSetupOk(openSslOk); + + // Mark default entry in NDK list widget + { + const QFont font = m_ui.ndkListWidget->font(); + QFont markedFont = font; + markedFont.setItalic(true); + for (int row = 0; row < m_ui.ndkListWidget->count(); ++row) { + QListWidgetItem *item = m_ui.ndkListWidget->item(row); + const bool isDefaultNdk = + FilePath::fromUserInput(item->text()) == m_androidConfig.defaultNdk(); + item->setFont(isDefaultNdk ? markedFont : font); + } + } + + m_ui.makeDefaultNdkButton->setText(isDefaultNdkSelected() ? tr("Unset Default") + : tr("Make Default")); } void AndroidSettingsWidget::downloadSdk() diff --git a/src/plugins/android/androidsettingswidget.ui b/src/plugins/android/androidsettingswidget.ui index 0e021f52420..227f4a5b5da 100644 --- a/src/plugins/android/androidsettingswidget.ui +++ b/src/plugins/android/androidsettingswidget.ui @@ -62,6 +62,13 @@ + + + + Force a specific NDK installation to be used by all Android kits.<br/>Note that the forced NDK might not be compatible with all Qt registered versions. + + +