From 9f1363b53c1bedc778f7deeaae8b801ff69639b5 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 8 Oct 2019 18:48:28 +0200 Subject: [PATCH] Assorted fixes and improvements to plugins advertiser notifications GitOrigin-RevId: d0051bf4ba22e646631e0056f35d24bfa8e60b50 --- .../IdeUrlTrackingParametersProvider.java | 12 +++- .../UtmIdeUrlTrackingParametersProvider.java | 18 +++-- ...nAdvertiserEditorNotificationProvider.java | 3 + .../PluginsAdvertiser.java | 65 ++----------------- .../PluginsAdvertiserStartupActivity.java | 52 +++++++++++---- .../src/META-INF/LangExtensions.xml | 1 - .../src/META-INF/PlatformExtensions.xml | 2 + 7 files changed, 72 insertions(+), 81 deletions(-) diff --git a/platform/core-api/src/com/intellij/openapi/application/IdeUrlTrackingParametersProvider.java b/platform/core-api/src/com/intellij/openapi/application/IdeUrlTrackingParametersProvider.java index 05a02ed6fe43..8fb58247cfa8 100644 --- a/platform/core-api/src/com/intellij/openapi/application/IdeUrlTrackingParametersProvider.java +++ b/platform/core-api/src/com/intellij/openapi/application/IdeUrlTrackingParametersProvider.java @@ -1,6 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2019 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.application; import com.intellij.openapi.components.ServiceManager; @@ -24,4 +22,12 @@ public class IdeUrlTrackingParametersProvider { public String augmentUrl(@NotNull String originalUrl) { return originalUrl; } + + /** + * @return {@code originalUrl} with appended parameters + */ + @NotNull + public String augmentUrl(@NotNull String originalUrl, String campaignId) { + return originalUrl; + } } diff --git a/platform/platform-api/src/com/intellij/ide/customization/UtmIdeUrlTrackingParametersProvider.java b/platform/platform-api/src/com/intellij/ide/customization/UtmIdeUrlTrackingParametersProvider.java index 96d34e5746c4..4a5525f16029 100644 --- a/platform/platform-api/src/com/intellij/ide/customization/UtmIdeUrlTrackingParametersProvider.java +++ b/platform/platform-api/src/com/intellij/ide/customization/UtmIdeUrlTrackingParametersProvider.java @@ -1,6 +1,4 @@ -/* - * Copyright 2000-2017 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. - */ +// Copyright 2000-2019 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.ide.customization; import com.intellij.openapi.application.ApplicationInfo; @@ -20,14 +18,20 @@ public class UtmIdeUrlTrackingParametersProvider extends IdeUrlTrackingParameter @NotNull @Override public String augmentUrl(@NotNull String originalUrl) { + return augmentUrl(originalUrl, ApplicationInfo.getInstance().getBuild().getProductCode()); + } + + @NotNull + @Override + public String augmentUrl(@NotNull String originalUrl, String campaignId) { try { ApplicationInfo info = ApplicationInfo.getInstance(); String productVersion = info.getMajorVersion() + "." + info.getMinorVersionMainPart(); return new URIBuilder(originalUrl).addParameter("utm_source", "product") - .addParameter("utm_medium", "link") - .addParameter("utm_campaign", info.getBuild().getProductCode()) - .addParameter("utm_content", productVersion) - .build().toString(); + .addParameter("utm_medium", "link") + .addParameter("utm_campaign", campaignId) + .addParameter("utm_content", productVersion) + .build().toString(); } catch (URISyntaxException e) { LOG.warn(originalUrl, e); diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginAdvertiserEditorNotificationProvider.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginAdvertiserEditorNotificationProvider.java index 84a10a8b1c48..8066f7d9139a 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginAdvertiserEditorNotificationProvider.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginAdvertiserEditorNotificationProvider.java @@ -3,6 +3,7 @@ package com.intellij.openapi.updateSettings.impl.pluginsAdvertisement; import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.util.PropertiesComponent; +import com.intellij.internal.statistic.service.fus.collectors.FUCounterUsageLogger; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.fileTypes.FileTypeFactory; @@ -86,6 +87,7 @@ public class PluginAdvertiserEditorNotificationProvider extends EditorNotificati panel.createActionLabel("Enable " + disabledPlugin.getName() + " plugin", () -> { myEnabledExtensions.add(extension); EditorNotifications.getInstance(project).updateAllNotifications(); + FUCounterUsageLogger.getInstance().logEvent(PluginsAdvertiser.FUS_GROUP_ID, "enable.plugins.editor"); PluginsAdvertiser.enablePlugins(project, Collections.singletonList(disabledPlugin)); }); } else if (hasNonBundledPlugin(plugins)) { @@ -107,6 +109,7 @@ public class PluginAdvertiserEditorNotificationProvider extends EditorNotificati panel.createActionLabel(PluginsAdvertiser.CHECK_ULTIMATE_EDITION_TITLE, () -> { myEnabledExtensions.add(extension); + FUCounterUsageLogger.getInstance().logEvent(PluginsAdvertiser.FUS_GROUP_ID, "open.download.page.editor"); PluginsAdvertiser.openDownloadPage(); }); diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiser.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiser.java index d029b083bc76..97f02b12e83b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiser.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiser.java @@ -11,12 +11,10 @@ import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManagerConfigurable; import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.ide.plugins.RepositoryHelper; -import com.intellij.ide.util.PropertiesComponent; -import com.intellij.notification.Notification; import com.intellij.notification.NotificationDisplayType; import com.intellij.notification.NotificationGroup; -import com.intellij.notification.NotificationListener; import com.intellij.openapi.application.ApplicationInfo; +import com.intellij.openapi.application.IdeUrlTrackingParametersProvider; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.application.impl.ApplicationInfoImpl; import com.intellij.openapi.diagnostic.Logger; @@ -43,7 +41,6 @@ import com.intellij.util.xmlb.annotations.XMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.event.HyperlinkEvent; import java.io.File; import java.io.IOException; import java.util.*; @@ -53,11 +50,12 @@ public final class PluginsAdvertiser { private static final String CASHED_EXTENSIONS = "extensions.xml"; public static final String IGNORE_ULTIMATE_EDITION = "ignoreUltimateEdition"; - public static final String IDEA_ULTIMATE_EDITION = "IntelliJ IDEA Ultimate Edition"; - public static final String ULTIMATE_EDITION_SUGGESTION = "Do not suggest Ultimate Edition"; - public static final String CHECK_ULTIMATE_EDITION_TITLE = "Check " + IDEA_ULTIMATE_EDITION; + public static final String IDEA_ULTIMATE_EDITION = "IntelliJ IDEA Ultimate"; + public static final String ULTIMATE_EDITION_SUGGESTION = "Do not suggest Ultimate"; + public static final String CHECK_ULTIMATE_EDITION_TITLE = "Try " + IDEA_ULTIMATE_EDITION; public static final String DISPLAY_ID = "Plugins Suggestion"; public static final NotificationGroup NOTIFICATION_GROUP = new NotificationGroup(DISPLAY_ID, NotificationDisplayType.STICKY_BALLOON, true); + public static final String FUS_GROUP_ID = "plugins.advertiser"; private static SoftReference ourKnownExtensions = new SoftReference<>(null); @@ -176,7 +174,7 @@ public final class PluginsAdvertiser { } public static void openDownloadPage() { - BrowserUtil.browse(ApplicationInfo.getInstance().getCompanyURL()); + BrowserUtil.browse(IdeUrlTrackingParametersProvider.getInstance().augmentUrl("https://www.jetbrains.com/idea/download/")); } static void enablePlugins(Project project, final Collection disabledPlugins) { @@ -321,55 +319,4 @@ public final class PluginsAdvertiser { return Comparing.compare(myPluginId, other.myPluginId); } } - - static class ConfigurePluginsListener implements NotificationListener { - private final Set myUnknownFeatures; - private final Project myProject; - private final List myAllPlugins; - private final Set myPlugins; - private final Map myDisabledPlugins; - - ConfigurePluginsListener(Set unknownFeatures, - Project project, - List allPlugins, - Set plugins, - Map disabledPlugins) { - myUnknownFeatures = unknownFeatures; - myProject = project; - myAllPlugins = allPlugins; - myPlugins = plugins; - myDisabledPlugins = disabledPlugins; - } - - @Override - public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { - if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { - final String description = event.getDescription(); - if ("ignore".equals(description)) { - UnknownFeaturesCollector featuresCollector = UnknownFeaturesCollector.getInstance(myProject); - for (UnknownFeature feature : myUnknownFeatures) { - featuresCollector.ignoreFeature(feature); - } - notification.expire(); - } - else if ("configure".equals(description)) { - LOG.assertTrue(myAllPlugins != null); - notification.expire(); - new PluginsAdvertiserDialog(myProject, myPlugins.toArray(new PluginDownloader[0]), myAllPlugins).show(); - } - else if ("enable".equals(description)) { - enablePlugins(myProject, myDisabledPlugins.values()); - notification.expire(); - } - else if ("ignoreUltimate".equals(description)) { - PropertiesComponent.getInstance().setValue(IGNORE_ULTIMATE_EDITION, "true"); - notification.expire(); - } - else if ("open".equals(description)) { - openDownloadPage(); - notification.expire(); - } - } - } - } } \ No newline at end of file diff --git a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserStartupActivity.java b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserStartupActivity.java index b97e0053ea92..2af99ff0c7ea 100644 --- a/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserStartupActivity.java +++ b/platform/platform-impl/src/com/intellij/openapi/updateSettings/impl/pluginsAdvertisement/PluginsAdvertiserStartupActivity.java @@ -5,6 +5,9 @@ import com.intellij.ide.plugins.IdeaPluginDescriptor; import com.intellij.ide.plugins.PluginManagerCore; import com.intellij.ide.plugins.RepositoryHelper; import com.intellij.ide.util.PropertiesComponent; +import com.intellij.internal.statistic.service.fus.collectors.FUCounterUsageLogger; +import com.intellij.notification.Notification; +import com.intellij.notification.NotificationAction; import com.intellij.notification.NotificationType; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; @@ -112,30 +115,57 @@ final class PluginsAdvertiserStartupActivity implements StartupActivity.Backgrou return; } + List notificationActions = new ArrayList<>(); + String message = null; if (!plugins.isEmpty() || !disabledPlugins.isEmpty()) { message = getAddressedMessagePresentation(plugins, disabledPlugins, features); if (!disabledPlugins.isEmpty()) { - message += "Enable plugins...
"; + notificationActions.add(NotificationAction.createSimpleExpiring( + "Enable Plugins...", () -> { + FUCounterUsageLogger.getInstance().logEvent(PluginsAdvertiser.FUS_GROUP_ID, "enable.plugins.notification"); + PluginsAdvertiser.enablePlugins(project, disabledPlugins.values()); + })); } else { - message += "Configure plugins...
"; + notificationActions.add(NotificationAction.createSimpleExpiring( + "Configure Plugins...", () -> { + FUCounterUsageLogger.getInstance().logEvent(PluginsAdvertiser.FUS_GROUP_ID, "configure.plugins"); + new PluginsAdvertiserDialog(project, plugins.toArray(new PluginDownloader[0]), allPlugins).show(); + })); } - - message += "Ignore Unknown Features"; + notificationActions.add(NotificationAction.createSimpleExpiring( + "Ignore Unknown Features", + () -> { + FUCounterUsageLogger.getInstance().logEvent(PluginsAdvertiser.FUS_GROUP_ID, "ignore.unknown.features"); + UnknownFeaturesCollector featuresCollector = UnknownFeaturesCollector.getInstance(project); + for (UnknownFeature feature : unknownFeatures) { + featuresCollector.ignoreFeature(feature); + } + })); } else if (bundledPlugin != null && !PropertiesComponent.getInstance().isTrueValue(PluginsAdvertiser.IGNORE_ULTIMATE_EDITION)) { message = "Features covered by " + PluginsAdvertiser.IDEA_ULTIMATE_EDITION + - " (" + StringUtil.join(bundledPlugin, ", ") + ") are detected.
" + - "" + PluginsAdvertiser.CHECK_ULTIMATE_EDITION_TITLE + "
" + - "" + PluginsAdvertiser.ULTIMATE_EDITION_SUGGESTION + ""; + " (" + StringUtil.join(bundledPlugin, ", ") + ") are detected"; + notificationActions.add(NotificationAction.createSimpleExpiring( + PluginsAdvertiser.CHECK_ULTIMATE_EDITION_TITLE, () -> { + FUCounterUsageLogger.getInstance().logEvent(PluginsAdvertiser.FUS_GROUP_ID, "open.download.page.notification"); + PluginsAdvertiser.openDownloadPage(); + })); + notificationActions.add(NotificationAction.createSimpleExpiring( + PluginsAdvertiser.ULTIMATE_EDITION_SUGGESTION, () -> { + FUCounterUsageLogger.getInstance().logEvent(PluginsAdvertiser.FUS_GROUP_ID, "ignore.ultimate"); + PropertiesComponent.getInstance().setValue(PluginsAdvertiser.IGNORE_ULTIMATE_EDITION, "true"); + })); } if (message != null) { - PluginsAdvertiser.ConfigurePluginsListener - notificationListener = new PluginsAdvertiser.ConfigurePluginsListener(unknownFeatures, project, allPlugins, plugins, disabledPlugins); - PluginsAdvertiser.NOTIFICATION_GROUP - .createNotification(PluginsAdvertiser.DISPLAY_ID, message, NotificationType.INFORMATION, notificationListener).notify(project); + Notification notification = PluginsAdvertiser.NOTIFICATION_GROUP + .createNotification("", message, NotificationType.INFORMATION, null); + for (NotificationAction action : notificationActions) { + notification.addAction(action); + } + notification.notify(project); } }, ModalityState.NON_MODAL); } diff --git a/platform/platform-resources/src/META-INF/LangExtensions.xml b/platform/platform-resources/src/META-INF/LangExtensions.xml index 03b3a235cff9..858448287ce6 100644 --- a/platform/platform-resources/src/META-INF/LangExtensions.xml +++ b/platform/platform-resources/src/META-INF/LangExtensions.xml @@ -942,7 +942,6 @@ - diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index 9353cf52948d..c25f19020571 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -563,6 +563,8 @@ + +