forked from qt-creator/qt-creator
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:
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user