Skip to content

Commit ebda697

Browse files
authored
Merge 112684d into 8dee6fe
2 parents 8dee6fe + 112684d commit ebda697

File tree

6 files changed

+190
-0
lines changed

6 files changed

+190
-0
lines changed

analytics/integration_test/src/integration_test.cc

+66
Original file line numberDiff line numberDiff line change
@@ -341,4 +341,70 @@ TEST_F(FirebaseAnalyticsTest, TestSetConsent) {
341341
did_test_setconsent_ = true;
342342
}
343343

344+
TEST_F(FirebaseAnalyticsTest, TestSetDefaultEventParameters) {
345+
LogInfo("Testing SetDefaultEventParameters().");
346+
347+
// Set some default parameters with various types.
348+
std::map<std::string, firebase::Variant> defaults;
349+
defaults["default_int"] = static_cast<int64_t>(123); // int64_t
350+
defaults["default_double"] = 45.67; // double
351+
defaults["default_bool"] = true; // bool
352+
defaults["default_string"] = "test_string_value"; // const char*
353+
defaults["default_to_clear"] = "will_be_cleared"; // Another string
354+
355+
firebase::analytics::SetDefaultEventParameters(defaults);
356+
LogInfo("Set initial default parameters.");
357+
358+
// Log an event - the defaults should be included automatically by the
359+
// underlying SDK if logging immediately after setting is supported.
360+
// Verification might need manual checking in the Analytics console or
361+
// via platform-specific debug logs if possible.
362+
firebase::analytics::LogEvent("event_with_mixed_defaults");
363+
LogInfo("Logged event_with_mixed_defaults");
364+
365+
// Clear one default parameter and update another.
366+
defaults["default_to_clear"] = firebase::Variant::Null(); // Clear this one
367+
defaults["default_int"] = static_cast<int64_t>(999); // Update this one
368+
firebase::analytics::SetDefaultEventParameters(defaults);
369+
LogInfo("Cleared one parameter and updated another.");
370+
371+
// Log another event.
372+
firebase::analytics::LogEvent("event_with_one_default_cleared");
373+
LogInfo("Logged event_with_one_default_cleared");
374+
375+
// Set only one parameter, clearing others implicitly if underlying SDK works
376+
// like that
377+
std::map<std::string, firebase::Variant> single_default;
378+
single_default["only_this_double"] = 78.9;
379+
firebase::analytics::SetDefaultEventParameters(single_default);
380+
LogInfo("Set a single different default parameter.");
381+
firebase::analytics::LogEvent(
382+
"event_with_only_one_default"); // Changed log event name slightly
383+
LogInfo("Logged event_with_only_one_default");
384+
385+
// If we reach here without crashing, consider the basic test passed for the
386+
// C++ layer. Deeper verification requires platform tools.
387+
LogInfo("SetDefaultEventParameters() tests completed.");
388+
}
389+
390+
TEST_F(FirebaseAnalyticsTest, TestClearDefaultEventParameters) {
391+
LogInfo("Testing ClearDefaultEventParameters().");
392+
393+
// Set some defaults first.
394+
std::map<std::string, firebase::Variant> defaults;
395+
defaults["temp_default"] = "will_be_cleared";
396+
firebase::analytics::SetDefaultEventParameters(defaults);
397+
398+
// Now clear them all.
399+
firebase::analytics::ClearDefaultEventParameters();
400+
401+
// Log an event - no defaults should be included.
402+
firebase::analytics::LogEvent("event_after_clear_defaults");
403+
LogInfo("Logged event_after_clear_defaults");
404+
405+
// If we reach here without crashing, consider the basic test passed for the
406+
// C++ layer.
407+
LogInfo("ClearDefaultEventParameters() test completed.");
408+
}
409+
344410
} // namespace firebase_testapp_automated

analytics/src/analytics_android.cc

