Skip to content

Commit

Permalink
add statistics about calling actions from context menu
Browse files Browse the repository at this point in the history
  • Loading branch information
bulenkov committed Sep 13, 2018
1 parent b9f075c commit 6439711
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ 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 void record(@Nullable String actionId, @NotNull Class context) {
record(actionId, context, false);
}

public abstract void record(@Nullable String actionId, @NotNull Class context, boolean isContextMenu);

public abstract State getState();

Expand All @@ -36,5 +40,9 @@ public final static class State {
@Tag("counts")
@MapAnnotation(surroundWithTag = false, keyAttributeName = "action", valueAttributeName = "count")
public Map<String, Integer> myValues = new HashMap<>();

@Tag("contextMenuCounts")
@MapAnnotation(surroundWithTag = false, keyAttributeName = "action", valueAttributeName = "count")
public Map<String, Integer> myContextMenuValues = new HashMap<>();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// 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.internal.statistic.collectors.fus.actions;

import com.intellij.ide.actions.ActionsCollector;
import com.intellij.internal.statistic.beans.UsageDescriptor;
import com.intellij.internal.statistic.service.fus.collectors.ApplicationUsagesCollector;
import com.intellij.internal.statistic.service.fus.collectors.FUSUsageContext;
import com.intellij.internal.statistic.service.fus.collectors.FUStatisticsDifferenceSender;
import com.intellij.internal.statistic.service.fus.collectors.UsageDescriptorKeyValidator;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;

import java.util.Set;

/**
* @author Konstantin Bulenkov
*/
public class ActionFromContextMenuUsagesCollector extends ApplicationUsagesCollector implements FUStatisticsDifferenceSender {

@Override
@NotNull
public Set<UsageDescriptor> getUsages() {
ActionsCollector.State state = ActionsCollector.getInstance().getState();
assert state != null;
return ContainerUtil
.map2Set(state.myContextMenuValues.entrySet(), e -> new UsageDescriptor(UsageDescriptorKeyValidator.ensureProperKey(e.getKey()), e.getValue()));
}

@Override
@NotNull
public String getGroupId() {
return "statistics.actions.context.menu.performed";
}

@Override
public FUSUsageContext getContext() {
return FUSUsageContext.OS_CONTEXT;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,36 +12,35 @@
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
*/
@State(name = "ActionsCollector", storages = @Storage(value = UsageStatisticsPersistenceComponent.USAGE_STATISTICS_XML, roamingType = RoamingType.DISABLED))
public class ActionsCollectorImpl extends ActionsCollector implements PersistentStateComponent<ActionsCollector.State> {
private static final String DEFAULT_ID = "third.party.plugin.action";
private final Set<String> myJBActions = new THashSet<>();

@Override
public void record(@Nullable String actionId, @NotNull Class context) {
public void record(@Nullable String actionId, @NotNull Class context, boolean isContextMenu) {
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);
}
key = isDevelopedByJetBrains(context) ? key : DEFAULT_ID;

FeatureUsageLogger.INSTANCE.log("actions", key);
final Integer count = state.myValues.get(key);
Integer count = state.myValues.get(key);
int value = count == null ? 1 : count + 1;
state.myValues.put(key, value);
if (isContextMenu) {
count = state.myContextMenuValues.get(key);
value = count == null ? 1 : count + 1;
state.myContextMenuValues.put(key, value);
}
}

private static boolean isDevelopedByJetBrains(@NotNull Class aClass) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@
import com.intellij.diagnostic.PluginException;
import com.intellij.ide.ActivityTracker;
import com.intellij.ide.DataManager;
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.idea.IdeaLogger;
import com.intellij.internal.statistic.collectors.fus.actions.persistence.ActionIdProvider;
import com.intellij.internal.statistic.collectors.fus.actions.persistence.ActionsCollectorImpl;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.actionSystem.*;
import com.intellij.openapi.actionSystem.ex.ActionManagerEx;
Expand Down Expand Up @@ -1199,7 +1199,7 @@ public void fireBeforeActionPerformed(@NotNull AnAction action, @NotNull DataCon
}
//noinspection AssignmentToStaticFieldFromInstanceMethod
IdeaLogger.ourLastActionId = myLastPreformedActionId;
ActionsCollectorImpl.getInstance().record(myLastPreformedActionId, action.getClass());
ActionsCollector.getInstance().record(myLastPreformedActionId, action.getClass(), event.isFromContextMenu());
for (AnActionListener listener : myActionListeners) {
listener.beforeActionPerformed(action, dataContext, event);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@
<statistics.applicationUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.ui.ToolbarClicksUsagesCollector"/>
<statistics.applicationUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.ui.EditorColorSchemesUsagesCollector"/>
<statistics.applicationUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.actions.ActionUsagesCollector"/>
<statistics.applicationUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.actions.ActionFromContextMenuUsagesCollector"/>
<statistics.applicationUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.actions.ToolWindowUsagesCollector"/>
<statistics.applicationUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.actions.IntentionUsagesCollector"/>
<statistics.applicationUsagesCollector implementation="com.intellij.internal.statistic.collectors.fus.actions.MainMenuUsagesCollector"/>
Expand Down

0 comments on commit 6439711

Please sign in to comment.