Skip to content

Commit 6f73f07

Browse files
authored
[analytics] migrate to core Dart Plugin reporting (#8730)
Dart 502 introduces the core analytics implementation and this migrates our stub implementations to use it. We remove the now defunct `UnifiedAnalytics` implementation to keep things tidy. Note that this does introduce more version coupling. Once published we'll have more places that will break in the presence of a pre-502 Dart plugin. (Since this was already happening with the `PubRoot` cleanup, e.g., #8725, I didn't consider doing version testing and any defensive programming; if folks feel strongly we can revisit though!) Follow-up from #8598 --- - [x] I’ve reviewed the contributor guide and applied the relevant portions to this PR. <details> <summary>Contribution guidelines:</summary><br> - See our [contributor guide]([https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md) for general expectations for PRs. - Larger or significant changes should be discussed in an issue before creating a PR. - Dart contributions to our repos should follow the [Dart style guide](https://dart.dev/guides/language/effective-dart) and use `dart format`. - Java and Kotlin contributions should strive to follow Java and Kotlin best practices ([discussion](#8098)). </details>
1 parent cda923e commit 6f73f07

10 files changed

Lines changed: 18 additions & 417 deletions

src/io/flutter/actions/DeviceSelectorAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,10 @@
3838
import com.intellij.util.ModalityUiUtil;
3939
import com.intellij.util.ui.JBUI;
4040
import com.intellij.util.ui.UIUtil;
41+
import com.jetbrains.lang.dart.analytics.Analytics;
42+
import com.jetbrains.lang.dart.analytics.AnalyticsData;
4143
import icons.FlutterIcons;
4244
import io.flutter.FlutterBundle;
43-
import io.flutter.analytics.Analytics;
44-
import io.flutter.analytics.AnalyticsData;
4545
import io.flutter.logging.PluginLogger;
4646
import io.flutter.run.FlutterDevice;
4747
import io.flutter.run.daemon.DeviceService;

src/io/flutter/actions/DeviceSelectorRefresherAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
import com.intellij.openapi.actionSystem.AnAction;
1010
import com.intellij.openapi.actionSystem.AnActionEvent;
1111
import com.intellij.openapi.project.Project;
12-
import io.flutter.analytics.Analytics;
13-
import io.flutter.analytics.AnalyticsData;
12+
import com.jetbrains.lang.dart.analytics.Analytics;
13+
import com.jetbrains.lang.dart.analytics.AnalyticsData;
1414
import io.flutter.run.daemon.DeviceService;
1515
import io.flutter.utils.FlutterModuleUtils;
1616
import org.jetbrains.annotations.NotNull;

src/io/flutter/actions/FlutterGettingStartedAction.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
import com.intellij.ide.browsers.BrowserLauncher;
99
import com.intellij.openapi.actionSystem.AnActionEvent;
1010
import com.intellij.openapi.project.DumbAwareAction;
11+
import com.jetbrains.lang.dart.analytics.Analytics;
12+
import com.jetbrains.lang.dart.analytics.AnalyticsData;
1113
import io.flutter.FlutterConstants;
12-
import io.flutter.analytics.Analytics;
13-
import io.flutter.analytics.AnalyticsData;
1414
import org.jetbrains.annotations.NotNull;
1515

1616
public class FlutterGettingStartedAction extends DumbAwareAction {
1717
@Override
1818
public void actionPerformed(@NotNull final AnActionEvent e) {
1919
Analytics.report(AnalyticsData.forAction(this, e));
20-
20+
2121
BrowserLauncher.getInstance().browse(FlutterConstants.URL_GETTING_STARTED_IDE, null);
2222
}
2323
}

src/io/flutter/actions/FlutterSdkAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@
1010
import com.intellij.openapi.fileEditor.FileDocumentManager;
1111
import com.intellij.openapi.project.DumbAwareAction;
1212
import com.intellij.openapi.project.Project;
13+
import com.jetbrains.lang.dart.analytics.Analytics;
14+
import com.jetbrains.lang.dart.analytics.AnalyticsData;
1315
import io.flutter.FlutterBundle;
1416
import io.flutter.FlutterMessages;
1517
import io.flutter.FlutterUtils;
16-
import io.flutter.analytics.Analytics;
1718
import io.flutter.analytics.AnalyticsConstants;
18-
import io.flutter.analytics.AnalyticsData;
1919
import io.flutter.bazel.Workspace;
2020
import io.flutter.pub.PubRoot;
2121
import io.flutter.pub.PubRoots;

