Skip to content

Commit 0466055

Browse files
authored
CallerSdkType added (#6298)
1 parent 9f3210a commit 0466055

27 files changed

+302
-260
lines changed

firebase-dataconnect/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
# Unreleased
2-
* [feature] Add ability to specify SerializersModule when serializing.
32
* [feature] initial beta release.
3+
* [feature] Add ability to specify SerializersModule when serializing.
4+
* [feature] CallerSdkType added, to enable tracking generated SDK usage.

firebase-dataconnect/api.txt

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,30 +66,37 @@ package com.google.firebase.dataconnect {
6666
field @NonNull public static final com.google.firebase.dataconnect.FirebaseDataConnect.Companion Companion;
6767
}
6868

69+
public enum FirebaseDataConnect.CallerSdkType {
70+
method @NonNull public static com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType valueOf(@NonNull String name) throws java.lang.IllegalArgumentException;
71+
method @NonNull public static com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType[] values();
72+
enum_constant public static final com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType Base;
73+
enum_constant public static final com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType Generated;
74+
}
75+
6976
public static final class FirebaseDataConnect.Companion {
7077
}
7178

7279
public static interface FirebaseDataConnect.MutationRefOptionsBuilder<Data, Variables> {
80+
method @Nullable public com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType getCallerSdkType();
7381
method @Nullable public kotlinx.serialization.modules.SerializersModule getDataSerializersModule();
74-
method @Nullable public com.google.firebase.dataconnect.generated.GeneratedMutation<?,Data,Variables> getGeneratedMutation();
7582
method @Nullable public kotlinx.serialization.modules.SerializersModule getVariablesSerializersModule();
83+
method public void setCallerSdkType(@Nullable com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType);
7684
method public void setDataSerializersModule(@Nullable kotlinx.serialization.modules.SerializersModule);
77-
method public void setGeneratedMutation(@Nullable com.google.firebase.dataconnect.generated.GeneratedMutation<?,Data,Variables>);
7885
method public void setVariablesSerializersModule(@Nullable kotlinx.serialization.modules.SerializersModule);
86+
property @Nullable public abstract com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType callerSdkType;
7987
property @Nullable public abstract kotlinx.serialization.modules.SerializersModule dataSerializersModule;
80-
property @Nullable public abstract com.google.firebase.dataconnect.generated.GeneratedMutation<?,Data,Variables> generatedMutation;
8188
property @Nullable public abstract kotlinx.serialization.modules.SerializersModule variablesSerializersModule;
8289
}
8390

8491
public static interface FirebaseDataConnect.QueryRefOptionsBuilder<Data, Variables> {
92+
method @Nullable public com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType getCallerSdkType();
8593
method @Nullable public kotlinx.serialization.modules.SerializersModule getDataSerializersModule();
86-
method @Nullable public com.google.firebase.dataconnect.generated.GeneratedQuery<?,Data,Variables> getGeneratedQuery();
8794
method @Nullable public kotlinx.serialization.modules.SerializersModule getVariablesSerializersModule();
95+
method public void setCallerSdkType(@Nullable com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType);
8896
method public void setDataSerializersModule(@Nullable kotlinx.serialization.modules.SerializersModule);
89-
method public void setGeneratedQuery(@Nullable com.google.firebase.dataconnect.generated.GeneratedQuery<?,Data,Variables>);
9097
method public void setVariablesSerializersModule(@Nullable kotlinx.serialization.modules.SerializersModule);
98+
property @Nullable public abstract com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType callerSdkType;
9199
property @Nullable public abstract kotlinx.serialization.modules.SerializersModule dataSerializersModule;
92-
property @Nullable public abstract com.google.firebase.dataconnect.generated.GeneratedQuery<?,Data,Variables> generatedQuery;
93100
property @Nullable public abstract kotlinx.serialization.modules.SerializersModule variablesSerializersModule;
94101
}
95102

@@ -120,6 +127,7 @@ package com.google.firebase.dataconnect {
120127
public interface OperationRef<Data, Variables> {
121128
method public boolean equals(@Nullable Object other);
122129
method @Nullable public suspend Object execute(@NonNull kotlin.coroutines.Continuation<? super com.google.firebase.dataconnect.OperationResult<Data,Variables>>);
130+
method @NonNull public com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType getCallerSdkType();
123131
method @NonNull public com.google.firebase.dataconnect.FirebaseDataConnect getDataConnect();
124132
method @NonNull public kotlinx.serialization.DeserializationStrategy<Data> getDataDeserializer();
125133
method @Nullable public kotlinx.serialization.modules.SerializersModule getDataSerializersModule();
@@ -129,6 +137,7 @@ package com.google.firebase.dataconnect {
129137
method @Nullable public kotlinx.serialization.modules.SerializersModule getVariablesSerializersModule();
130138
method public int hashCode();
131139
method @NonNull public String toString();
140+
property @NonNull public abstract com.google.firebase.dataconnect.FirebaseDataConnect.CallerSdkType callerSdkType;
132141
property @NonNull public abstract com.google.firebase.dataconnect.FirebaseDataConnect dataConnect;
133142
property @NonNull public abstract kotlinx.serialization.DeserializationStrategy<Data> dataDeserializer;
134143
property @Nullable public abstract kotlinx.serialization.modules.SerializersModule dataSerializersModule;

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/FirebaseDataConnect.kt

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ import com.google.firebase.Firebase
2121
import com.google.firebase.FirebaseApp
2222
import com.google.firebase.app
2323
import com.google.firebase.dataconnect.core.FirebaseDataConnectFactory
24-
import com.google.firebase.dataconnect.generated.GeneratedMutation
25-
import com.google.firebase.dataconnect.generated.GeneratedQuery
2624
import kotlinx.coroutines.CoroutineScope
2725
import kotlinx.serialization.DeserializationStrategy
2826
import kotlinx.serialization.SerializationStrategy
@@ -201,12 +199,11 @@ public interface FirebaseDataConnect : AutoCloseable {
201199
public interface QueryRefOptionsBuilder<Data, Variables> {
202200

203201
/**
204-
* The [GeneratedQuery] object that is creating the query; may be `null` if not being created
205-
* from an SDK that was generated by the Data Connect toolkit. The value of this property does
206-
* not affect the runtime behavior, but is used for runtime checks and gathering metrics on
207-
* generated SDK usage.
202+
* The calling SDK information to apply to all operations executed by the corresponding
203+
* [QueryRef] object. May be `null` (the default) in which case [CallerSdkType.Base] will be
204+
* used.
208205
*/
209-
public var generatedQuery: GeneratedQuery<*, Data, Variables>?
206+
public var callerSdkType: CallerSdkType?
210207

211208
/**
212209
* A [SerializersModule] to use when encoding the query's variables. May be `null` (the default)
@@ -242,12 +239,11 @@ public interface FirebaseDataConnect : AutoCloseable {
242239
public interface MutationRefOptionsBuilder<Data, Variables> {
243240

244241
/**
245-
* The [GeneratedMutation] object that is creating the mutation; may be `null` if not being
246-
* created from an SDK that was generated by the Data Connect toolkit. The value of this
247-
* property does not affect the runtime behavior, but is used for runtime checks and gathering
248-
* metrics on generated SDK usage.
242+
* The calling SDK information to apply to all operations executed by the corresponding
243+
* [MutationRef] object. May be `null` (the default) in which case [CallerSdkType.Base] will be
244+
* used.
249245
*/
250-
public var generatedMutation: GeneratedMutation<*, Data, Variables>?
246+
public var callerSdkType: CallerSdkType?
251247

252248
/**
253249
* A [SerializersModule] to use when encoding the mutation's variables. May be `null` (the
@@ -270,7 +266,7 @@ public interface FirebaseDataConnect : AutoCloseable {
270266
* @param variablesSerializer The value for [MutationRef.variablesSerializer] of the returned
271267
* object.
272268
* @param optionsBuilder A method that will be called to provide optional information when
273-
* creating the [MutationRef]; may be `null` (the default) to not perform any customization.
269+
* creating the [QueryRef]; may be `null` (the default) to not perform any customization.
274270
*/
275271
public fun <Data, Variables> mutation(
276272
operationName: String,
@@ -356,6 +352,26 @@ public interface FirebaseDataConnect : AutoCloseable {
356352
*/
357353
override fun toString(): String
358354

355+
/**
356+
* Indicates where the usages of this object are coming from.
357+
*
358+
* This information is merely used for analytics and has no effects on the product's
359+
* functionality.
360+
*/
361+
public enum class CallerSdkType {
362+
/**
363+
* The [FirebaseDataConnect] class is used directly in an application, rather than using the
364+
* code generation done by the Firebase Data Connect toolkit.
365+
*/
366+
Base,
367+
368+
/**
369+
* The [FirebaseDataConnect] class is used by code generated by the Firebase Data Connect
370+
* toolkit.
371+
*/
372+
Generated,
373+
}
374+
359375
/**
360376
* The companion object for [FirebaseDataConnect], which provides extension methods and properties
361377
* that may be accessed qualified by the class, rather than an instance of the class.

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/OperationRef.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,12 @@ public interface OperationRef<Data, Variables> {
144144
*/
145145
public val variablesSerializer: SerializationStrategy<Variables>
146146

147+
/**
148+
* The [FirebaseDataConnect.CallerSdkType] that will be associated with all operations performed
149+
* by this object for analytics purposes.
150+
*/
151+
public val callerSdkType: FirebaseDataConnect.CallerSdkType
152+
147153
/**
148154
* A [SerializersModule] to use when encoding the variables using [variablesSerializer]. May be
149155
* `null`, to not use a [SerializersModule].

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcClient.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ internal class DataConnectGrpcClient(
5757
requestId: String,
5858
operationName: String,
5959
variables: Struct,
60-
isFromGeneratedSdk: Boolean,
60+
callerSdkType: FirebaseDataConnect.CallerSdkType,
6161
): OperationResult {
6262
val request = executeQueryRequest {
6363
this.name = requestName
@@ -67,7 +67,7 @@ internal class DataConnectGrpcClient(
6767

6868
val response =
6969
grpcRPCs.retryOnGrpcUnauthenticatedError(requestId, "executeQuery") {
70-
executeQuery(requestId, request, isFromGeneratedSdk)
70+
executeQuery(requestId, request, callerSdkType)
7171
}
7272

7373
return OperationResult(
@@ -80,7 +80,7 @@ internal class DataConnectGrpcClient(
8080
requestId: String,
8181
operationName: String,
8282
variables: Struct,
83-
isFromGeneratedSdk: Boolean,
83+
callerSdkType: FirebaseDataConnect.CallerSdkType,
8484
): OperationResult {
8585
val request = executeMutationRequest {
8686
this.name = requestName
@@ -90,7 +90,7 @@ internal class DataConnectGrpcClient(
9090

9191
val response =
9292
grpcRPCs.retryOnGrpcUnauthenticatedError(requestId, "executeMutation") {
93-
executeMutation(requestId, request, isFromGeneratedSdk = isFromGeneratedSdk)
93+
executeMutation(requestId, request, callerSdkType)
9494
}
9595

9696
return OperationResult(

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcMetadata.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.google.firebase.dataconnect.core
1919
import android.os.Build
2020
import com.google.firebase.FirebaseApp
2121
import com.google.firebase.dataconnect.BuildConfig
22+
import com.google.firebase.dataconnect.FirebaseDataConnect
2223
import com.google.firebase.dataconnect.util.buildStructProto
2324
import com.google.protobuf.Struct
2425
import io.grpc.Metadata
@@ -53,25 +54,31 @@ internal class DataConnectGrpcMetadata(
5354
@Suppress("SpellCheckingInspection")
5455
private val googRequestParamsHeaderValue = "location=${connectorLocation}&frontend=data"
5556

56-
private fun googApiClientHeaderValue(isFromGeneratedSdk: Boolean): String {
57+
private fun googApiClientHeaderValue(callerSdkType: FirebaseDataConnect.CallerSdkType): String {
5758
val components = buildList {
5859
add("gl-kotlin/$kotlinVersion")
5960
add("gl-android/$androidVersion")
6061
add("fire/$dataConnectSdkVersion")
6162
add("grpc/$grpcVersion")
62-
if (isFromGeneratedSdk) {
63-
add("kotlin/gen")
63+
64+
when (callerSdkType) {
65+
FirebaseDataConnect.CallerSdkType.Base -> {
66+
/* nothing to add for Base */
67+
}
68+
FirebaseDataConnect.CallerSdkType.Generated -> {
69+
add("kotlin/gen")
70+
}
6471
}
6572
}
6673
return components.joinToString(" ")
6774
}
6875

69-
suspend fun get(requestId: String, isFromGeneratedSdk: Boolean): Metadata {
76+
suspend fun get(requestId: String, callerSdkType: FirebaseDataConnect.CallerSdkType): Metadata {
7077
val authToken = dataConnectAuth.getToken(requestId)
7178
val appCheckToken = dataConnectAppCheck.getToken(requestId)
7279
return Metadata().also {
7380
it.put(googRequestParamsHeader, googRequestParamsHeaderValue)
74-
it.put(googApiClientHeader, googApiClientHeaderValue(isFromGeneratedSdk))
81+
it.put(googApiClientHeader, googApiClientHeaderValue(callerSdkType))
7582
if (appId.isNotBlank()) {
7683
it.put(gmpAppIdHeader, appId)
7784
}

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/DataConnectGrpcRPCs.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.google.firebase.dataconnect.core
1818

1919
import android.content.Context
2020
import com.google.android.gms.security.ProviderInstaller
21+
import com.google.firebase.dataconnect.FirebaseDataConnect
2122
import com.google.firebase.dataconnect.core.DataConnectGrpcMetadata.Companion.toStructProto
2223
import com.google.firebase.dataconnect.util.SuspendingLazy
2324
import com.google.firebase.dataconnect.util.buildStructProto
@@ -133,9 +134,9 @@ internal class DataConnectGrpcRPCs(
133134
suspend fun executeMutation(
134135
requestId: String,
135136
request: ExecuteMutationRequest,
136-
isFromGeneratedSdk: Boolean,
137+
callerSdkType: FirebaseDataConnect.CallerSdkType,
137138
): ExecuteMutationResponse {
138-
val metadata = grpcMetadata.get(requestId, isFromGeneratedSdk)
139+
val metadata = grpcMetadata.get(requestId, callerSdkType)
139140
val kotlinMethodName = "executeMutation(${request.operationName})"
140141

141142
logger.logGrpcSending(
@@ -171,9 +172,9 @@ internal class DataConnectGrpcRPCs(
171172
suspend fun executeQuery(
172173
requestId: String,
173174
request: ExecuteQueryRequest,
174-
isFromGeneratedSdk: Boolean,
175+
callerSdkType: FirebaseDataConnect.CallerSdkType,
175176
): ExecuteQueryResponse {
176-
val metadata = grpcMetadata.get(requestId, isFromGeneratedSdk)
177+
val metadata = grpcMetadata.get(requestId, callerSdkType)
177178
val kotlinMethodName = "executeQuery(${request.operationName})"
178179

179180
logger.logGrpcSending(

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/FirebaseDataConnectImpl.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ import com.google.firebase.dataconnect.DataConnectSettings
2525
import com.google.firebase.dataconnect.FirebaseDataConnect
2626
import com.google.firebase.dataconnect.FirebaseDataConnect.MutationRefOptionsBuilder
2727
import com.google.firebase.dataconnect.FirebaseDataConnect.QueryRefOptionsBuilder
28-
import com.google.firebase.dataconnect.generated.GeneratedMutation
29-
import com.google.firebase.dataconnect.generated.GeneratedQuery
3028
import com.google.firebase.dataconnect.isDefaultHost
3129
import com.google.firebase.dataconnect.querymgr.LiveQueries
3230
import com.google.firebase.dataconnect.querymgr.LiveQuery
@@ -327,7 +325,7 @@ internal class FirebaseDataConnectImpl(
327325
): QueryRefImpl<Data, Variables> {
328326
val options =
329327
object : QueryRefOptionsBuilder<Data, Variables> {
330-
override var generatedQuery: GeneratedQuery<*, Data, Variables>? = null
328+
override var callerSdkType: FirebaseDataConnect.CallerSdkType? = null
331329
override var variablesSerializersModule: SerializersModule? = null
332330
override var dataSerializersModule: SerializersModule? = null
333331
}
@@ -339,7 +337,7 @@ internal class FirebaseDataConnectImpl(
339337
variables = variables,
340338
dataDeserializer = dataDeserializer,
341339
variablesSerializer = variablesSerializer,
342-
isFromGeneratedSdk = options.generatedQuery !== null,
340+
callerSdkType = options.callerSdkType ?: FirebaseDataConnect.CallerSdkType.Base,
343341
variablesSerializersModule = options.variablesSerializersModule,
344342
dataSerializersModule = options.dataSerializersModule,
345343
)
@@ -354,7 +352,7 @@ internal class FirebaseDataConnectImpl(
354352
): MutationRefImpl<Data, Variables> {
355353
val options =
356354
object : MutationRefOptionsBuilder<Data, Variables> {
357-
override var generatedMutation: GeneratedMutation<*, Data, Variables>? = null
355+
override var callerSdkType: FirebaseDataConnect.CallerSdkType? = null
358356
override var variablesSerializersModule: SerializersModule? = null
359357
override var dataSerializersModule: SerializersModule? = null
360358
}
@@ -366,7 +364,7 @@ internal class FirebaseDataConnectImpl(
366364
variables = variables,
367365
dataDeserializer = dataDeserializer,
368366
variablesSerializer = variablesSerializer,
369-
isFromGeneratedSdk = options.generatedMutation !== null,
367+
callerSdkType = options.callerSdkType ?: FirebaseDataConnect.CallerSdkType.Base,
370368
variablesSerializersModule = options.variablesSerializersModule,
371369
dataSerializersModule = options.dataSerializersModule,
372370
)

firebase-dataconnect/src/main/kotlin/com/google/firebase/dataconnect/core/MutationRefImpl.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ internal class MutationRefImpl<Data, Variables>(
3333
variables: Variables,
3434
dataDeserializer: DeserializationStrategy<Data>,
3535
variablesSerializer: SerializationStrategy<Variables>,
36-
val isFromGeneratedSdk: Boolean,
36+
callerSdkType: FirebaseDataConnect.CallerSdkType,
3737
variablesSerializersModule: SerializersModule?,
3838
dataSerializersModule: SerializersModule?,
3939
) :
@@ -44,6 +44,7 @@ internal class MutationRefImpl<Data, Variables>(
4444
variables = variables,
4545
dataDeserializer = dataDeserializer,
4646
variablesSerializer = variablesSerializer,
47+
callerSdkType = callerSdkType,
4748
variablesSerializersModule = variablesSerializersModule,
4849
dataSerializersModule = dataSerializersModule,
4950
) {
@@ -65,7 +66,7 @@ internal class MutationRefImpl<Data, Variables>(
6566
encodeToStruct(variables, variablesSerializer, variablesSerializersModule)
6667
}
6768
},
68-
isFromGeneratedSdk,
69+
callerSdkType,
6970
)
7071
.runCatching {
7172
withContext(dataConnect.blockingDispatcher) {
@@ -90,6 +91,7 @@ internal class MutationRefImpl<Data, Variables>(
9091
"variables=$variables, " +
9192
"dataDeserializer=$dataDeserializer, " +
9293
"variablesSerializer=$variablesSerializer, " +
94+
"callerSdkType=$callerSdkType, " +
9395
"variablesSerializersModule=$variablesSerializersModule, " +
9496
"dataSerializersModule=$dataSerializersModule" +
9597
")"
@@ -114,7 +116,7 @@ internal fun <Data, Variables> MutationRefImpl<Data, Variables>.copy(
114116
variables: Variables = this.variables,
115117
dataDeserializer: DeserializationStrategy<Data> = this.dataDeserializer,
116118
variablesSerializer: SerializationStrategy<Variables> = this.variablesSerializer,
117-
isFromGeneratedSdk: Boolean = this.isFromGeneratedSdk,
119+
callerSdkType: FirebaseDataConnect.CallerSdkType = this.callerSdkType,
118120
variablesSerializersModule: SerializersModule? = this.variablesSerializersModule,
119121
dataSerializersModule: SerializersModule? = this.dataSerializersModule,
120122
) =
@@ -124,7 +126,7 @@ internal fun <Data, Variables> MutationRefImpl<Data, Variables>.copy(
124126
variables = variables,
125127
dataDeserializer = dataDeserializer,
126128
variablesSerializer = variablesSerializer,
127-
isFromGeneratedSdk = isFromGeneratedSdk,
129+
callerSdkType = callerSdkType,
128130
variablesSerializersModule = variablesSerializersModule,
129131
dataSerializersModule = dataSerializersModule,
130132
)
@@ -140,7 +142,7 @@ internal fun <Data, NewVariables> MutationRefImpl<Data, *>.withVariablesSerializ
140142
variables = variables,
141143
dataDeserializer = dataDeserializer,
142144
variablesSerializer = variablesSerializer,
143-
isFromGeneratedSdk = isFromGeneratedSdk,
145+
callerSdkType = callerSdkType,
144146
variablesSerializersModule = variablesSerializersModule,
145147
dataSerializersModule = dataSerializersModule,
146148
)
@@ -155,7 +157,7 @@ internal fun <NewData, Variables> MutationRefImpl<*, Variables>.withDataDeserial
155157
variables = variables,
156158
dataDeserializer = dataDeserializer,
157159
variablesSerializer = variablesSerializer,
158-
isFromGeneratedSdk = isFromGeneratedSdk,
160+
callerSdkType = callerSdkType,
159161
variablesSerializersModule = variablesSerializersModule,
160162
dataSerializersModule = dataSerializersModule,
161163
)

0 commit comments

Comments
 (0)