+60
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,64 @@ 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 for that key.
534+
// The Android SDK uses Bundle.putString(key, null) for this.
535+
if (value.is_null()) {
536+
jstring key_string = env->NewStringUTF(key);
537+
// Call Bundle.putString(key, null)
538+
env->CallVoidMethod(bundle,
539+
util::bundle::GetMethodId(util::bundle::kPutString),
540+
key_string, nullptr);
541+
util::CheckAndClearJniExceptions(env);
542+
env->DeleteLocalRef(key_string);
543+
} else if (!AddVariantToBundle(env, bundle, key, value)) {
544+
LogError("SetDefaultEventParameters: Unsupported type (%s) for key %s.",
545+
Variant::TypeName(value.type()), key);
546+
}
547+
// CheckAndClearJniExceptions is called within AddVariantToBundle or above
548+
// for the null case.
549+
}
550+
return bundle;
551+
}
552+
553+
void SetDefaultEventParameters(
554+
const std::map<std::string, Variant>& default_parameters) {
555+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
556+
JNIEnv* env = g_app->GetJNIEnv();
557+
558+
jobject bundle = StringVariantMapToBundle(env, default_parameters);
559+
560+
env->CallVoidMethod(
561+
g_analytics_class_instance,
562+
analytics::GetMethodId(analytics::kSetDefaultEventParameters), bundle);
563+
564+
util::CheckAndClearJniExceptions(env);
565+
env->DeleteLocalRef(bundle);
566+
}
567+
568+
void ClearDefaultEventParameters() {
569+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
570+
JNIEnv* env = g_app->GetJNIEnv();
571+
572+
// Call FirebaseAnalytics.setDefaultEventParameters(null)
573+
env->CallVoidMethod(
574+
g_analytics_class_instance,
575+
analytics::GetMethodId(analytics::kSetDefaultEventParameters),
576+
nullptr); // Pass null Bundle to clear all parameters
577+
578+
util::CheckAndClearJniExceptions(env);
579+
}
580+
521581
/// Initiates on-device conversion measurement given a user email address on iOS
522582
/// (no-op on Android). On iOS, requires dependency
523583
/// GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a

analytics/src/analytics_ios.mm

+33
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,39 @@ 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+
// A null Variant indicates the default parameter for that key should be
326+
// cleared. In ObjC, setting a key to [NSNull null] in the dictionary
327+
// achieves this.
328+
id value = pair.second.is_null() ? [NSNull null] : firebase::util::VariantToId(pair.second);
329+
if (value) {
330+
[parameters_dict setObject:value forKey:key];
331+
} else {
332+
// VariantToId could return nil if the variant type is unsupported.
333+
// Log an error but continue, as NSNull case is handled above.
334+
LogError("SetDefaultEventParameters: Failed to convert value for key %s.",
335+
pair.first.c_str());
336+
}
337+
}
338+
339+
[FIRAnalytics setDefaultEventParameters:parameters_dict];
340+
}
341+
342+
void ClearDefaultEventParameters() {
343+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
344+
// Passing nil to the underlying SDK method clears all parameters.
345+
[FIRAnalytics setDefaultEventParameters:nil];
346+
}
347+
315348
/// Initiates on-device conversion measurement given a user email address on iOS (no-op on
316349
/// Android). On iOS, requires dependency GoogleAppMeasurementOnDeviceConversion to be linked
317350
/// in, otherwise it is a no-op.

analytics/src/analytics_stub.cc

+11
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,17 @@ 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+
106+
void ClearDefaultEventParameters() {
107+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
108+
// No-op on stub.
109+
}
110+
100111
/// Initiates on-device conversion measurement given a user email address on iOS
101112
/// (no-op on Android). On iOS, requires dependency
102113
/// GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a

analytics/src/include/firebase/analytics.h

+15
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,21 @@ 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 `Variant` value for a parameter name clears the default
487+
/// parameter for that key.
488+
void SetDefaultEventParameters(
489+
const std::map<std::string, Variant>& default_parameters);
490+
491+
/// @brief Clears all default event parameters.
492+
void ClearDefaultEventParameters();
493+
479494
/// Initiates on-device conversion measurement given a user email address on iOS
480495
/// and tvOS (no-op on Android). On iOS and tvOS, this method requires the
481496
/// dependency GoogleAppMeasurementOnDeviceConversion to be linked in,

release_build_files/readme.md

+5
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,11 @@ workflow use only during the development of your app, not for publicly shipping
631631
code.
632632

633633
## Release Notes
634+
### Upcoming Release
635+
- Changes
636+
- Analytics: Add SetDefaultEventParams to set default parameters for
637+
all LogEvent calls.
638+
634639
### 12.7.0
635640
- Changes
636641
- General (iOS): Update to Firebase Cocoapods version 11.10.0.

0 commit comments

Comments
 (0)