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 @@ +