@@ -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
2020abstract class AnalyticsReporter {
21-
22- fun report (data : AnalyticsData ) = data.reportTo(this )
23-
2421 internal abstract fun process (data : AnalyticsData )
2522}
2623
2724internal object PrintingReporter : AnalyticsReporter() {
2825 override fun process (data : AnalyticsData ) = println (data.data)
29-
3026}
3127
3228internal 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) {
7573class 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