Skip to content

Commit 883eb82

Browse files
authored
[analytics] introduces constants (#8601)
Follow-up from #8597. Introduces constants. --- - [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/dart-lang/sdk/blob/main/CONTRIBUTING.md](https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview) 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 24a6624 commit 883eb82

File tree

4 files changed

+92
-16
lines changed

4 files changed

+92
-16
lines changed

src/io/flutter/actions/FlutterSdkAction.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.flutter.FlutterMessages;
1515
import io.flutter.FlutterUtils;
1616
import io.flutter.analytics.Analytics;
17+
import io.flutter.analytics.AnalyticsConstants;
1718
import io.flutter.analytics.AnalyticsData;
1819
import io.flutter.bazel.Workspace;
1920
import io.flutter.pub.PubRoot;
@@ -42,7 +43,7 @@ public void actionPerformed(@NotNull AnActionEvent event) {
4243
if (workspace != null) {
4344
FileDocumentManager.getInstance().saveAllDocuments();
4445
startCommandInBazelContext(project, workspace, event);
45-
analyticsData.add("inBazelContext", true);
46+
analyticsData.add(AnalyticsConstants.IN_BAZEL_CONTEXT, true);
4647
Analytics.report(analyticsData);
4748
return;
4849
}
@@ -51,7 +52,7 @@ public void actionPerformed(@NotNull AnActionEvent event) {
5152
final FlutterSdk sdk = project != null ? FlutterSdk.getFlutterSdk(project) : null;
5253
if (sdk == null) {
5354
showMissingSdkDialog(project);
54-
analyticsData.add("missingSdk", true);
55+
analyticsData.add(AnalyticsConstants.MISSING_SDK, true);
5556
Analytics.report(analyticsData);
5657
return;
5758
}

src/io/flutter/actions/ReloadFlutterApp.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import io.flutter.FlutterBundle;
1414
import io.flutter.FlutterConstants;
1515
import io.flutter.analytics.Analytics;
16+
import io.flutter.analytics.AnalyticsConstants;
1617
import io.flutter.analytics.AnalyticsData;
1718
import io.flutter.run.FlutterReloadManager;
1819
import io.flutter.run.daemon.FlutterApp;
@@ -49,7 +50,7 @@ public void actionPerformed(@NotNull AnActionEvent e) {
4950
// If the shift key is held down, perform a restart. We check to see if we're being invoked from the
5051
// 'GoToAction' dialog. If so, the modifiers are for the command that opened the go-to action dialog.
5152
final boolean shouldRestart = (e.getModifiers() & InputEvent.SHIFT_MASK) != 0 && !"GoToAction".equals(e.getPlace());
52-
analyticsData.add("requiresRestart", shouldRestart);
53+
analyticsData.add(AnalyticsConstants.REQUIRES_RESTART, shouldRestart);
5354

5455
var reloadManager = FlutterReloadManager.getInstance(project);
5556
if (reloadManager == null) return;
@@ -61,7 +62,7 @@ public void actionPerformed(@NotNull AnActionEvent e) {
6162
// Else perform a hot reload.
6263
reloadManager.saveAllAndReload(getApp(), FlutterConstants.RELOAD_REASON_MANUAL);
6364
}
64-
65+
6566
Analytics.report(analyticsData);
6667
}
6768

src/io/flutter/actions/RestartFlutterApp.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.flutter.FlutterConstants;
1818
import io.flutter.FlutterMessages;
1919
import io.flutter.analytics.Analytics;
20+
import io.flutter.analytics.AnalyticsConstants;
2021
import io.flutter.analytics.AnalyticsData;
2122
import io.flutter.bazel.WorkspaceCache;
2223
import io.flutter.run.FlutterReloadManager;
@@ -65,7 +66,7 @@ public void actionPerformed(@NotNull AnActionEvent e) {
6566
NotificationType.INFORMATION);
6667
Notifications.Bus.notify(notification, project);
6768

68-
analyticsData.add("google3", true);
69+
analyticsData.add(AnalyticsConstants.GOOGLE3, true);
6970

7071
// We only want to show this notification once.
7172
FlutterSettings.getInstance().setShowBazelHotRestartWarning(false);

src/io/flutter/analytics/Analytics.kt

Lines changed: 84 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,15 @@ object Analytics {
1414
private val reporter = NoOpReporter
1515

1616
@JvmStatic
17-
fun report(data: AnalyticsData) = reporter.report(data)
17+
fun report(data: AnalyticsData) = data.reportTo(reporter)
1818
}
1919

2020
abstract class AnalyticsReporter {
21-
22-
fun report(data: AnalyticsData) = data.reportTo(this)
23-
2421
internal abstract fun process(data: AnalyticsData)
2522
}
2623

2724
internal object PrintingReporter : AnalyticsReporter() {
2825
override fun process(data: AnalyticsData) = println(data.data)
29-
3026
}
3127

3228
internal object NoOpReporter : AnalyticsReporter() {
@@ -37,7 +33,7 @@ abstract class AnalyticsData(type: String) {
3733
val data = mutableMapOf<String, Any>()
3834

3935
init {
40-
add("type", type)
36+
add(AnalyticsConstants.TYPE, type)
4137
}
4238

4339
companion object {
@@ -50,15 +46,17 @@ abstract class AnalyticsData(type: String) {
5046
)
5147
}
5248

53-
fun add(key: String, value: Boolean) {
49+
fun <T> add(key: DataValue<T>, value: T) = key.addTo(this, value)
50+
51+
internal operator fun set(key: String, value: Boolean) {
5452
data[key] = value
5553
}
5654

57-
fun add(key: String, value: Int) {
55+
internal operator fun set(key: String, value: Int) {
5856
data[key] = value
5957
}
6058

61-
fun add(key: String, value: String) {
59+
internal operator fun set(key: String, value: String) {
6260
data[key] = value
6361
}
6462

@@ -75,8 +73,8 @@ abstract class AnalyticsData(type: String) {
7573
class ActionData(private val id: String?, private val place: String) : AnalyticsData("action") {
7674

7775
init {
78-
id?.let { add("id", it) }
79-
add("place", place)
76+
id?.let { add(AnalyticsConstants.ID, it) }
77+
add(AnalyticsConstants.PLACE, place)
8078
}
8179

8280
override fun reportTo(reporter: AnalyticsReporter) {
@@ -85,3 +83,78 @@ class ActionData(private val id: String?, private val place: String) : Analytics
8583
super.reportTo(reporter)
8684
}
8785
}
86+
87+
/**
88+
* Defines standard keys for analytics data properties.
89+
*
90+
* The properties are exposed as `@JvmField`s to be easily accessible as static
91+
* fields from Java.
92+
*/
93+
object AnalyticsConstants {
94+
/**
95+
* Indicates if the project is a Google3 project.
96+
*/
97+
@JvmField
98+
val GOOGLE3 = BooleanValue("google3")
99+
100+
/**
101+
* The unique identifier for an action or event.
102+
*/
103+
@JvmField
104+
val ID = StringValue("id")
105+
106+
/**
107+
* Indicates if the project is in a Bazel context.
108+
*/
109+
@JvmField
110+
val IN_BAZEL_CONTEXT = BooleanValue("inBazelContext")
111+
112+
/**
113+
* Indicates if the Flutter SDK is missing.
114+
*/
115+
@JvmField
116+
val MISSING_SDK = BooleanValue("missingSdk")
117+
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+
126+
/**
127+
* Indicates if a restart is required for a hot reload request.
128+
*/
129+
@JvmField
130+
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+
}
160+
}

0 commit comments

Comments
 (0)