From f32068b7ee62e25d41569c4bbbcf64768b97361d Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 13 Jun 2022 16:48:50 +0200 Subject: Add toolchain abi and build success/failure per toolchain Change-Id: I76ebeaaf72c6798834bdd2d751fb971bb9253f9d Reviewed-by: Eike Ziller --- src/datasources/kitsource.cpp | 76 ++++++++++++++++++++++++++++++++++--------- src/datasources/kitsource.h | 14 +++++++- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/src/datasources/kitsource.cpp b/src/datasources/kitsource.cpp index 9458853..6cf724e 100644 --- a/src/datasources/kitsource.cpp +++ b/src/datasources/kitsource.cpp @@ -26,11 +26,17 @@ #include +#include +#include #include #include +#include #include -#include +#include +#include + #include + #include #include @@ -45,6 +51,18 @@ using namespace ProjectExplorer; KitSource::KitSource() : AbstractDataSource(QStringLiteral("kits"), Provider::DetailedUsageStatistics) { + QObject::connect(ProjectExplorer::BuildManager::instance(), + &ProjectExplorer::BuildManager::buildQueueFinished, + [&](bool success) { + const Project *project = SessionManager::startupProject(); + const Target *target = project ? project->activeTarget() : nullptr; + const Kit *kit = target ? target->kit() : nullptr; + const ToolChain *toolChain = ToolChainKitAspect::toolChain(kit, Constants::CXX_LANGUAGE_ID); + const Abi abi = toolChain ? toolChain->targetAbi() : Abi(); + const QString abiName = abi.toString(); + QVariantMap &bucket = success ? m_buildSuccessesForToolChain : m_buildFailsForToolChain; + bucket[abiName] = bucket.value(abiName, 0).toInt() + 1; + }); } KitSource::~KitSource() = default; @@ -60,6 +78,8 @@ QString KitSource::description() const } static QString kitsInfoKey() { return QStringLiteral("kitsInfo"); } +static QString buildSuccessesKey() { return QStringLiteral("buildSuccesses"); } +static QString buildFailsKey() { return QStringLiteral("buildFails"); } static QString extractToolChainVersion(const ToolChain &toolChain) { @@ -70,9 +90,36 @@ static QString extractToolChainVersion(const ToolChain &toolChain) } } +void KitSource::loadImpl(QSettings *settings) +{ + auto setter = ScopedSettingsGroupSetter::forDataSource(*this, *settings); + m_buildSuccessesForToolChain = settings->value(buildSuccessesKey(), QVariantMap{}).toMap(); + m_buildFailsForToolChain = settings->value(buildFailsKey(), QVariantMap{}).toMap(); +} + +void KitSource::storeImpl(QSettings *settings) +{ + auto setter = ScopedSettingsGroupSetter::forDataSource(*this, *settings); + settings->setValue(buildSuccessesKey(), m_buildSuccessesForToolChain); + settings->setValue(buildFailsKey(), m_buildFailsForToolChain); +} + +void KitSource::resetImpl(QSettings *settings) +{ + m_buildSuccessesForToolChain.clear(); + m_buildFailsForToolChain.clear(); + + storeImpl(settings); +} + class KitInfo { public: + KitInfo(Kit &kit, const KitSource &source) : m_kit(kit), m_source(source) + { + addKitInfo(); + } + KitInfo &withQtVersionInfo() { static const QString qtKey = QStringLiteral("qt"); @@ -98,9 +145,14 @@ public: static const QString compilerKey = QStringLiteral("compiler"); if (auto toolChain = ToolChainKitAspect::toolChain(&m_kit, Constants::CXX_LANGUAGE_ID)) { - m_map.insert(compilerKey, - QVariantMap{{nameKey(), toolChain->typeDisplayName()}, - {versionKey(), extractToolChainVersion(*toolChain)}}); + const QString abiName = toolChain->targetAbi().toString(); + m_map.insert(compilerKey, QVariantMap{ + {nameKey(), toolChain->typeDisplayName()}, + {abiKey(), abiName}, + {versionKey(), extractToolChainVersion(*toolChain)}, + {buildSuccessesKey(), m_source.m_buildSuccessesForToolChain.value(abiName).toInt()}, + {buildFailsKey(), m_source.m_buildFailsForToolChain.value(abiName).toInt()} + }); } return *this; @@ -121,10 +173,7 @@ public: QVariantMap extract() const { return m_map; } - static KitInfo forKit(Kit &kit) { return KitInfo(kit); } - private: // Methods - KitInfo(Kit &kit) : m_kit(kit) { addKitInfo(); } void addKitInfo() { @@ -161,18 +210,20 @@ private: // Methods static QString versionKey() { return QStringLiteral("version"); } static QString nameKey() { return QStringLiteral("name"); } + static QString abiKey() { return QStringLiteral("abi"); } private: // Data Kit &m_kit; + const KitSource &m_source; QVariantMap m_map; }; -static QVariantList kitsInfo() +QVariant KitSource::data() { QVariantList kitsInfoList; for (auto &&kit : KitManager::instance()->kits()) { if (kit && kit->isValid()) { - kitsInfoList << KitInfo::forKit(*kit) + kitsInfoList << KitInfo(*kit, *this) .withCompilerInfo() .withDebuggerInfo() .withQtVersionInfo() @@ -180,12 +231,7 @@ static QVariantList kitsInfo() } } - return kitsInfoList; -} - -QVariant KitSource::data() -{ - return QVariantMap{{kitsInfoKey(), kitsInfo()}}; + return QVariantMap{{kitsInfoKey(), kitsInfoList}}; } } // namespace Internal diff --git a/src/datasources/kitsource.h b/src/datasources/kitsource.h index 4256c01..c42e3fe 100644 --- a/src/datasources/kitsource.h +++ b/src/datasources/kitsource.h @@ -50,7 +50,10 @@ public: // AbstractDataSource interface * { * "compiler": { * "name" : string, - * "version": int + * "version": int, + * "abi": string, + * "buildSuccesses": int, + * "buildFails": int * }, * "debugger": { * "name" : string, @@ -78,6 +81,15 @@ public: // AbstractDataSource interface * The version format if "\d+.\d+.\d+". */ QVariant data() override; + +private: + void loadImpl(QSettings *settings); + void storeImpl(QSettings *settings); + void resetImpl(QSettings *settings); + + friend class KitInfo; + QVariantMap m_buildSuccessesForToolChain; + QVariantMap m_buildFailsForToolChain; }; } // namespace Internal -- cgit v1.2.3 From b385abfcc4e2a0cc889f76625405e97853f35986 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 13 Sep 2022 12:38:01 +0200 Subject: QmlDesigner: Fix telemetry popup The import does not exist in Qt 5 and we changed the identifiers for the views. Change-Id: I76ebeaaff2c6798834bdd2d751fb971bb9253fff Reviewed-by: Tim Jenssen --- src/datasources/qmldesignerusageeventsource.cpp | 16 +++++++++++++--- src/ui/FeedbackPopup.qml | 1 - 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/datasources/qmldesignerusageeventsource.cpp b/src/datasources/qmldesignerusageeventsource.cpp index 00a614b..06fc090 100644 --- a/src/datasources/qmldesignerusageeventsource.cpp +++ b/src/datasources/qmldesignerusageeventsource.cpp @@ -138,9 +138,19 @@ void QmlDesignerUsageEventSource::handleUsageStatisticsUsageTimer(const QString it.value() = it.value().toInt() + elapsed; // Show the user feedback prompt after time limit is passed - static const QSet supportedViews {"Form Editor", "3D Editor", "Timeline", - "Transition Editor", "Curve Editor"}; - static const int timeLimit = 864'000'000; // 10 days + static const QSet supportedViews{"formEditor", + "3DEditor", + "statesEditor,", + "timeline", + "itemLibrary", + "assetsLibrary", + "transitionEditor", + "curveEditor", + "propertyEditor", + "textEditor", + "materialBrowser", + "navigatorView"}; + static const int timeLimit = 864'000'00; // 1 day if (supportedViews.contains(identifier) && !m_feedbackPoppedData[identifier].toBool() && m_timeData.value(identifier).toInt() >= timeLimit) { launchPopup(identifier); diff --git a/src/ui/FeedbackPopup.qml b/src/ui/FeedbackPopup.qml index 705c0ba..a8b5455 100644 --- a/src/ui/FeedbackPopup.qml +++ b/src/ui/FeedbackPopup.qml @@ -25,7 +25,6 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 -import QtQuick.Controls.Styles 1.4 import QtQuick.Window 2.15 Rectangle { -- cgit v1.2.3 From f8e83c83d38ff7392504d85a8dc975680e9ceedf Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 29 Sep 2022 09:07:29 +0200 Subject: Add ApplicationSource The KUserFeedback data sources do not include the application name. Since we have "Qt Design Studio" and "Qt Creator" this makes distinguishing the different applications easier. I added also the version for consistency and ease of use on the server side. Task-number: QDS-7821 Change-Id: I4b71f1ca8797e21bbbc8d1e2a1a21dac0b6d5eee Reviewed-by: Tim Jenssen --- src/CMakeLists.txt | 1 + src/datasources/applicationsource.cpp | 53 +++++++++++++++++++++++++++++++++++ src/datasources/applicationsource.h | 40 ++++++++++++++++++++++++++ src/usagestatisticplugin.cpp | 8 ++++-- 4 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 src/datasources/applicationsource.cpp create mode 100644 src/datasources/applicationsource.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 58c0f82..94167a6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,7 @@ add_qtc_plugin(UsageStatistic datasources/qmldesignerusagetimesource.cpp datasources/qmldesignerusageeventsource.cpp datasources/servicesource.cpp + datasources/applicationsource.cpp ui/usagestatisticpage.cpp ui/usagestatisticwidget.cpp services/datasubmitter.cpp diff --git a/src/datasources/applicationsource.cpp b/src/datasources/applicationsource.cpp new file mode 100644 index 0000000..57bf542 --- /dev/null +++ b/src/datasources/applicationsource.cpp @@ -0,0 +1,53 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0 + +#include "applicationsource.h" + +#include +#include + +#include "common/scopedsettingsgroupsetter.h" +#include "common/utils.h" + +#include + +namespace UsageStatistic { +namespace Internal { + +using namespace KUserFeedback; + +ApplicationSource::ApplicationSource() + : AbstractDataSource("applicationData", Provider::BasicSystemInformation) +{} + +QString ApplicationSource::name() const +{ + return tr("Application data"); +} + +QString ApplicationSource::description() const +{ + return tr("The name and version of the application."); +} + +QVariant ApplicationSource::data() +{ + return QVariantMap{ + {"applicationName", Core::Constants::IDE_DISPLAY_NAME}, + {"applicationVersion", Core::Constants::IDE_VERSION_LONG}, + + }; +} + +void ApplicationSource::loadImpl(QSettings *settings) +{ + auto setter = ScopedSettingsGroupSetter::forDataSource(*this, *settings); +} + +void ApplicationSource::storeImpl(QSettings *settings) +{ + auto setter = ScopedSettingsGroupSetter::forDataSource(*this, *settings); +} + +} // namespace Internal +} // namespace UsageStatistic diff --git a/src/datasources/applicationsource.h b/src/datasources/applicationsource.h new file mode 100644 index 0000000..5dc08bb --- /dev/null +++ b/src/datasources/applicationsource.h @@ -0,0 +1,40 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0 + +#pragma once + +#include + +#include +#include + +namespace UsageStatistic { +namespace Internal { + +//! Additional application data +class ApplicationSource : public KUserFeedback::AbstractDataSource +{ + Q_DECLARE_TR_FUNCTIONS(ApplicationSource); + +public: + ApplicationSource(); + +public: // AbstractDataSource interface + QString name() const override; + + QString description() const override; + + /*! The output data format is: + * { + * "applicationName": "Qt Creator", + * "applicationVersion": "8.0.0" + * } + */ + QVariant data() override; + + void loadImpl(QSettings *settings) override; + void storeImpl(QSettings *settings) override; +}; + +} // Internal +} // UsageStatistic diff --git a/src/usagestatisticplugin.cpp b/src/usagestatisticplugin.cpp index 98689eb..aa8ce90 100644 --- a/src/usagestatisticplugin.cpp +++ b/src/usagestatisticplugin.cpp @@ -49,14 +49,15 @@ #include #include -#include "datasources/qtclicensesource.h" +#include "datasources/applicationsource.h".h " #include "datasources/buildcountsource.h" #include "datasources/buildsystemsource.h" -#include "datasources/modeusagetimesource.h" #include "datasources/examplesdatasource.h" #include "datasources/kitsource.h" -#include "datasources/qmldesignerusagetimesource.h" +#include "datasources/modeusagetimesource.h" #include "datasources/qmldesignerusageeventsource.h" +#include "datasources/qmldesignerusagetimesource.h" +#include "datasources/qtclicensesource.h" #include "datasources/servicesource.h" #include "services/datasubmitter.h" @@ -102,6 +103,7 @@ static void addDefaultDataSources(KUserFeedback::Provider &provider) static void addQtCreatorDataSources(KUserFeedback::Provider &provider) { + provider.addDataSource(new ApplicationSource); provider.addDataSource(new QtcLicenseSource); provider.addDataSource(new BuildCountSource); provider.addDataSource(new BuildSystemSource); -- cgit v1.2.3