Assorted fixes and improvements to plugins advertiser notifications

GitOrigin-RevId: d0051bf4ba22e646631e0056f35d24bfa8e60b50
This commit is contained in:
Dmitry Jemerov
2019-10-08 18:02:14 +00:00
committed by intellij-monorepo-bot
parent 8396388dd0
commit 9f1363b53c
7 changed files with 72 additions and 81 deletions
@@ -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;
}
}
@@ -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);
@@ -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();
});
@@ -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<KnownExtensions> 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<IdeaPluginDescriptor> disabledPlugins) {
@@ -321,55 +319,4 @@ public final class PluginsAdvertiser {
return Comparing.compare(myPluginId, other.myPluginId);
}
}
static class ConfigurePluginsListener implements NotificationListener {
private final Set<? extends UnknownFeature> myUnknownFeatures;
private final Project myProject;
private final List<? extends IdeaPluginDescriptor> myAllPlugins;
private final Set<PluginDownloader> myPlugins;
private final Map<Plugin, IdeaPluginDescriptor> myDisabledPlugins;
ConfigurePluginsListener(Set<? extends UnknownFeature> unknownFeatures,
Project project,
List<? extends IdeaPluginDescriptor> allPlugins,
Set<PluginDownloader> plugins,
Map<Plugin, IdeaPluginDescriptor> 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();
}
}
}
}
}
@@ -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<NotificationAction> notificationActions = new ArrayList<>();
String message = null;
if (!plugins.isEmpty() || !disabledPlugins.isEmpty()) {
message = getAddressedMessagePresentation(plugins, disabledPlugins, features);
if (!disabledPlugins.isEmpty()) {
message += "<a href=\"enable\">Enable plugins...</a><br>";
notificationActions.add(NotificationAction.createSimpleExpiring(
"Enable Plugins...", () -> {
FUCounterUsageLogger.getInstance().logEvent(PluginsAdvertiser.FUS_GROUP_ID, "enable.plugins.notification");
PluginsAdvertiser.enablePlugins(project, disabledPlugins.values());
}));
}
else {
message += "<a href=\"configure\">Configure plugins...</a><br>";
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 += "<a href=\"ignore\">Ignore Unknown Features</a>";
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.<br>" +
"<a href=\"open\">" + PluginsAdvertiser.CHECK_ULTIMATE_EDITION_TITLE + "</a><br>" +
"<a href=\"ignoreUltimate\">" + PluginsAdvertiser.ULTIMATE_EDITION_SUGGESTION + "</a>";
" (" + 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);
}
@@ -942,7 +942,6 @@
<copyPastePostProcessor implementation="com.intellij.codeInsight.editorActions.CopyPasteIndentProcessor"/>
<copyPastePostProcessor implementation="com.intellij.codeInsight.editorActions.CopyPasteFoldingProcessor"/>
<statistics.counterUsagesCollector groupId="ui.event" version="2"/>
<statistics.counterUsagesCollector groupId="tooltip.action.events" version="1"/>
<statistics.projectUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.fileTypes.FileTypeUsagesCollector"/>
@@ -563,6 +563,8 @@
<statistics.counterUsagesCollector groupId="vcs" version="1"/>
<statistics.counterUsagesCollector groupId="build" version="1"/>
<statistics.counterUsagesCollector groupId="project.import" version="1"/>
<statistics.counterUsagesCollector groupId="ui.event" version="2"/>
<statistics.counterUsagesCollector groupId="plugins.advertiser" version="1"/>
<statistics.projectUsagesCollector implementation="com.intellij.openapi.vcs.statistics.VcsOptionsUsagesCollector"/>
<statistics.projectUsagesCollector implementation="com.intellij.openapi.vcs.statistics.VcsUsagesCollector"/>