From 2b5f5abb2b2bc45730d4e8e6222aec1ce32b1291 Mon Sep 17 00:00:00 2001 From: Vikas Pachdha Date: Tue, 4 Apr 2017 07:20:01 +0200 Subject: [PATCH] Android: Add system image information for each platform Groundwork for the new sdk and avd management tool's integration Task-number: QTCREATORBUG-17814 Change-Id: I3e46f6d3aa56c0f16dd66d0b1d731043e180e012 Reviewed-by: BogDan Vatra --- src/plugins/android/androidconfigurations.h | 13 +++++++++++- src/plugins/android/androidtoolmanager.cpp | 22 ++++++++++++++++++--- src/plugins/android/avddialog.cpp | 14 +++++++++---- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index 6ad5c4a7ed9..b69ee1a3044 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -72,13 +72,24 @@ public: bool operator<(const AndroidDeviceInfo &other) const; }; +//! Defines an Android system image. +class SystemImage +{ +public: + bool isValid() const { return (apiLevel != -1) && !abiName.isEmpty(); } + int apiLevel = -1; + QString abiName; +}; +using SystemImageList = QList; + + class SdkPlatform { public: int apiLevel = -1; QString name; Utils::FileName installedLocation; - QStringList abis; + SystemImageList systemImages; }; using SdkPlatformList = QList; diff --git a/src/plugins/android/androidtoolmanager.cpp b/src/plugins/android/androidtoolmanager.cpp index 1bf48279726..0565c1ef43c 100644 --- a/src/plugins/android/androidtoolmanager.cpp +++ b/src/plugins/android/androidtoolmanager.cpp @@ -293,7 +293,17 @@ void AndroidToolOutputParser::parseTargetListing(const QString &output, if (!platformList) return; + auto addSystemImage = [](const QStringList& abiList, SdkPlatform &platform) { + foreach (auto imageAbi, abiList) { + SystemImage image; + image.abiName = imageAbi; + image.apiLevel = platform.apiLevel; + platform.systemImages.append(image); + } + }; + SdkPlatform platform; + QStringList abiList; foreach (const QString &l, output.split('\n')) { const QString line = l.trimmed(); if (line.startsWith(QLatin1String("id:")) && line.contains(QLatin1String("android-"))) { @@ -309,20 +319,26 @@ void AndroidToolOutputParser::parseTargetListing(const QString &output, } else if (line.startsWith(QLatin1String("Name:"))) { platform.name = line.mid(6); } else if (line.startsWith(QLatin1String("Tag/ABIs :"))) { - platform.abis = cleanAndroidABIs(line.mid(10).trimmed().split(QLatin1String(", "))); + abiList = cleanAndroidABIs(line.mid(10).trimmed().split(QLatin1String(", "))); } else if (line.startsWith(QLatin1String("ABIs"))) { - platform.abis = cleanAndroidABIs(line.mid(6).trimmed().split(QLatin1String(", "))); + abiList = cleanAndroidABIs(line.mid(6).trimmed().split(QLatin1String(", "))); } else if (line.startsWith(QLatin1String("---")) || line.startsWith(QLatin1String("==="))) { if (platform.apiLevel == -1) continue; + + addSystemImage(abiList, platform); *platformList << platform; + platform = SdkPlatform(); + abiList.clear(); } } // The last parsed Platform. - if (platform.apiLevel != -1) + if (platform.apiLevel != -1) { + addSystemImage(abiList, platform); *platformList << platform; + } } } // namespace Internal diff --git a/src/plugins/android/avddialog.cpp b/src/plugins/android/avddialog.cpp index 9bfea8ef215..c003db7f98b 100644 --- a/src/plugins/android/avddialog.cpp +++ b/src/plugins/android/avddialog.cpp @@ -26,6 +26,7 @@ #include "avddialog.h" #include "androidconfigurations.h" +#include #include #include @@ -94,10 +95,15 @@ void AvdDialog::updateApiLevelComboBox() { QList filteredList; QList platforms = m_config->sdkTargets(m_minApiLevel); - foreach (const SdkPlatform &platform, platforms) { - if (platform.abis.contains(abi())) - filteredList << platform; - } + + QString selectedAbi = abi(); + auto hasAbi = [selectedAbi](const SystemImage &image) { + return image.isValid() && (image.abiName == selectedAbi); + }; + + filteredList = Utils::filtered(platforms, [hasAbi](const SdkPlatform &platform) { + return Utils::anyOf(platform.systemImages,hasAbi); + }); m_avdDialog.targetComboBox->clear(); m_avdDialog.targetComboBox->addItems(AndroidConfig::apiLevelNamesFor(filteredList));