Skip to content

Commit 831854e

Browse files
committed
Add setDefaultEventParameters.
1 parent 0ea67d2 commit 831854e

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed

analytics/src/analytics_android.cc

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ static const ::firebase::App* g_app = nullptr;
5858
"()Lcom/google/android/gms/tasks/Task;"), \
5959
X(GetSessionId, "getSessionId", \
6060
"()Lcom/google/android/gms/tasks/Task;"), \
61+
X(SetDefaultEventParameters, "setDefaultEventParameters", \
62+
"(Landroid/os/Bundle;)V"), \
6163
X(GetInstance, "getInstance", "(Landroid/content/Context;)" \
6264
"Lcom/google/firebase/analytics/FirebaseAnalytics;", \
6365
firebase::util::kMethodTypeStatic)
@@ -518,6 +520,44 @@ void LogEvent(const char* name, const Parameter* parameters,
518520
});
519521
}
520522

523+
// Convert std::map<std::string, Variant> to Bundle.
524+
jobject StringVariantMapToBundle(JNIEnv* env,
525+
const std::map<std::string, Variant>& map) {
526+
jobject bundle =
527+
env->NewObject(util::bundle::GetClass(),
528+
util::bundle::GetMethodId(util::bundle::kConstructor));
529+
for (const auto& pair : map) {
530+
// Bundle keys must be strings.
531+
const char* key = pair.first.c_str();
532+
const Variant& value = pair.second;
533+
// A null variant clears the default parameter. The Android SDK uses a null
534+
// value in the Bundle for this.
535+
if (value.is_null()) {
536+
// Add null string to clear the parameter.
537+
AddToBundle(env, bundle, key, static_cast<const char*>(nullptr));
538+
} else if (!AddVariantToBundle(env, bundle, key, value)) {
539+
LogError("SetDefaultEventParameters: Unsupported type (%s) for key %s.",
540+
Variant::TypeName(value.type()), key);
541+
}
542+
}
543+
return bundle;
544+
}
545+
546+
void SetDefaultEventParameters(
547+
const std::map<std::string, Variant>& default_parameters) {
548+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
549+
JNIEnv* env = g_app->GetJNIEnv();
550+
551+
jobject bundle = StringVariantMapToBundle(env, default_parameters);
552+
553+
env->CallVoidMethod(
554+
g_analytics_class_instance,
555+
analytics::GetMethodId(analytics::kSetDefaultEventParameters), bundle);
556+
557+
util::CheckAndClearJniExceptions(env);
558+
env->DeleteLocalRef(bundle);
559+
}
560+
521561
/// Initiates on-device conversion measurement given a user email address on iOS
522562
/// (no-op on Android). On iOS, requires dependency
523563
/// GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a

analytics/src/analytics_ios.mm

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,28 @@ void LogEvent(const char* name, const Parameter* parameters, size_t number_of_pa
312312
[FIRAnalytics logEventWithName:@(name) parameters:parameters_dict];
313313
}
314314

315+
void SetDefaultEventParameters(const std::map<std::string, Variant>& default_parameters) {
316+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
317+
// Convert the std::map<std::string, Variant> to NSDictionary*
318+
// The keys must be strings for FIRAnalytics.
319+
NSMutableDictionary* parameters_dict =
320+
[NSMutableDictionary dictionaryWithCapacity:default_parameters.size()];
321+
for (const auto& pair : default_parameters) {
322+
NSString* key = firebase::util::StringToNSString(pair.first);
323+
// A null Variant indicates the default parameter should be cleared.
324+
// In ObjC, setting a key to [NSNull null] in the dictionary achieves this.
325+
id value = pair.second.is_null() ? [NSNull null] : firebase::util::VariantToId(pair.second);
326+
if (value) {
327+
[parameters_dict setObject:value forKey:key];
328+
} else {
329+
LogError("SetDefaultEventParameters: Failed to convert value for key %s.",
330+
pair.first.c_str());
331+
}
332+
}
333+
334+
[FIRAnalytics setDefaultEventParameters:parameters_dict];
335+
}
336+
315337
/// Initiates on-device conversion measurement given a user email address on iOS (no-op on
316338
/// Android). On iOS, requires dependency GoogleAppMeasurementOnDeviceConversion to be linked
317339
/// in, otherwise it is a no-op.

analytics/src/analytics_stub.cc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ void LogEvent(const char* /*name*/, const Parameter* /*parameters*/,
9797
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
9898
}
9999

100+
void SetDefaultEventParameters(
101+
const std::map<std::string, Variant>& default_parameters) {
102+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
103+
// No-op on stub.
104+
}
105+
100106
/// Initiates on-device conversion measurement given a user email address on iOS
101107
/// (no-op on Android). On iOS, requires dependency
102108
/// GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a

analytics/src/include/firebase/analytics.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,17 @@ void LogEvent(const char* name);
476476
void LogEvent(const char* name, const Parameter* parameters,
477477
size_t number_of_parameters);
478478

479+
/// @brief Sets default event parameters for this app.
480+
///
481+
/// This specifies parameters to be included with every subsequent call to
482+
/// `LogEvent`, in addition to the parameters passed to `LogEvent`.
483+
/// The same limitations apply to these parameters as are documented for
484+
/// `LogEvent`.
485+
/// @param[in] default_parameters Map of default parameter names and values.
486+
/// Passing a null value for a parameter name clears the default parameter.
487+
void SetDefaultEventParameters(
488+
const std::map<std::string, Variant>& default_parameters);
489+
479490
/// Initiates on-device conversion measurement given a user email address on iOS
480491
/// and tvOS (no-op on Android). On iOS and tvOS, this method requires the
481492
/// dependency GoogleAppMeasurementOnDeviceConversion to be linked in,

0 commit comments

Comments
 (0)