From 121e2fd46ca109e6aadef0924f8ef9fcd1931bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Thu, 24 Nov 2016 04:10:07 +0100 Subject: [PATCH] NOISSUE add analytics settings (enable/disable) --- application/MultiMC.cpp | 44 +++++++++--- application/MultiMC.h | 1 + application/pages/global/MultiMCPage.cpp | 17 +++++ application/pages/global/MultiMCPage.ui | 70 ++++++++++++++++++- libraries/ganalytics/include/ganalytics.h | 7 +- libraries/ganalytics/src/ganalytics.cpp | 9 ++- .../ganalytics/src/ganalytics_worker.cpp | 57 ++++++++------- libraries/ganalytics/src/ganalytics_worker.h | 4 +- 8 files changed, 156 insertions(+), 53 deletions(-) diff --git a/application/MultiMC.cpp b/application/MultiMC.cpp index 2a903437..83bb731d 100644 --- a/application/MultiMC.cpp +++ b/application/MultiMC.cpp @@ -513,14 +513,11 @@ void MultiMC::initAnalytics() { if(BuildConfig.ANALYTICS_ID.isEmpty()) { - qDebug() << "Analytics disabled by build."; - return; - } - if(!m_settings->get("Analytics").toBool()) - { - qDebug() << "Analytics disabled by user."; return; } + + auto analyticsSetting = m_settings->getSetting("Analytics"); + connect(analyticsSetting.get(), &Setting::SettingChanged, this, &MultiMC::analyticsSettingChanged); QString clientID = m_settings->get("AnalyticsClientID").toString(); if(clientID.isEmpty()) { @@ -533,9 +530,15 @@ void MultiMC::initAnalytics() m_analytics->setLogLevel(GAnalytics::Debug); m_analytics->setAnonymizeIPs(true); m_analytics->setNetworkAccessManager(&ENV.qnam()); - m_analytics->startSending(); + + if(!m_settings->get("Analytics").toBool()) + { + qDebug() << "Analytics disabled by user."; + return; + } + + m_analytics->enable(); qDebug() << "Initialized analytics with tid" << BuildConfig.ANALYTICS_ID << "and cid" << clientID; - // TODO: load unsent messages? } void MultiMC::shutdownAnalytics() @@ -546,6 +549,22 @@ void MultiMC::shutdownAnalytics() } } +void MultiMC::analyticsSettingChanged(const Setting&, QVariant value) +{ + if(!m_analytics) + return; + bool enabled = value.toBool(); + if(enabled) + { + qDebug() << "Analytics enabled by user."; + } + else + { + qDebug() << "Analytics disabled by user."; + } + m_analytics->enable(enabled); +} + void MultiMC::initInstances() { auto InstDirSetting = m_settings->getSetting("InstanceDir"); @@ -703,9 +722,12 @@ void MultiMC::initGlobalSettings() // paste.ee API key m_settings->registerSetting("PasteEEAPIKey", "multimc"); - // Analytics - m_settings->registerSetting("Analytics", true); - m_settings->registerSetting("AnalyticsClientID", QString()); + if(!BuildConfig.ANALYTICS_ID.isEmpty()) + { + // Analytics + m_settings->registerSetting("Analytics", true); + m_settings->registerSetting("AnalyticsClientID", QString()); + } // Init page provider { diff --git a/application/MultiMC.h b/application/MultiMC.h index 55f63ac4..ae0ed531 100644 --- a/application/MultiMC.h +++ b/application/MultiMC.h @@ -162,6 +162,7 @@ private slots: void controllerSucceeded(); void controllerFailed(const QString & error); + void analyticsSettingChanged(const Setting &setting, QVariant value); private: void initLogger(); diff --git a/application/pages/global/MultiMCPage.cpp b/application/pages/global/MultiMCPage.cpp index 03b0c1be..11129d86 100644 --- a/application/pages/global/MultiMCPage.cpp +++ b/application/pages/global/MultiMCPage.cpp @@ -75,6 +75,11 @@ MultiMCPage::MultiMCPage(QWidget *parent) : QWidget(parent), ui(new Ui::MultiMCP { ui->updateSettingsBox->setHidden(true); } + // Analytics + if(BuildConfig.ANALYTICS_ID.isEmpty()) + { + ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->analyticsTab)); + } connect(ui->fontSizeBox, SIGNAL(valueChanged(int)), SLOT(refreshFontPreview())); connect(ui->consoleFont, SIGNAL(currentFontChanged(QFont)), SLOT(refreshFontPreview())); } @@ -346,6 +351,12 @@ void MultiMCPage::applySettings() s->set("InstSortMode", "Name"); break; } + + // Analytics + if(!BuildConfig.ANALYTICS_ID.isEmpty()) + { + s->set("Analytics", ui->analyticsCheck->isChecked()); + } } void MultiMCPage::loadSettings() { @@ -467,6 +478,12 @@ void MultiMCPage::loadSettings() { ui->sortByNameBtn->setChecked(true); } + + // Analytics + if(!BuildConfig.ANALYTICS_ID.isEmpty()) + { + ui->analyticsCheck->setChecked(s->get("Analytics").toBool()); + } } void MultiMCPage::refreshFontPreview() diff --git a/application/pages/global/MultiMCPage.ui b/application/pages/global/MultiMCPage.ui index 5336afdb..f9d74a38 100644 --- a/application/pages/global/MultiMCPage.ui +++ b/application/pages/global/MultiMCPage.ui @@ -6,7 +6,7 @@ 0 0 - 487 + 458 614 @@ -31,6 +31,9 @@ + + + QTabWidget::Rounded @@ -431,7 +434,7 @@ - + Console @@ -566,6 +569,69 @@ + + + Analytics + + + + + + Analytics Settings + + + + + + Send anonymous usage statistics? + + + + + + + Qt::Horizontal + + + + + + + <html><head/> +<body> +<p>MultiMC sends anonymous usage statistics on every start of the application.</p><p>The following data is collected:</p> +<ul> +<li>MultiMC version.</li> +<li>Operating system name, version and architecture.</li> +<li>CPU architecture (kernel architecture on linux).</li> +<li>Size of system memory.</li> +<li>Java version, architecture and memory settings.</li> +</ul> +</body></html> + + + true + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + diff --git a/libraries/ganalytics/include/ganalytics.h b/libraries/ganalytics/include/ganalytics.h index 48025dc1..1776c71e 100644 --- a/libraries/ganalytics/include/ganalytics.h +++ b/libraries/ganalytics/include/ganalytics.h @@ -39,8 +39,8 @@ public: void setSendInterval(int milliseconds); int sendInterval() const; - void startSending(); - bool isSending() const; + void enable(bool state = true); + bool isEnabled(); /// Get or set the network access manager. If none is set, the class creates its own on the first request void setNetworkAccessManager(QNetworkAccessManager *networkAccessManager); @@ -54,9 +54,6 @@ public slots: void startSession(); void endSession(); -signals: - void isSendingChanged(bool isSending); - private: GAnalyticsWorker *d; diff --git a/libraries/ganalytics/src/ganalytics.cpp b/libraries/ganalytics/src/ganalytics.cpp index a03dfcad..bc3fe21e 100644 --- a/libraries/ganalytics/src/ganalytics.cpp +++ b/libraries/ganalytics/src/ganalytics.cpp @@ -80,15 +80,14 @@ int GAnalytics::sendInterval() const return (d->m_timer.interval()); } -void GAnalytics::startSending() +bool GAnalytics::isEnabled() { - if (!isSending()) - d->postMessage(); + return d->m_isEnabled; } -bool GAnalytics::isSending() const +void GAnalytics::enable(bool state) { - return d->m_isSending; + d->enable(state); } void GAnalytics::setNetworkAccessManager(QNetworkAccessManager *networkAccessManager) diff --git a/libraries/ganalytics/src/ganalytics_worker.cpp b/libraries/ganalytics/src/ganalytics_worker.cpp index 2b03e14c..d002924f 100644 --- a/libraries/ganalytics/src/ganalytics_worker.cpp +++ b/libraries/ganalytics/src/ganalytics_worker.cpp @@ -23,10 +23,31 @@ GAnalyticsWorker::GAnalyticsWorker(GAnalytics *parent) m_language = QLocale::system().name().toLower().replace("_", "-"); m_screenResolution = getScreenResolution(); - m_timer.start(30000); + m_timer.setInterval(m_timerInterval); connect(&m_timer, &QTimer::timeout, this, &GAnalyticsWorker::postMessage); } +void GAnalyticsWorker::enable(bool state) +{ + // state change to the same is not valid. + if(m_isEnabled == state) + { + return; + } + + m_isEnabled = state; + if(m_isEnabled) + { + // enable -> start doing things :) + m_timer.start(); + } + else + { + // disable -> stop the timer + m_timer.stop(); + } +} + void GAnalyticsWorker::logMessage(GAnalytics::LogLevel level, const QString &message) { if (m_logLevel > level) @@ -145,30 +166,6 @@ void GAnalyticsWorker::enqueQueryWithCurrentTime(const QUrlQuery &query) m_messageQueue.enqueue(buffer); } -/** - * Change status of class. Emit signal that status was changed. - */ -void GAnalyticsWorker::setIsSending(bool doSend) -{ - if (doSend) - { - m_timer.stop(); - } - else - { - m_timer.start(); - } - - bool changed = (m_isSending != doSend); - - m_isSending = doSend; - - if (changed) - { - emit q->isSendingChanged(m_isSending); - } -} - /** * This function is called by a timer interval. * The function tries to send a messages from the queue. @@ -183,12 +180,14 @@ void GAnalyticsWorker::postMessage() { if (m_messageQueue.isEmpty()) { - setIsSending(false); + // queue empty -> try sending later + m_timer.start(); return; } else { - setIsSending(true); + // queue has messages -> stop timer and start sending + m_timer.stop(); } QString connection = "close"; @@ -243,8 +242,8 @@ void GAnalyticsWorker::postMessageFinished() { logMessage(GAnalytics::Error, QString("Error posting message: %s").arg(reply->errorString())); - // An error ocurred. - setIsSending(false); + // An error ocurred. Try sending later. + m_timer.start(); return; } else diff --git a/libraries/ganalytics/src/ganalytics_worker.h b/libraries/ganalytics/src/ganalytics_worker.h index 88fa223a..3504a032 100644 --- a/libraries/ganalytics/src/ganalytics_worker.h +++ b/libraries/ganalytics/src/ganalytics_worker.h @@ -38,7 +38,8 @@ public: QString m_viewportSize; bool m_anonymizeIPs = false; - bool m_isSending = false; + bool m_isEnabled = false; + int m_timerInterval = 30000; const static int fourHours = 4 * 60 * 60 * 1000; const static QLatin1String dateTimeFormat; @@ -54,6 +55,7 @@ public: void enqueQueryWithCurrentTime(const QUrlQuery &query); void setIsSending(bool doSend); + void enable(bool state); public slots: void postMessage();