From 15b2765dff1cbba30b41da2bc48cd15bfce7f2a7 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 18 Nov 2019 16:57:44 +0100 Subject: [PATCH] Update Qt validity in options when changing Android device settings When changing the Android device settings and pressing "Apply", the information in the "Qt Versions" tab is no longer correct. The Abi information is parsed from the mkspec, and that depends on the NDK setting in the environment. When the NDK in the device settings changes, it updates the toolchains, and that triggers a re-validation of the Qt info in QtOptionsPageWidget::validInformation, but since the Android Qt version already has tried parsing the mkspec, and got (possibly empty) Abi information, it never is parsed and updated again. We need a way to force BaseQtVersion to update these things again. Fixes: QTCREATORBUG-23095 Change-Id: I9cb55ad1a73db942804637344e4c856c7e95afd3 Reviewed-by: Christian Kandeler --- src/plugins/android/androidconfigurations.cpp | 1 + src/plugins/android/androidconfigurations.h | 1 + src/plugins/android/androidqtversion.cpp | 5 +++++ src/plugins/android/androidqtversion.h | 1 + src/plugins/qtsupport/baseqtversion.cpp | 5 +++++ src/plugins/qtsupport/baseqtversion.h | 2 ++ 6 files changed, 15 insertions(+) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 87f2d8b60e6..d8714476ed6 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -870,6 +870,7 @@ FilePath AndroidConfig::qtLiveApkPath() const /////////////////////////////////// void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs) { + emit m_instance->aboutToUpdate(); m_instance->m_config = devConfigs; m_instance->save(); diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index aba533fc279..c19e68dbf44 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -209,6 +209,7 @@ public: static QProcessEnvironment toolsEnvironment(const AndroidConfig &config); signals: + void aboutToUpdate(); void updated(); private: diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index ff8606a1e0a..48aeab8e543 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -49,7 +49,12 @@ namespace Internal { AndroidQtVersion::AndroidQtVersion() : QtSupport::BaseQtVersion() + , m_guard(std::make_unique()) { + QObject::connect(AndroidConfigurations::instance(), + &AndroidConfigurations::aboutToUpdate, + m_guard.get(), + [this] { resetCache(); }); } bool AndroidQtVersion::isValid() const diff --git a/src/plugins/android/androidqtversion.h b/src/plugins/android/androidqtversion.h index c9869608191..5098f533565 100644 --- a/src/plugins/android/androidqtversion.h +++ b/src/plugins/android/androidqtversion.h @@ -58,6 +58,7 @@ public: protected: void parseMkSpec(ProFileEvaluator *) const override; private: + std::unique_ptr m_guard; mutable QStringList m_androidAbis; mutable int m_minNdk = -1; }; diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 13bab8c6f9c..95f65b12eab 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -2169,6 +2169,11 @@ Abis BaseQtVersion::qtAbisFromLibrary(const FilePathList &coreLibraries) return res; } +void BaseQtVersion::resetCache() const +{ + d->m_hasQtAbis = false; + d->m_mkspecReadUpToDate = false; +} // QtVersionFactory diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index 8de93f138bc..6d0e13b5cdf 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -245,6 +245,8 @@ protected: // helper function for desktop and simulator to figure out the supported abis based on the libraries static ProjectExplorer::Abis qtAbisFromLibrary(const Utils::FilePathList &coreLibraries); + void resetCache() const; + void ensureMkSpecParsed() const; virtual void parseMkSpec(ProFileEvaluator *) const;