From 78da7e2922274c429bb677abf63157b8ae679d03 Mon Sep 17 00:00:00 2001 From: Assam Boudjelthia Date: Sun, 5 Sep 2021 19:44:16 +0300 Subject: [PATCH] Move sdkmanager's sdk level parsing to AndroidConfig Both the sdkmanger and avdmanager (maybe more) need to parse the sdk level for packages and devices which may contain letters, make them use the same logic. Change-Id: Iff7fef3a66e00fac11b833f73f2f334a4cf1a766 Reviewed-by: hjk Reviewed-by: Qt CI Bot --- src/plugins/android/androidconfigurations.cpp | 22 ++++++++++++++++ src/plugins/android/androidconfigurations.h | 1 + src/plugins/android/androidsdkmanager.cpp | 26 ++----------------- .../android/avdmanageroutputparser.cpp | 3 ++- tests/auto/android/CMakeLists.txt | 3 +++ 5 files changed, 30 insertions(+), 25 deletions(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index c769a744d26..5a09199c9de 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -418,6 +418,28 @@ QString AndroidConfig::apiLevelNameFor(const SdkPlatform *platform) QString("android-%1").arg(platform->apiLevel()) : ""; } +int AndroidConfig::platformNameToApiLevel(const QString &platformName) +{ + int apiLevel = -1; + static const QRegularExpression re("(android-)(?[0-9A-Z]{1,})", + QRegularExpression::CaseInsensitiveOption); + QRegularExpressionMatch match = re.match(platformName); + if (match.hasMatch()) { + QString apiLevelStr = match.captured("apiLevel"); + bool isUInt; + apiLevel = apiLevelStr.toUInt(&isUInt); + if (!isUInt) { + if (apiLevelStr == 'Q') + apiLevel = 29; + else if (apiLevelStr == 'R') + apiLevel = 30; + else if (apiLevelStr == 'S') + apiLevel = 31; + } + } + return apiLevel; +} + bool AndroidConfig::isCmdlineSdkToolsInstalled() const { QString toolPath("cmdline-tools/latest/bin/sdkmanager"); diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 09f7ac85f1d..db65168896e 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -91,6 +91,7 @@ public: static QStringList apiLevelNamesFor(const SdkPlatformList &platforms); static QString apiLevelNameFor(const SdkPlatform *platform); + static int platformNameToApiLevel(const QString &platformName); Utils::FilePath sdkLocation() const; void setSdkLocation(const Utils::FilePath &sdkLocation); diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index 943e371178a..eaa6996014a 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -69,28 +69,6 @@ Q_GLOBAL_STATIC_WITH_ARGS(QRegularExpression, assertionReg, using namespace Utils; using SdkCmdFutureInterface = QFutureInterface; -int platformNameToApiLevel(const QString &platformName) -{ - int apiLevel = -1; - QRegularExpression re("(android-)(?[0-9A-Z]{1,})", - QRegularExpression::CaseInsensitiveOption); - QRegularExpressionMatch match = re.match(platformName); - if (match.hasMatch()) { - QString apiLevelStr = match.captured("apiLevel"); - bool isUInt; - apiLevel = apiLevelStr.toUInt(&isUInt); - if (!isUInt) { - if (apiLevelStr == 'Q') - apiLevel = 29; - else if (apiLevelStr == 'R') - apiLevel = 30; - else if (apiLevelStr == 'S') - apiLevel = 31; - } - } - return apiLevel; -} - /*! Parses the \a line for a [spaces]key[spaces]value[spaces] pattern and returns \c true if \a key is found, false otherwise. Result is copied into \a value. @@ -714,7 +692,7 @@ AndroidSdkPackage *SdkManagerOutputParser::parsePlatform(const QStringList &data SdkPlatform *platform = nullptr; GenericPackageData packageData; if (parseAbstractData(packageData, data, 2, "Platform")) { - int apiLevel = platformNameToApiLevel(packageData.headerParts.at(1)); + const int apiLevel = AndroidConfig::platformNameToApiLevel(packageData.headerParts.at(1)); if (apiLevel == -1) { qCDebug(sdkManagerLog) << "Platform: Cannot parse api level:"<< data; return nullptr; @@ -734,7 +712,7 @@ QPair SdkManagerOutputParser::parseSystemImage(const QString QPair result(nullptr, -1); GenericPackageData packageData; if (parseAbstractData(packageData, data, 4, "System-image")) { - int apiLevel = platformNameToApiLevel(packageData.headerParts.at(1)); + const int apiLevel = AndroidConfig::platformNameToApiLevel(packageData.headerParts.at(1)); if (apiLevel == -1) { qCDebug(sdkManagerLog) << "System-image: Cannot parse api level:"<< data; return result; diff --git a/src/plugins/android/avdmanageroutputparser.cpp b/src/plugins/android/avdmanageroutputparser.cpp index 0ca8a74e734..ac758f41c7c 100644 --- a/src/plugins/android/avdmanageroutputparser.cpp +++ b/src/plugins/android/avdmanageroutputparser.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "avdmanageroutputparser.h" +#include "androidconfigurations.h" #include #include @@ -97,7 +98,7 @@ static Utils::optional parseAvd(const QStringList &deviceInfo QSettings avdInfo(avdInfoFile.toString(), QSettings::IniFormat); value = avdInfo.value(avdInfoTargetKey).toString(); if (!value.isEmpty()) - avd.sdk = value.section('-', -1).toInt(); + avd.sdk = AndroidConfig::platformNameToApiLevel(value); else qCDebug(avdOutputParserLog) << "Avd Parsing: Cannot find sdk API:" << avdInfoFile.toString(); diff --git a/tests/auto/android/CMakeLists.txt b/tests/auto/android/CMakeLists.txt index 8f328fe98e2..bf132fe599a 100644 --- a/tests/auto/android/CMakeLists.txt +++ b/tests/auto/android/CMakeLists.txt @@ -1,5 +1,6 @@ add_qtc_test(tst_avdmanageroutputparser DEPENDS Utils + PLUGIN_DEPENDS Android INCLUDES "${PROJECT_SOURCE_DIR}/src/plugins" "${PROJECT_SOURCE_DIR}/src/plugins/android" @@ -9,6 +10,8 @@ add_qtc_test(tst_avdmanageroutputparser "${PROJECT_SOURCE_DIR}/src/plugins/android/avdmanageroutputparser.h" "${PROJECT_SOURCE_DIR}/src/plugins/android/androiddeviceinfo.cpp" "${PROJECT_SOURCE_DIR}/src/plugins/android/androiddeviceinfo.h" + "${PROJECT_SOURCE_DIR}/src/plugins/android/androidmanager.cpp" + "${PROJECT_SOURCE_DIR}/src/plugins/android/androidmanager.h" ) qtc_add_resources(tst_avdmanageroutputparser tst_avdmanageroutputparser_rcc