From 4e37f1cd7fac22e05b2ef271aa95bb9af871b801 Mon Sep 17 00:00:00 2001
From: Daniel Teske <daniel.teske@digia.com>
Date: Fri, 19 Apr 2013 16:27:31 +0200
Subject: [PATCH] Android: Speed up project opening by caching the sdk version

The slowness is due to AndroidToolChain::addToEnvironment() being called
a lot on project opening. Thus we need to avoid any file opening or
process on loading.

This patch does 2 things:
a) It removes the call to sdkTargets() which is unneeded. That actually
checks which avds are available.

b) It caches the target sdk inside a named target setting. That means,
we assume that the file does not change behind our backs.

Task-number: QTCREATORBUG-9164

Change-Id: I9287934a0624db0b3e8318b8cf76e605418850c2
Reviewed-by: Aurindam Jana <aurindam.jana@digia.com>
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
Reviewed-by: Eike Ziller <eike.ziller@digia.com>
---
 src/plugins/android/androidmanager.cpp   |  6 ++++++
 src/plugins/android/androidqtversion.cpp |  2 --
 src/plugins/projectexplorer/target.cpp   | 20 ++++++++++++++++++++
 src/plugins/projectexplorer/target.h     |  2 ++
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp
index 1cbeae98737..e8b3694d312 100644
--- a/src/plugins/android/androidmanager.cpp
+++ b/src/plugins/android/androidmanager.cpp
@@ -236,6 +236,10 @@ bool AndroidManager::ensureIconAttribute(ProjectExplorer::Target *target)
 
 QString AndroidManager::targetSDK(ProjectExplorer::Target *target)
 {
+    QVariant v = target->namedSettings(QLatin1String("AndroidManager.TargetSdk"));
+    if (v.isValid())
+        return v.toString();
+
     QString fallback = QLatin1String("android-8");
     if (QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(target->kit()))
         if (qt->qtVersion() >= QtSupport::QtVersionNumber(5, 0, 0))
@@ -243,6 +247,7 @@ QString AndroidManager::targetSDK(ProjectExplorer::Target *target)
 
     if (!createAndroidTemplatesIfNecessary(target))
         return AndroidConfigurations::instance().bestMatch(fallback);
+
     QFile file(defaultPropertiesPath(target).toString());
     if (!file.open(QIODevice::ReadOnly))
         return AndroidConfigurations::instance().bestMatch(fallback);
@@ -257,6 +262,7 @@ QString AndroidManager::targetSDK(ProjectExplorer::Target *target)
 bool AndroidManager::setTargetSDK(ProjectExplorer::Target *target, const QString &sdk)
 {
     updateTarget(target, sdk, applicationName(target));
+    target->setNamedSettings(QLatin1String("AndroidManager.TargetSdk"), sdk);
     return true;
 }
 
diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp
index e92bc0240f0..b4e82b6cd2a 100644
--- a/src/plugins/android/androidqtversion.cpp
+++ b/src/plugins/android/androidqtversion.cpp
@@ -118,8 +118,6 @@ void AndroidQtVersion::addToEnvironment(const ProjectExplorer::Kit *k, Utils::En
     if (AndroidConfigurations::instance().config().ndkLocation.isEmpty()
             || AndroidConfigurations::instance().config().sdkLocation.isEmpty())
         return;
-    if (AndroidConfigurations::instance().sdkTargets().isEmpty())
-        return;
 
     env.set(QLatin1String("ANDROID_NDK_PLATFORM"),
             AndroidConfigurations::instance().bestMatch(AndroidManager::targetSDK(target)));
diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp
index 922af6c690d..bbd8e3fcf2e 100644
--- a/src/plugins/projectexplorer/target.cpp
+++ b/src/plugins/projectexplorer/target.cpp
@@ -64,6 +64,7 @@ const char DC_COUNT_KEY[] = "ProjectExplorer.Target.DeployConfigurationCount";
 const char ACTIVE_RC_KEY[] = "ProjectExplorer.Target.ActiveRunConfiguration";
 const char RC_KEY_PREFIX[] = "ProjectExplorer.Target.RunConfiguration.";
 const char RC_COUNT_KEY[] = "ProjectExplorer.Target.RunConfigurationCount";
+const char PLUGIN_SETTINGS_KEY[] = "ProjectExplorer.Target.PluginSettings";
 
 } // namespace
 
@@ -93,6 +94,7 @@ public:
     RunConfiguration* m_activeRunConfiguration;
     DeploymentData m_deploymentData;
     BuildTargetInfoList m_appTargets;
+    QVariantMap m_pluginSettings;
 
     QPixmap m_connectedPixmap;
     QPixmap m_readyToUsePixmap;
@@ -517,6 +519,8 @@ QVariantMap Target::toMap() const
     for (int i = 0; i < rcs.size(); ++i)
         map.insert(QString::fromLatin1(RC_KEY_PREFIX) + QString::number(i), rcs.at(i)->toMap());
 
+    map.insert(QLatin1String(PLUGIN_SETTINGS_KEY), d->m_pluginSettings);
+
     return map;
 }
 
@@ -663,6 +667,19 @@ void Target::updateDefaultRunConfigurations()
         addRunConfiguration(rc);
 }
 
+QVariant Target::namedSettings(const QString &name) const
+{
+    return d->m_pluginSettings.value(name);
+}
+
+void Target::setNamedSettings(const QString &name, const QVariant &value)
+{
+    if (value.isNull())
+        d->m_pluginSettings.remove(name);
+    else
+        d->m_pluginSettings.insert(name, value);
+}
+
 static QString formatToolTip(const IDevice::DeviceInfo &input)
 {
     QStringList lines;
@@ -824,6 +841,9 @@ bool Target::fromMap(const QVariantMap &map)
             setActiveRunConfiguration(rc);
     }
 
+    if (map.contains(QLatin1String(PLUGIN_SETTINGS_KEY)))
+        d->m_pluginSettings = map.value(QLatin1String(PLUGIN_SETTINGS_KEY)).toMap();
+
     return true;
 }
 
diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h
index 3583ffd0c6e..b9f36113c52 100644
--- a/src/plugins/projectexplorer/target.h
+++ b/src/plugins/projectexplorer/target.h
@@ -116,6 +116,8 @@ public:
     void updateDefaultDeployConfigurations();
     void updateDefaultRunConfigurations();
 
+    QVariant namedSettings(const QString &name) const;
+    void setNamedSettings(const QString &name, const QVariant &value);
 signals:
     void targetEnabled(bool);
     void iconChanged();
-- 
GitLab