src/io/flutter/actions/FlutterSubmitFeedback.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
import com.intellij.ide.browsers.BrowserLauncher;
99
import com.intellij.openapi.actionSystem.AnActionEvent;
1010
import com.intellij.openapi.project.DumbAwareAction;
11-
import io.flutter.analytics.Analytics;
12-
import io.flutter.analytics.AnalyticsData;
11+
import com.jetbrains.lang.dart.analytics.Analytics;
12+
import com.jetbrains.lang.dart.analytics.AnalyticsData;
1313
import org.jetbrains.annotations.NotNull;
1414

1515
public class FlutterSubmitFeedback extends DumbAwareAction {

src/io/flutter/actions/RefreshToolWindowAction.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
import com.intellij.openapi.actionSystem.AnActionEvent;
1010
import com.intellij.openapi.project.DumbAwareAction;
1111
import com.intellij.openapi.project.Project;
12+
import com.jetbrains.lang.dart.analytics.Analytics;
13+
import com.jetbrains.lang.dart.analytics.AnalyticsData;
1214
import io.flutter.FlutterBundle;
1315
import io.flutter.FlutterUtils;
14-
import io.flutter.analytics.Analytics;
15-
import io.flutter.analytics.AnalyticsData;
1616
import org.jetbrains.annotations.NotNull;
1717

1818
import java.util.Optional;

src/io/flutter/actions/ReloadFlutterApp.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@
99
import com.intellij.openapi.actionSystem.AnActionEvent;
1010
import com.intellij.openapi.project.Project;
1111
import com.intellij.openapi.util.Computable;
12+
import com.jetbrains.lang.dart.analytics.Analytics;
13+
import com.jetbrains.lang.dart.analytics.AnalyticsData;
1214
import icons.FlutterIcons;
1315
import io.flutter.FlutterBundle;
1416
import io.flutter.FlutterConstants;
15-
import io.flutter.analytics.Analytics;
1617
import io.flutter.analytics.AnalyticsConstants;
17-
import io.flutter.analytics.AnalyticsData;
1818
import io.flutter.run.FlutterReloadManager;
1919
import io.flutter.run.daemon.FlutterApp;
2020
import org.jetbrains.annotations.NotNull;

src/io/flutter/actions/RestartFlutterApp.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
import com.intellij.openapi.actionSystem.AnActionEvent;
1313
import com.intellij.openapi.project.Project;
1414
import com.intellij.openapi.util.Computable;
15+
import com.jetbrains.lang.dart.analytics.Analytics;
16+
import com.jetbrains.lang.dart.analytics.AnalyticsData;
1517
import icons.FlutterIcons;
1618
import io.flutter.FlutterBundle;
1719
import io.flutter.FlutterConstants;
1820
import io.flutter.FlutterMessages;
19-
import io.flutter.analytics.Analytics;
2021
import io.flutter.analytics.AnalyticsConstants;
21-
import io.flutter.analytics.AnalyticsData;
2222
import io.flutter.bazel.WorkspaceCache;
2323
import io.flutter.run.FlutterReloadManager;
2424
import io.flutter.run.daemon.FlutterApp;

src/io/flutter/analytics/Analytics.kt

Lines changed: 1 addition & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -6,83 +6,7 @@
66

77
package io.flutter.analytics
88

9-
import com.intellij.openapi.actionSystem.AnAction
10-
import com.intellij.openapi.actionSystem.AnActionEvent
11-
import io.flutter.actions.FlutterAppAction
12-
13-
object Analytics {
14-
private val reporter = NoOpReporter
15-
16-
@JvmStatic
17-
fun report(data: AnalyticsData) = data.reportTo(reporter)
18-
}
19-
20-
abstract class AnalyticsReporter {
21-
internal abstract fun process(data: AnalyticsData)
22-
}
23-
24-
internal object PrintingReporter : AnalyticsReporter() {
25-
override fun process(data: AnalyticsData) = println(data.data)
26-
}
27-
28-
internal object NoOpReporter : AnalyticsReporter() {
29-
override fun process(data: AnalyticsData) = Unit
30-
}
31-
32-
abstract class AnalyticsData(type: String) {
33-
val data = mutableMapOf<String, Any>()
34-
35-
init {
36-
add(AnalyticsConstants.TYPE, type)
37-
}
38-
39-
companion object {
40-
@JvmStatic
41-
fun forAction(action: AnAction, event: AnActionEvent): ActionData = ActionData(
42-
event.actionManager.getId(action)
43-
// `FlutterAppAction`s aren't registered so ask them directly.
44-
?: (action as? FlutterAppAction)?.id,
45-
event.place
46-
)
47-
}
48-
49-
fun <T> add(key: DataValue<T>, value: T) = key.addTo(this, value)
50-
51-
internal operator fun set(key: String, value: Boolean) {
52-
data[key] = value
53-
}
54-
55-
internal operator fun set(key: String, value: Int) {
56-
data[key] = value
57-
}
58-
59-
internal operator fun set(key: String, value: String) {
60-
data[key] = value
61-
}
62-
63-
open fun reportTo(reporter: AnalyticsReporter) = reporter.process(this)
64-
}
65-
66-
/**
67-
* Data describing an IntelliJ [com.intellij.openapi.actionSystem.AnAction] for analytics reporting.
68-
*
69-
* @param id The unique identifier of the action, typically defined in `plugin.xml`.
70-
* @param place The UI location where the action was invoked (e.g., "MainMenu", "Toolbar").
71-
* @see <a href="https://plugins.jetbrains.com/docs/intellij/basic-action-system.html">IntelliJ Action System</a>
72-
*/
73-
class ActionData(private val id: String?, private val place: String) : AnalyticsData("action") {
74-
75-
init {
76-
id?.let { add(AnalyticsConstants.ID, it) }
77-
add(AnalyticsConstants.PLACE, place)
78-
}
79-
80-
override fun reportTo(reporter: AnalyticsReporter) {
81-
// We only report if we have an id for the event.
82-
if (id == null) return
83-
super.reportTo(reporter)
84-
}
85-
}
9+
import com.jetbrains.lang.dart.analytics.BooleanValue
8610

8711
/**
8812
* Defines standard keys for analytics data properties.
@@ -97,12 +21,6 @@ object AnalyticsConstants {
9721
@JvmField
9822
val GOOGLE3 = BooleanValue("google3")
9923

100-
/**
101-
* The unique identifier for an action or event.
102-
*/
103-
@JvmField
104-
val ID = StringValue("id")
105-
10624
/**
10725
* Indicates if the project is in a Bazel context.
10826
*/
@@ -115,46 +33,9 @@ object AnalyticsConstants {
11533
@JvmField
11634
val MISSING_SDK = BooleanValue("missingSdk")
11735

118-
/**
119-
* The UI location where an action was invoked, as provided by
120-
* [com.intellij.openapi.actionSystem.PlaceProvider.getPlace] (for example, "MainMenu",
121-
* "MainToolbar", "EditorPopup", "GoToAction", etc).
122-
*/
123-
@JvmField
124-
val PLACE = StringValue("place")
125-
12636
/**
12737
* Indicates if a restart is required for a hot reload request.
12838
*/
12939
@JvmField
13040
val REQUIRES_RESTART = BooleanValue("requiresRestart")
131-
132-
/**
133-
* The type of the analytics event (e.g., "action", ...).
134-
*/
135-
@JvmField
136-
val TYPE = StringValue("type")
137-
}
138-
139-
140-
sealed class DataValue<T>(val name: String) {
141-
abstract fun addTo(data: AnalyticsData, value: T);
142-
}
143-
144-
class StringValue(name: String) : DataValue<String>(name) {
145-
override fun addTo(data: AnalyticsData, value: String) {
146-
data[name] = value
147-
}
148-
}
149-
150-
class IntValue(name: String) : DataValue<Int>(name) {
151-
override fun addTo(data: AnalyticsData, value: Int) {
152-
data[name] = value
153-
}
154-
}
155-
156-
class BooleanValue(name: String) : DataValue<Boolean>(name) {
157-
override fun addTo(data: AnalyticsData, value: Boolean) {
158-
data[name] = value
159-
}
16041
}

0 commit comments

Comments
 (0)