diff --git a/src/plugins/android/androidsdkmanager.cpp b/src/plugins/android/androidsdkmanager.cpp index c538454da93..4b28b47fade 100644 --- a/src/plugins/android/androidsdkmanager.cpp +++ b/src/plugins/android/androidsdkmanager.cpp @@ -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(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(*itr); - platform->addSystemImage(static_cast(imageItr.key())); + platform->addSystemImage(static_cast(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 creator) { diff --git a/src/plugins/android/androidsdkpackage.cpp b/src/plugins/android/androidsdkpackage.cpp index 0ea964af97d..93fbc53dca7 100644 --- a/src/plugins/android/androidsdkpackage.cpp +++ b/src/plugins/android/androidsdkpackage.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "androidsdkpackage.h" +#include "utils/algorithm.h" + namespace Android { AndroidSdkPackage::AndroidSdkPackage(QVersionNumber version, QString sdkStylePathStr, @@ -185,9 +187,11 @@ void SdkPlatform::addSystemImage(SystemImage *image) 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 diff --git a/src/plugins/android/androidsdkpackage.h b/src/plugins/android/androidsdkpackage.h index 2ffbd3b4a87..3a96f1b373d 100644 --- a/src/plugins/android/androidsdkpackage.h +++ b/src/plugins/android/androidsdkpackage.h @@ -137,7 +137,8 @@ public: int apiLevel() const; QVersionNumber version() const; void addSystemImage(SystemImage *image); - const SystemImageList &systemImages() const; + SystemImageList systemImages(AndroidSdkPackage::PackageState state + = AndroidSdkPackage::Installed) const; private: SystemImageList m_systemImages;