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;
}
if (m_currentSection == None
|| m_currentSection == AvailablePackagesMarkers // At this point. Not interested in
|| m_currentSection == AvailableUpdatesMarker) { // available or update packages.
// Let go of verbose output utill a valid section starts.
continue;
}
if (m_currentSection == None)
continue; // Continue with the verbose output until a valid section starts.
if (marker == EmptyMarker) {
// Empty marker. Occurs at the end of a package details.
@@ -305,22 +301,48 @@ void SdkManagerOutputParser::parsePackageListing(const QString &output)
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.
auto imageItr = m_systemImages.cbegin();
while (imageItr != m_systemImages.cend()) {
auto findPlatform = [imageItr](const AndroidSdkPackage *p) {
for (AndroidSdkPackage *image : images) {
int imageApi = m_systemImages[image];
auto itr = std::find_if(m_packages.begin(), m_packages.end(),
[imageApi](const AndroidSdkPackage *p) {
const SdkPlatform *platform = nullptr;
if (p->type() == AndroidSdkPackage::SdkPlatformPackage)
platform = static_cast<const SdkPlatform*>(p);
return platform && platform->apiLevel() == imageItr.value();
};
auto itr = std::find_if(m_packages.begin(), m_packages.end(),
findPlatform);
return platform && platform->apiLevel() == imageApi;
});
if (itr != m_packages.end()) {
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);
if (m_currentSection != MarkerTag::InstalledPackagesMarker)
return; // For now, only interested in installed packages.
AndroidSdkPackage *package = nullptr;
auto createPackage = [&](std::function<AndroidSdkPackage *(SdkManagerOutputParser *,
const QStringList &)> creator) {