From cd8da8fe5f608d4968b90f19f30b515058605b8c Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Mon, 16 Aug 2021 20:19:46 +0300 Subject: [PATCH] Android: Get the minimum sdk level based on the used Qt version Currently, Creator gets the minimum sdk version from a hard-coded value (16) which is used for all projects. However, this is not ideal because some Qt versions require a specific sdk level to build and run properly. So, this change ensures that the minimum sdk value is obtained based the Qt version used in the project. Fixes: QTCREATORBUG-26127 Change-Id: I948dd18d16c3d9ca587ad7712aa4c9a1bfd53972 Reviewed-by: Alessandro Portale --- src/plugins/android/androidbuildapkstep.cpp | 3 ++- src/plugins/android/androidconfigurations.cpp | 4 +-- src/plugins/android/androidmanager.cpp | 9 +++++-- src/plugins/android/androidmanager.h | 3 ++- .../android/androidmanifesteditorwidget.cpp | 25 +++++++++++-------- 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/plugins/android/androidbuildapkstep.cpp b/src/plugins/android/androidbuildapkstep.cpp index 1e895311724..d9598d51b42 100644 --- a/src/plugins/android/androidbuildapkstep.cpp +++ b/src/plugins/android/androidbuildapkstep.cpp @@ -176,7 +176,8 @@ AndroidBuildApkWidget::AndroidBuildApkWidget(AndroidBuildApkStep *step) QWidget *AndroidBuildApkWidget::createApplicationGroup() { - const int minApiSupported = AndroidManager::apiLevelRange().first; + QtSupport::BaseQtVersion *qt = QtSupport::QtKitAspect::qtVersion(m_step->target()->kit()); + const int minApiSupported = AndroidManager::defaultMinimumSDK(qt); QStringList targets = AndroidConfig::apiLevelNamesFor(AndroidConfigurations::sdkManager()-> filteredSdkPlatforms(minApiSupported)); targets.removeDuplicates(); diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 9d5f8713007..033fb269582 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -778,12 +778,12 @@ bool AndroidConfig::isValidNdk(const QString &ndkLocation) const QString AndroidConfig::bestNdkPlatformMatch(int target, const BaseQtVersion *qtVersion) const { - target = std::max(AndroidManager::apiLevelRange().first, target); + target = std::max(AndroidManager::defaultMinimumSDK(qtVersion), target); foreach (int apiLevel, availableNdkPlatforms(qtVersion)) { if (apiLevel <= target) return QString::fromLatin1("android-%1").arg(apiLevel); } - return QString("android-%1").arg(AndroidManager::apiLevelRange().first); + return QString("android-%1").arg(AndroidManager::defaultMinimumSDK(qtVersion)); } FilePath AndroidConfig::sdkLocation() const diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index f2e75a5fd4d..274b338f805 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -399,9 +399,14 @@ void AndroidManager::setDeviceApiLevel(Target *target, int level) target->setNamedSettings(ApiLevelKey, level); } -QPair AndroidManager::apiLevelRange() +int AndroidManager::defaultMinimumSDK(const QtSupport::BaseQtVersion *qtVersion) { - return qMakePair(16, 29); + if (qtVersion && qtVersion->qtVersion() >= QtSupport::QtVersionNumber{6, 0}) + return 23; + else if (qtVersion && qtVersion->qtVersion() >= QtSupport::QtVersionNumber{5, 13}) + return 21; + else + return 16; } QString AndroidManager::androidNameForApiLevel(int x) diff --git a/src/plugins/android/androidmanager.h b/src/plugins/android/androidmanager.h index 62448332ac0..97cf937160f 100644 --- a/src/plugins/android/androidmanager.h +++ b/src/plugins/android/androidmanager.h @@ -31,6 +31,7 @@ #include #include +#include #include QT_BEGIN_NAMESPACE @@ -87,6 +88,7 @@ public: static int minimumSDK(const ProjectExplorer::Target *target); static int minimumSDK(const ProjectExplorer::Kit *kit); + static int defaultMinimumSDK(const QtSupport::BaseQtVersion *qtVersion); static QStringList applicationAbis(const ProjectExplorer::Target *target); static QString archTriplet(const QString &abi); @@ -100,7 +102,6 @@ public: static QString devicePreferredAbi(const QStringList &deviceAbis, const QStringList &appAbis); static ProjectExplorer::Abi androidAbi2Abi(const QString &androidAbi); - static QPair apiLevelRange(); static QString androidNameForApiLevel(int x); static void installQASIPackage(ProjectExplorer::Target *target, const QString &packagePath); diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp index db74a953970..e9c065ddd15 100644 --- a/src/plugins/android/androidmanifesteditorwidget.cpp +++ b/src/plugins/android/androidmanifesteditorwidget.cpp @@ -720,18 +720,21 @@ void AndroidManifestEditorWidget::updateInfoBar() void AndroidManifestEditorWidget::updateSdkVersions() { - QPair apiLevels = AndroidManager::apiLevelRange(); - for (int i = apiLevels.first; i < apiLevels.second + 1; ++i) - m_androidMinSdkVersion->addItem(tr("API %1: %2") - .arg(i) - .arg(AndroidManager::androidNameForApiLevel(i)), - i); + static const QPair sdkPair = qMakePair(16, 31); + int minSdk = sdkPair.first; + const int targetSdk = sdkPair.second; + const Target *target = androidTarget(m_textEditorWidget->textDocument()->filePath()); + if (target) { + const QtSupport::BaseQtVersion *qt = QtSupport::QtKitAspect::qtVersion(target->kit()); + minSdk = AndroidManager::defaultMinimumSDK(qt); + } - for (int i = apiLevels.first; i < apiLevels.second + 1; ++i) - m_androidTargetSdkVersion->addItem(tr("API %1: %2") - .arg(i) - .arg(AndroidManager::androidNameForApiLevel(i)), - i); + for (int i = minSdk; i <= targetSdk; ++i) { + const QString apiStr = tr("API %1: %2").arg(i) + .arg(AndroidManager::androidNameForApiLevel(i)); + m_androidMinSdkVersion->addItem(apiStr, i); + m_androidTargetSdkVersion->addItem(apiStr, i); + } } void AndroidManifestEditorWidget::updateInfoBar(const QString &errorMessage, int line, int column)