diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/IdeUpdateUsageTriggerCollector.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/IdeUpdateUsageTriggerCollector.java
new file mode 100644
index 000000000000..99f3fe5214eb
--- /dev/null
+++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/IdeUpdateUsageTriggerCollector.java
@@ -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";
+ }
+}
diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.kt b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.kt
index 1f647c44668a..4f36d88a1457 100644
--- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.kt
+++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateChecker.kt
@@ -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
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java
index 8ea42eb7aa82..c703af722ad3 100644
--- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java
+++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateCheckerComponent.java
@@ -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() {
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java
index 70ac4cdcf4dd..88e51fadb68d 100644
--- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java
+++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/UpdateInfoDialog.java
@@ -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()));
}
}
diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml
index 47b2bcf95808..0f198da76291 100644
--- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml
+++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml
@@ -436,6 +436,7 @@
+