diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java index 11636bbca546131ed0c6c4f94f5654943ae55f94..6c9e0cfdd9dd16f0b9b276581d4a3cde2b119565 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/HotSwapManager.java @@ -196,6 +196,6 @@ public class HotSwapManager extends AbstractProjectComponent { reloadClassesProgress.setTitle(DebuggerBundle.message("progress.hotswap.reloading")); reloadClassesCommand.run(); - ActionsCollector.getInstance().record("Reload Classes"); + ActionsCollector.getInstance().record("Reload Classes", HotSwapManager.class); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipActionProvider.kt b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipActionProvider.kt index ea3df5211ae0fc4a920b49ba0319ad9b5034b63d..9a4a7013513deb2798dbfc89291013cdd4b11be2 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipActionProvider.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipActionProvider.kt @@ -32,7 +32,7 @@ class DaemonTooltipAction(private val myFixText: String, private val myActualOff } override fun execute(editor: Editor) { - ActionsCollector.getInstance().record("tooltip.actions.execute") + ActionsCollector.getInstance().record("tooltip.actions.execute", this::class.java) val project = editor.project ?: return val psiFile = PsiDocumentManager.getInstance(project).getPsiFile(editor.document) ?: return @@ -52,7 +52,7 @@ class DaemonTooltipAction(private val myFixText: String, private val myActualOff } override fun showAllActions(editor: Editor) { - ActionsCollector.getInstance().record("tooltip.actions.show.all") + ActionsCollector.getInstance().record("tooltip.actions.show.all", this::class.java) editor.caretModel.moveToOffset(myActualOffset) val project = editor.project ?: return diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipWithActionRenderer.kt b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipWithActionRenderer.kt index c017f6962a22d5b07cabc8dcf5402008a18f59a0..083648794fd62ade7bd71835f83c14190bd20f89 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipWithActionRenderer.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipWithActionRenderer.kt @@ -325,7 +325,7 @@ internal class DaemonTooltipWithActionRenderer(text: String?, } override fun setSelected(e: AnActionEvent, state: Boolean) { - ActionsCollector.getInstance().record("tooltip.actions.show.description.gear") + ActionsCollector.getInstance().record("tooltip.actions.show.description.gear", this::class.java) reloader.reload(state) } diff --git a/platform/platform-api/src/com/intellij/ide/actions/ActionsCollector.java b/platform/platform-api/src/com/intellij/ide/actions/ActionsCollector.java index 0569a22be8abbd43371cb1f350800a0edca39e30..b85a0baad600c0c8c8040c42544b677483f7df63 100644 --- a/platform/platform-api/src/com/intellij/ide/actions/ActionsCollector.java +++ b/platform/platform-api/src/com/intellij/ide/actions/ActionsCollector.java @@ -4,6 +4,8 @@ package com.intellij.ide.actions; import com.intellij.openapi.components.ServiceManager; import com.intellij.util.xmlb.annotations.MapAnnotation; import com.intellij.util.xmlb.annotations.Tag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -12,7 +14,17 @@ import java.util.Map; * @author Konstantin Bulenkov */ public abstract class ActionsCollector { - public abstract void record(String actionId); + /** + * Only actions from platform and JB plugins are recorded. + * If no context class is provided then nothing will be recorded. + * @deprecated + */ + public void record(String actionId) {} + + /** + * Only actions from platform and JB plugins are recorded. + */ + public abstract void record(@Nullable String actionId, @NotNull Class context); public abstract State getState(); diff --git a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java index 5be385fad6ca826ff95874419e74a721221418d8..3a24110262fe5f4c08b5cee6e5b5b33a0c495e65 100644 --- a/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java +++ b/platform/platform-api/src/com/intellij/openapi/ui/DialogWrapper.java @@ -1877,7 +1877,7 @@ public abstract class DialogWrapper { private void recordAction(String name, AWTEvent event) { if (event instanceof KeyEvent && ApplicationManager.getApplication() != null) { String shortcut = getKeystrokeText(KeyStroke.getKeyStrokeForEvent((KeyEvent)event)); - ActionsCollector.getInstance().record(name + " " + shortcut); + ActionsCollector.getInstance().record(name + " " + shortcut, DialogWrapper.class); } } diff --git a/platform/platform-impl/src/com/intellij/codeInsight/hint/LineTooltipRenderer.java b/platform/platform-impl/src/com/intellij/codeInsight/hint/LineTooltipRenderer.java index 5f3691c2cb752de40fb59f66d0c1f3ae329ea2ce..5e239bb13975e1e695fb955939674110f8160f1d 100644 --- a/platform/platform-impl/src/com/intellij/codeInsight/hint/LineTooltipRenderer.java +++ b/platform/platform-impl/src/com/intellij/codeInsight/hint/LineTooltipRenderer.java @@ -172,7 +172,7 @@ public class LineTooltipRenderer extends ComparableObject.Impl implements Toolti public void actionPerformed(final AnActionEvent e) { // The tooltip gets the focus if using a screen reader and invocation through a keyboard shortcut. hintHint.setRequestFocus(ScreenReader.isActive() && (e.getInputEvent() instanceof KeyEvent)); - ActionsCollector.getInstance().record("tooltip.actions.show.description.shortcut"); + ActionsCollector.getInstance().record("tooltip.actions.show.description.shortcut", this.getClass()); reloader.reload(!expanded); } }); @@ -200,7 +200,7 @@ public class LineTooltipRenderer extends ComparableObject.Impl implements Toolti return; } - ActionsCollector.getInstance().record("tooltip.actions.show.description.morelink"); + ActionsCollector.getInstance().record("tooltip.actions.show.description.morelink", this.getClass()); reloader.reload(!expanded); } diff --git a/platform/platform-impl/src/com/intellij/internal/statistic/collectors/fus/actions/persistence/ActionsCollectorImpl.java b/platform/platform-impl/src/com/intellij/internal/statistic/collectors/fus/actions/persistence/ActionsCollectorImpl.java index baca49afa681c7ecf7a559e9826d6ea9b1625a39..2ce841bcab53dd8b1bf90da2b54f4625c0f651d0 100644 --- a/platform/platform-impl/src/com/intellij/internal/statistic/collectors/fus/actions/persistence/ActionsCollectorImpl.java +++ b/platform/platform-impl/src/com/intellij/internal/statistic/collectors/fus/actions/persistence/ActionsCollectorImpl.java @@ -2,6 +2,10 @@ package com.intellij.internal.statistic.collectors.fus.actions.persistence; import com.intellij.ide.actions.ActionsCollector; +import com.intellij.ide.plugins.IdeaPluginDescriptor; +import com.intellij.ide.plugins.PluginManager; +import com.intellij.ide.plugins.PluginManagerCore; +import com.intellij.ide.plugins.PluginManagerMain; import com.intellij.internal.statistic.beans.ConvertUsagesUtil; import com.intellij.internal.statistic.eventLog.FeatureUsageLogger; import com.intellij.internal.statistic.persistence.UsageStatisticsPersistenceComponent; @@ -9,9 +13,13 @@ import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.RoamingType; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; +import com.intellij.openapi.extensions.PluginId; +import gnu.trove.THashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Set; + /** * @author Konstantin Bulenkov */ @@ -23,19 +31,32 @@ import org.jetbrains.annotations.Nullable; } ) public class ActionsCollectorImpl extends ActionsCollector implements PersistentStateComponent<ActionsCollector.State> { - public void record(String actionId) { + private static final String DEFAULT_ID = "third.party.plugin.action"; + private final Set<String> myJBActions = new THashSet<>(); + + public void record(@Nullable String actionId, @NotNull Class context) { if (actionId == null) return; State state = getState(); if (state == null) return; String key = ConvertUsagesUtil.escapeDescriptorName(actionId); + if (!myJBActions.contains(key)) { + key = isDevelopedByJetBrains(context) ? key : DEFAULT_ID; + myJBActions.add(key); + } FeatureUsageLogger.INSTANCE.log("actions", key); final Integer count = state.myValues.get(key); int value = count == null ? 1 : count + 1; state.myValues.put(key, value); } + private static boolean isDevelopedByJetBrains(@NotNull Class aClass) { + final PluginId pluginId = PluginManagerCore.getPluginByClassName(aClass.getName()); + final IdeaPluginDescriptor plugin = PluginManager.getPlugin(pluginId); + return plugin == null || plugin.isBundled() || PluginManagerMain.isDevelopedByJetBrains(plugin); + } + private State myState = new State(); @Nullable diff --git a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java index 95f772fde587d3088d5f45b9324afc46f90d91be..456320ee40caf1dd9006a43e570a522e2243b859 100644 --- a/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/actionSystem/impl/ActionManagerImpl.java @@ -1202,7 +1202,7 @@ public final class ActionManagerImpl extends ActionManagerEx implements Disposab } //noinspection AssignmentToStaticFieldFromInstanceMethod IdeaLogger.ourLastActionId = myLastPreformedActionId; - ActionsCollectorImpl.getInstance().record(myLastPreformedActionId); + ActionsCollectorImpl.getInstance().record(myLastPreformedActionId, action.getClass()); } for (AnActionListener listener : myActionListeners) { listener.beforeActionPerformed(action, dataContext, event); diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/InfoAndProgressPanel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/InfoAndProgressPanel.java index ee9ec264c3da05f83e59cfe82af8afe5f54867e9..19622fdda20d531035f8223076ecc3ffebc584c0 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/InfoAndProgressPanel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/status/InfoAndProgressPanel.java @@ -703,7 +703,10 @@ public class InfoAndProgressPanel extends JPanel implements CustomStatusBarWidge } else { suspender.suspendProcess(null); } - ActionsCollector.getInstance().record(suspender.isSuspended() ? "Progress Paused" : "Progress Resumed"); + ActionsCollector.getInstance().record( + suspender.isSuspended() ? "Progress Paused" : "Progress Resumed", + MyInlineProgressIndicator.class + ); }).setFillBg(false); suspendButton.setVisible(false); diff --git a/plugins/settings-repository/src/upstreamEditor.kt b/plugins/settings-repository/src/upstreamEditor.kt index 034a7b9d073d312b23deffff6adbd6afff889298..3001bb9d4ae1eb8a325a06286ddf5b6d3db6d346 100644 --- a/plugins/settings-repository/src/upstreamEditor.kt +++ b/plugins/settings-repository/src/upstreamEditor.kt @@ -45,7 +45,7 @@ fun createMergeActions(project: Project?, urlTextField: TextFieldWithBrowseButto } override fun actionPerformed(event: ActionEvent) { - ActionsCollector.getInstance().record("Ics.${getValue(Action.NAME)}") + ActionsCollector.getInstance().record("Ics.${getValue(Action.NAME)}", icsManager::class.java) val repositoryWillBeCreated = !icsManager.repositoryManager.isRepositoryExists() var upstreamSet = false try {