platform: send statistics about IDE auto-update (FUS-140)

This commit is contained in:
nik
2018-07-16 10:12:41 +03:00
parent f26b9b457b
commit 98b35405bc
5 changed files with 73 additions and 7 deletions
@@ -0,0 +1,13 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.openapi.updateSettings.impl;
import com.intellij.internal.statistic.service.fus.collectors.ApplicationUsageTriggerCollector;
import org.jetbrains.annotations.NotNull;
public class IdeUpdateUsageTriggerCollector extends ApplicationUsageTriggerCollector {
@NotNull
@Override
public String getGroupId() {
return "statistics.ide.autoupdate";
}
}
@@ -8,6 +8,7 @@ import com.intellij.ide.IdeBundle
import com.intellij.ide.externalComponents.ExternalComponentManager
import com.intellij.ide.plugins.*
import com.intellij.ide.util.PropertiesComponent
import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger
import com.intellij.notification.*
import com.intellij.openapi.application.*
import com.intellij.openapi.application.ex.ApplicationInfoEx
@@ -400,8 +401,12 @@ object UpdateChecker {
runnable.invoke()
}
else {
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector::class.java, "notification.shown")
val message = IdeBundle.message("updates.ready.message", ApplicationNamesInfo.getInstance().fullProductName)
showNotification(project, message, runnable, NotificationUniqueType.PLATFORM)
showNotification(project, message, {
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector::class.java, "notification.clicked")
runnable()
}, NotificationUniqueType.PLATFORM)
}
return
}
@@ -3,12 +3,15 @@ package com.intellij.openapi.updateSettings.impl;
import com.intellij.ide.AppLifecycleListener;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger;
import com.intellij.notification.NotificationListener;
import com.intellij.notification.NotificationType;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationInfo;
import com.intellij.openapi.application.ConfigImportHelper;
import com.intellij.openapi.application.PathManager;
import com.intellij.openapi.application.ex.ApplicationInfoEx;
import com.intellij.openapi.components.ApplicationComponent;
import com.intellij.openapi.diagnostic.Logger;
@@ -19,11 +22,13 @@ import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.PluginsAdve
import com.intellij.openapi.util.BuildNumber;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Alarm;
import com.intellij.util.text.DateFormatUtil;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import static com.intellij.openapi.application.PathManager.isSnap;
@@ -36,6 +41,7 @@ public class UpdateCheckerComponent implements Disposable, ApplicationComponent
private static final Logger LOG = Logger.getInstance(UpdateCheckerComponent.class);
private static final long CHECK_INTERVAL = DateFormatUtil.DAY;
static final String AUTO_UPDATE_STARTED_FOR_BUILD_PROPERTY = "ide.autoupdate.started.for.build";
private final Alarm myCheckForUpdatesAlarm = new Alarm(Alarm.ThreadToUse.SWING_THREAD);
private final Runnable myCheckRunnable = () -> UpdateChecker.updateAndShowResult().doWhenProcessed(() -> queueNextCheck(CHECK_INTERVAL));
@@ -118,9 +124,25 @@ public class UpdateCheckerComponent implements Disposable, ApplicationComponent
@Override
public void initComponent() {
checkIfPreviousUpdateFailed();
PluginsAdvertiser.ensureDeleted();
}
private static void checkIfPreviousUpdateFailed() {
PropertiesComponent properties = PropertiesComponent.getInstance();
if (ApplicationInfo.getInstance().getBuild().asString().equals(properties.getValue(AUTO_UPDATE_STARTED_FOR_BUILD_PROPERTY))) {
File updateErrorsLog = new File(PathManager.getLogPath(), "idea_updater_error.log");
try {
if (updateErrorsLog.isFile() && !StringUtil.isEmptyOrSpaces(FileUtil.loadFile(updateErrorsLog))) {
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector.class, "update.failed");
}
}
catch (IOException ignored) {
}
}
properties.setValue(AUTO_UPDATE_STARTED_FOR_BUILD_PROPERTY, null);
}
@Override
public void dispose() {
}
@@ -5,6 +5,8 @@ import com.intellij.execution.CommandLineUtil;
import com.intellij.ide.BrowserUtil;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.plugins.IdeaPluginDescriptor;
import com.intellij.ide.util.PropertiesComponent;
import com.intellij.internal.statistic.service.fus.collectors.FUSApplicationUsageTrigger;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationListener;
import com.intellij.notification.NotificationType;
@@ -128,6 +130,18 @@ class UpdateInfoDialog extends AbstractUpdateDialog {
}
}
@Override
protected void init() {
super.init();
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector.class, "dialog.shown");
if (myPatch == null) {
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector.class, "dialog.shown.no.patch");
}
else if (!ApplicationManager.getApplication().isRestartCapable()) {
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector.class, "dialog.shown.manual.patch");
}
}
@Override
protected JComponent createCenterPanel() {
return new UpdateInfoPanel().myPanel;
@@ -217,7 +231,7 @@ class UpdateInfoDialog extends AbstractUpdateDialog {
Application app = ApplicationManager.getApplication();
if (app.isRestartCapable()) {
if (indicator.isShowing()) {
app.invokeLater(() -> ((ApplicationImpl)app).exit(true, true, true, command));
restartLaterAndRunCommand(command);
}
else {
String title = IdeBundle.message("update.notifications.title");
@@ -225,7 +239,7 @@ class UpdateInfoDialog extends AbstractUpdateDialog {
UpdateChecker.NOTIFICATIONS.createNotification(title, message, NotificationType.INFORMATION, new NotificationListener.Adapter() {
@Override
protected void hyperlinkActivated(@NotNull Notification notification, @NotNull HyperlinkEvent e) {
app.invokeLater(() -> ((ApplicationImpl)app).exit(true, true, true, command));
restartLaterAndRunCommand(command);
}
}).notify(null);
}
@@ -237,6 +251,13 @@ class UpdateInfoDialog extends AbstractUpdateDialog {
}.queue();
}
private static void restartLaterAndRunCommand(String[] command) {
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector.class, "dialog.update.started");
PropertiesComponent.getInstance().setValue(UpdateCheckerComponent.AUTO_UPDATE_STARTED_FOR_BUILD_PROPERTY, ApplicationInfo.getInstance().getBuild().asString());
ApplicationImpl application = (ApplicationImpl)ApplicationManager.getApplication();
application.invokeLater(() -> application.exit(true, true, true, command));
}
private void openDownloadPage() {
String url = myNewBuild.getDownloadUrl();
assert !StringUtil.isEmptyOrSpaces(url) : "channel:" + myUpdatedChannel.getId() + " build:" + myNewBuild.getNumber();
@@ -259,20 +280,24 @@ class UpdateInfoDialog extends AbstractUpdateDialog {
}
String title = IdeBundle.message("update.notifications.title"), message = IdeBundle.message("update.apply.manually.message", file);
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector.class, "dialog.manual.patch.prepared");
ApplicationManager.getApplication().invokeLater(() -> Messages.showInfoMessage(message, title));
}
private static class ButtonAction extends AbstractAction {
private final String myUrl;
private final ButtonInfo myInfo;
private ButtonAction(ButtonInfo info) {
private ButtonAction(@NotNull ButtonInfo info) {
super(info.getName());
myUrl = info.getUrl();
myInfo = info;
}
@Override
public void actionPerformed(ActionEvent e) {
BrowserUtil.browse(augmentUrl(myUrl));
if (myInfo.isDownload()) {
FUSApplicationUsageTrigger.getInstance().trigger(IdeUpdateUsageTriggerCollector.class, "dialog.download.clicked");
}
BrowserUtil.browse(augmentUrl(myInfo.getUrl()));
}
}
@@ -436,6 +436,7 @@
<statistics.projectUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.RegistryProjectUsagesCollector"/>
<statistics.projectUsagesCollector implementation="com.intellij.featureStatistics.fusCollectors.ProjectLifecycleUsageTriggerCollector"/>
<statistics.applicationUsagesCollector implementation="com.intellij.featureStatistics.fusCollectors.AppLifecycleUsageTriggerCollector"/>
<statistics.applicationUsagesCollector implementation="com.intellij.openapi.updateSettings.impl.IdeUpdateUsageTriggerCollector"/>
<statistic.eventLog.fusEventLoggerProvider implementation="com.intellij.internal.statistic.eventLog.FeatureUsageFileEventLoggerProvider"/>
<postStartupActivity implementation="com.intellij.internal.statistic.eventLog.SystemStateMonitor"/>