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 <hjk@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
This commit is contained in:
Assam Boudjelthia
2021-09-05 19:44:16 +03:00
parent e1a69fccb1
commit 78da7e2922
5 changed files with 30 additions and 25 deletions

View File

@@ -418,6 +418,28 @@ QString AndroidConfig::apiLevelNameFor(const SdkPlatform *platform)
QString("android-%1").arg(platform->apiLevel()) : ""; QString("android-%1").arg(platform->apiLevel()) : "";
} }
int AndroidConfig::platformNameToApiLevel(const QString &platformName)
{
int apiLevel = -1;
static const QRegularExpression re("(android-)(?<apiLevel>[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 bool AndroidConfig::isCmdlineSdkToolsInstalled() const
{ {
QString toolPath("cmdline-tools/latest/bin/sdkmanager"); QString toolPath("cmdline-tools/latest/bin/sdkmanager");

View File

@@ -91,6 +91,7 @@ public:
static QStringList apiLevelNamesFor(const SdkPlatformList &platforms); static QStringList apiLevelNamesFor(const SdkPlatformList &platforms);
static QString apiLevelNameFor(const SdkPlatform *platform); static QString apiLevelNameFor(const SdkPlatform *platform);
static int platformNameToApiLevel(const QString &platformName);
Utils::FilePath sdkLocation() const; Utils::FilePath sdkLocation() const;
void setSdkLocation(const Utils::FilePath &sdkLocation); void setSdkLocation(const Utils::FilePath &sdkLocation);

View File

@@ -69,28 +69,6 @@ Q_GLOBAL_STATIC_WITH_ARGS(QRegularExpression, assertionReg,
using namespace Utils; using namespace Utils;
using SdkCmdFutureInterface = QFutureInterface<AndroidSdkManager::OperationOutput>; using SdkCmdFutureInterface = QFutureInterface<AndroidSdkManager::OperationOutput>;
int platformNameToApiLevel(const QString &platformName)
{
int apiLevel = -1;
QRegularExpression re("(android-)(?<apiLevel>[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 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. \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; SdkPlatform *platform = nullptr;
GenericPackageData packageData; GenericPackageData packageData;
if (parseAbstractData(packageData, data, 2, "Platform")) { 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) { if (apiLevel == -1) {
qCDebug(sdkManagerLog) << "Platform: Cannot parse api level:"<< data; qCDebug(sdkManagerLog) << "Platform: Cannot parse api level:"<< data;
return nullptr; return nullptr;
@@ -734,7 +712,7 @@ QPair<SystemImage *, int> SdkManagerOutputParser::parseSystemImage(const QString
QPair <SystemImage *, int> result(nullptr, -1); QPair <SystemImage *, int> result(nullptr, -1);
GenericPackageData packageData; GenericPackageData packageData;
if (parseAbstractData(packageData, data, 4, "System-image")) { 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) { if (apiLevel == -1) {
qCDebug(sdkManagerLog) << "System-image: Cannot parse api level:"<< data; qCDebug(sdkManagerLog) << "System-image: Cannot parse api level:"<< data;
return result; return result;

View File

@@ -24,6 +24,7 @@
****************************************************************************/ ****************************************************************************/
#include "avdmanageroutputparser.h" #include "avdmanageroutputparser.h"
#include "androidconfigurations.h"
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
@@ -97,7 +98,7 @@ static Utils::optional<AndroidDeviceInfo> parseAvd(const QStringList &deviceInfo
QSettings avdInfo(avdInfoFile.toString(), QSettings::IniFormat); QSettings avdInfo(avdInfoFile.toString(), QSettings::IniFormat);
value = avdInfo.value(avdInfoTargetKey).toString(); value = avdInfo.value(avdInfoTargetKey).toString();
if (!value.isEmpty()) if (!value.isEmpty())
avd.sdk = value.section('-', -1).toInt(); avd.sdk = AndroidConfig::platformNameToApiLevel(value);
else else
qCDebug(avdOutputParserLog) qCDebug(avdOutputParserLog)
<< "Avd Parsing: Cannot find sdk API:" << avdInfoFile.toString(); << "Avd Parsing: Cannot find sdk API:" << avdInfoFile.toString();

View File

@@ -1,5 +1,6 @@
add_qtc_test(tst_avdmanageroutputparser add_qtc_test(tst_avdmanageroutputparser
DEPENDS Utils DEPENDS Utils
PLUGIN_DEPENDS Android
INCLUDES INCLUDES
"${PROJECT_SOURCE_DIR}/src/plugins" "${PROJECT_SOURCE_DIR}/src/plugins"
"${PROJECT_SOURCE_DIR}/src/plugins/android" "${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/avdmanageroutputparser.h"
"${PROJECT_SOURCE_DIR}/src/plugins/android/androiddeviceinfo.cpp" "${PROJECT_SOURCE_DIR}/src/plugins/android/androiddeviceinfo.cpp"
"${PROJECT_SOURCE_DIR}/src/plugins/android/androiddeviceinfo.h" "${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 qtc_add_resources(tst_avdmanageroutputparser tst_avdmanageroutputparser_rcc