Android: Enable parsing of available Android SDK packages

Task-number: QTCREATORBUG-18978
Change-Id: Icb9ba0a3afc3ca4386f056aa9e3de057dc9cdf7b
Reviewed-by: BogDan Vatra <bogdan@kdab.com>
This commit is contained in:
Vikas Pachdha
2017-08-30 13:35:07 +02:00
parent 4c4500c605
commit 0ca97ab2bd
3 changed files with 45 additions and 21 deletions

View File

@@ -273,12 +273,8 @@ void SdkManagerOutputParser::parsePackageListing(const QString &output)
continue; continue;
} }
if (m_currentSection == None if (m_currentSection == None)
|| m_currentSection == AvailablePackagesMarkers // At this point. Not interested in continue; // Continue with the verbose output until a valid section starts.
|| m_currentSection == AvailableUpdatesMarker) { // available or update packages.
// Let go of verbose output utill a valid section starts.
continue;
}
if (marker == EmptyMarker) { if (marker == EmptyMarker) {
// Empty marker. Occurs at the end of a package details. // Empty marker. Occurs at the end of a package details.
@@ -305,22 +301,48 @@ void SdkManagerOutputParser::parsePackageListing(const QString &output)
void SdkManagerOutputParser::compilePackageAssociations() void SdkManagerOutputParser::compilePackageAssociations()
{ {
// Return true if package p is already installed i.e. there exists a installed package having
// same sdk style path and same revision as of p.
auto isInstalled = [](const AndroidSdkPackageList &container, AndroidSdkPackage *p) {
return Utils::anyOf(container, [p](AndroidSdkPackage *other) {
return other->state() == AndroidSdkPackage::Installed &&
other->sdkStylePath() == p->sdkStylePath() &&
other->revision() == p->revision();
});
};
auto deleteAlreadyInstalled = [isInstalled](AndroidSdkPackageList &packages) {
for (auto p = packages.begin(); p != packages.end();) {
if ((*p)->state() == AndroidSdkPackage::Available && isInstalled(packages, *p)) {
delete *p;
p = packages.erase(p);
} else {
++p;
}
}
};
// Remove already installed packages.
deleteAlreadyInstalled(m_packages);
// Filter out available images that are already installed.
AndroidSdkPackageList images = m_systemImages.keys();
deleteAlreadyInstalled(images);
// Associate the system images with sdk platforms. // Associate the system images with sdk platforms.
auto imageItr = m_systemImages.cbegin(); for (AndroidSdkPackage *image : images) {
while (imageItr != m_systemImages.cend()) { int imageApi = m_systemImages[image];
auto findPlatform = [imageItr](const AndroidSdkPackage *p) { auto itr = std::find_if(m_packages.begin(), m_packages.end(),
[imageApi](const AndroidSdkPackage *p) {
const SdkPlatform *platform = nullptr; const SdkPlatform *platform = nullptr;
if (p->type() == AndroidSdkPackage::SdkPlatformPackage) if (p->type() == AndroidSdkPackage::SdkPlatformPackage)
platform = static_cast<const SdkPlatform*>(p); platform = static_cast<const SdkPlatform*>(p);
return platform && platform->apiLevel() == imageItr.value(); return platform && platform->apiLevel() == imageApi;
}; });
auto itr = std::find_if(m_packages.begin(), m_packages.end(),
findPlatform);
if (itr != m_packages.end()) { if (itr != m_packages.end()) {
SdkPlatform *platform = static_cast<SdkPlatform*>(*itr); SdkPlatform *platform = static_cast<SdkPlatform*>(*itr);
platform->addSystemImage(static_cast<SystemImage *>(imageItr.key())); platform->addSystemImage(static_cast<SystemImage *>(image));
} }
++imageItr;
} }
} }
@@ -328,9 +350,6 @@ void SdkManagerOutputParser::parsePackageData(MarkerTag packageMarker, const QSt
{ {
QTC_ASSERT(!data.isEmpty() && packageMarker != None, return); QTC_ASSERT(!data.isEmpty() && packageMarker != None, return);
if (m_currentSection != MarkerTag::InstalledPackagesMarker)
return; // For now, only interested in installed packages.
AndroidSdkPackage *package = nullptr; AndroidSdkPackage *package = nullptr;
auto createPackage = [&](std::function<AndroidSdkPackage *(SdkManagerOutputParser *, auto createPackage = [&](std::function<AndroidSdkPackage *(SdkManagerOutputParser *,
const QStringList &)> creator) { const QStringList &)> creator) {

View File

@@ -24,6 +24,8 @@
****************************************************************************/ ****************************************************************************/
#include "androidsdkpackage.h" #include "androidsdkpackage.h"
#include "utils/algorithm.h"
namespace Android { namespace Android {
AndroidSdkPackage::AndroidSdkPackage(QVersionNumber version, QString sdkStylePathStr, AndroidSdkPackage::AndroidSdkPackage(QVersionNumber version, QString sdkStylePathStr,
@@ -185,9 +187,11 @@ void SdkPlatform::addSystemImage(SystemImage *image)
image->setPlatform(this); image->setPlatform(this);
} }
const SystemImageList &SdkPlatform::systemImages() const SystemImageList SdkPlatform::systemImages(PackageState state) const
{ {
return m_systemImages; return Utils::filtered(m_systemImages, [state](const SystemImage *image) {
return image->state() & state;
});
} }
} // namespace Android } // namespace Android

View File

@@ -137,7 +137,8 @@ public:
int apiLevel() const; int apiLevel() const;
QVersionNumber version() const; QVersionNumber version() const;
void addSystemImage(SystemImage *image); void addSystemImage(SystemImage *image);
const SystemImageList &systemImages() const; SystemImageList systemImages(AndroidSdkPackage::PackageState state
= AndroidSdkPackage::Installed) const;
private: private:
SystemImageList m_systemImages; SystemImageList m_systemImages;