From 2c2987e0e47d26658fa22a972ec43a0d2d6f10f3 Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Tue, 11 Nov 2025 11:39:06 -0500 Subject: [PATCH 1/4] feat(analytics): Add SetDefaultEventParameters and overload LogEvent Adds the `SetDefaultEventParameters` function to the Firebase Analytics SDK. This allows users to set default parameters for all events. Also adds an overload to the `LogEvent` function to accept an `IEnumerable` in addition to `params Parameter[]`. --- analytics/src/FirebaseAnalytics.cs | 74 +++++++++++++++++++++++++++--- analytics/src/swig/analytics.i | 28 ++++++++++- 2 files changed, 94 insertions(+), 8 deletions(-) diff --git a/analytics/src/FirebaseAnalytics.cs b/analytics/src/FirebaseAnalytics.cs index 87a1842a5..cd9b0e952 100644 --- a/analytics/src/FirebaseAnalytics.cs +++ b/analytics/src/FirebaseAnalytics.cs @@ -15,6 +15,7 @@ */ using System.Threading.Tasks; +using System.Collections.Generic; namespace Firebase.Analytics { @@ -206,18 +207,79 @@ public static void LogEvent(string name) { /// /// @param[in] parameters A parameter array of `Parameter` instances. public static void LogEvent(string name, params Parameter[] parameters) { - // Convert the Parameter array into a StringList and VariantList to pass to C++ + LogEvent(name, (IEnumerable)parameters); + } + + /// @brief Log an event with associated parameters. + /// + /// An Event is an important occurrence in your app that you want to measure. + /// You can report up to 500 different types of events per app and you can + /// associate up to 25 unique parameters with each Event type. + /// + /// Some common events are in the reference guide via the + /// FirebaseAnalytics.Event* constants, but you may also choose to specify + /// custom event types that are associated with your specific app. + /// + /// @param[in] name Name of the event to log. Should contain 1 to 40 + /// alphanumeric characters or underscores. The name must start with an + /// alphabetic character. Some event names are reserved. + /// See the FirebaseAnalytics.Event properties for the list of reserved event + /// names. + /// The "firebase_" prefix is reserved and should not be used. Note that event + /// names are case-sensitive and that logging two events whose names differ + /// only in case will result in two distinct events. + /// + /// @param[in] parameters An enumerable list of `Parameter` instances. + public static void LogEvent(string name, IEnumerable parameters) { StringList parameterNames = new StringList(); VariantList parameterValues = new VariantList(); - - foreach (Parameter p in parameters) { - parameterNames.Add(p.Name); - parameterValues.Add(Firebase.Variant.FromObject(p.Value)); + if (parameters != null) { + foreach (Parameter p in parameters) { + parameterNames.Add(p.Name); + parameterValues.Add(Firebase.Variant.FromObject(p.Value)); + } } - FirebaseAnalyticsInternal.LogEvent(name, parameterNames, parameterValues); } + /// @brief Adds parameters that will be set on every event logged from the SDK. + /// + /// Adds parameters that will be set on every event logged from the SDK, + /// including automatic ones. The values passed in the parameters bundle will + /// be added to the map of default event parameters. These parameters persist + /// across app runs. They are of lower precedence than event parameters, so if + /// an event parameter and a parameter set using this API have the same name, + /// the value of the event parameter will be used. The same limitations on + /// event parameters apply to default event parameters. + /// + /// @param[in] parameters A parameter array of `Parameter` instances. + public static void SetDefaultEventParameters(params Parameter[] parameters){ + SetDefaultEventParameters((IEnumerable)parameters); + } + + /// @brief Adds parameters that will be set on every event logged from the SDK. + /// + /// Adds parameters that will be set on every event logged from the SDK, + /// including automatic ones. The values passed in the parameters bundle will + /// be added to the map of default event parameters. These parameters persist + /// across app runs. They are of lower precedence than event parameters, so if + /// an event parameter and a parameter set using this API have the same name, + /// the value of the event parameter will be used. The same limitations on + /// event parameters apply to default event parameters. + /// + /// @param[in] parameters An enumerable list of `Parameter` instances. + public static void SetDefaultEventParameters(IEnumerable parameters){ + StringList parameterNames = new StringList(); + VariantList parameterValues = new VariantList(); + if (parameters != null) { + foreach (Parameter p in parameters) { + parameterNames.Add(p.Name); + parameterValues.Add(Firebase.Variant.FromObject(p.Value)); + } + } + FirebaseAnalyticsInternal.SetDefaultEventParameters(parameterNames, parameterValues); + } + /// Clears all analytics data for this app from the device and resets the app /// instance id. public static void ResetAnalyticsData() { diff --git a/analytics/src/swig/analytics.i b/analytics/src/swig/analytics.i index 866f6d4fb..80ac30bb4 100644 --- a/analytics/src/swig/analytics.i +++ b/analytics/src/swig/analytics.i @@ -63,7 +63,7 @@ void LogEvent(const char* name, std::vector parameter_names, if (parameter_names.size() != parameter_values.size()) { firebase::LogError("LogEvent for %s given different list sizes (%d, %d)", name, parameter_names.size(), parameter_values.size()); - return; + return; } size_t number_of_parameters = parameter_names.size(); @@ -78,6 +78,25 @@ void LogEvent(const char* name, std::vector parameter_names, delete[] parameters; } +// Internal version of SetDefaultEventParameters that teakes in two vectors of +// of know types and converts them into C++ parameters to pass them along to +// the public SetDefaulteventparameters +void SetDefaultEventParameters(std::vector parameter_names, + std::vector parameter_values) { + if (parameter_names.size() != parameter_values.size()) { + firebase::LogError( + "SetDefaultEventParameters given different list sizes (%d, %d)", + parameter_names.size(), parameter_values.size()); + return; + } + std::vector parameters; + + for(size_t i = 0; i < parameter_names.size(); ++i) { + parameters.push_back(Parameter(parameter_names[i].c_str(), parameter_values[i])); + } + SetDefaultEventParameters(parameters); +} + // Converts from a generic int, int map to the C++ Consent enums void SetConsentWithInts(const std::map& settings) { std::map converted; @@ -95,9 +114,12 @@ void SetConsentWithInts(const std::map& settings) { // Initialize / Terminate implicitly called when App is created / destroyed. %ignore firebase::analytics::Initialize; %ignore firebase::analytics::Terminate; -// Ignore the SendEvent that takes a Parameter array, as we handle it +// Ignore the LogEvent that takes a Parameter array, as we handle it // with a custom version instead. %ignore firebase::analytics::LogEvent(const char*, const Parameter*, size_t); +// Ignore the SetDefaultEventParameters that takes a Parameter array, as we +// handle it with a custom version instead. +%ignore firebase::analytics::SetDefaultEventParameters(const Parameter*, size_t); // Ignore SetConsent, in order to convert the types with our own function. %ignore firebase::analytics::SetConsent; // Ignore the Parameter class, as we don't want to expose that to C# at all. @@ -120,6 +142,8 @@ namespace firebase { namespace analytics { void LogEvent(const char* name, std::vector parameter_names, std::vector parameter_values); +void SetDefaultEventParameters(std::vector parameter_names, + std::vector parameter_values); void SetConsentWithInts(const std::map& settings); } // namespace analytics } // namespace firebase From cce61744e1116f3cd078bab5814c9b80f0e85e9f Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Tue, 11 Nov 2025 13:33:49 -0500 Subject: [PATCH 2/4] feat(analytics): Add release notes for SetDefaultEventParameters --- docs/readme.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/readme.md b/docs/readme.md index c16676dc2..ceea37e04 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -109,6 +109,11 @@ Support Release Notes ------------- +### Upcoming +- Changes + - Analytics: Added `SetDefaultEventParameters()` which allows developers to specify a dictionary of parameters that will be set on every event logged. + - Analytics: `LogEvent()` now takes a vector of `Parameter` objects, instead of a pointer to an array and a count. + ### 13.5.0 - Changes - Firebase AI: Add support for receiving Live API Transcripts. From 0f85661be2d41b46e546bd06b31ef4bde347ad17 Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Wed, 12 Nov 2025 11:16:05 -0500 Subject: [PATCH 3/4] fixup: Formatting and wording changes --- analytics/src/FirebaseAnalytics.cs | 18 +++++++++--------- analytics/src/swig/analytics.i | 15 ++++++++------- docs/readme.md | 6 ++++-- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/analytics/src/FirebaseAnalytics.cs b/analytics/src/FirebaseAnalytics.cs index cd9b0e952..200b35131 100644 --- a/analytics/src/FirebaseAnalytics.cs +++ b/analytics/src/FirebaseAnalytics.cs @@ -254,7 +254,7 @@ public static void LogEvent(string name, IEnumerable parameters) { /// /// @param[in] parameters A parameter array of `Parameter` instances. public static void SetDefaultEventParameters(params Parameter[] parameters){ - SetDefaultEventParameters((IEnumerable)parameters); + SetDefaultEventParameters((IEnumerable)parameters); } /// @brief Adds parameters that will be set on every event logged from the SDK. @@ -269,15 +269,15 @@ public static void SetDefaultEventParameters(params Parameter[] parameters){ /// /// @param[in] parameters An enumerable list of `Parameter` instances. public static void SetDefaultEventParameters(IEnumerable parameters){ - StringList parameterNames = new StringList(); - VariantList parameterValues = new VariantList(); - if (parameters != null) { - foreach (Parameter p in parameters) { - parameterNames.Add(p.Name); - parameterValues.Add(Firebase.Variant.FromObject(p.Value)); - } + StringList parameterNames = new StringList(); + VariantList parameterValues = new VariantList(); + if (parameters != null) { + foreach (Parameter p in parameters) { + parameterNames.Add(p.Name); + parameterValues.Add(Firebase.Variant.FromObject(p.Value)); } - FirebaseAnalyticsInternal.SetDefaultEventParameters(parameterNames, parameterValues); + } + FirebaseAnalyticsInternal.SetDefaultEventParameters(parameterNames, parameterValues); } /// Clears all analytics data for this app from the device and resets the app diff --git a/analytics/src/swig/analytics.i b/analytics/src/swig/analytics.i index 80ac30bb4..00df5b92a 100644 --- a/analytics/src/swig/analytics.i +++ b/analytics/src/swig/analytics.i @@ -78,9 +78,9 @@ void LogEvent(const char* name, std::vector parameter_names, delete[] parameters; } -// Internal version of SetDefaultEventParameters that teakes in two vectors of -// of know types and converts them into C++ parameters to pass them along to -// the public SetDefaulteventparameters +// Internal version of SetDefaultEventParameters that takes in two vectors +// of known types and converts them into C++ parameters to pass them along to +// the public SetDefaultEventParameters void SetDefaultEventParameters(std::vector parameter_names, std::vector parameter_values) { if (parameter_names.size() != parameter_values.size()) { @@ -91,10 +91,11 @@ void SetDefaultEventParameters(std::vector parameter_names, } std::vector parameters; - for(size_t i = 0; i < parameter_names.size(); ++i) { - parameters.push_back(Parameter(parameter_names[i].c_str(), parameter_values[i])); - } - SetDefaultEventParameters(parameters); + for(size_t i = 0; i < parameter_names.size(); ++i) { + parameters.push_back(Parameter(parameter_names[i].c_str(), parameter_values[i])); + } + + SetDefaultEventParameters(parameters); } // Converts from a generic int, int map to the C++ Consent enums diff --git a/docs/readme.md b/docs/readme.md index ceea37e04..151d22c13 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -111,8 +111,10 @@ Release Notes ------------- ### Upcoming - Changes - - Analytics: Added `SetDefaultEventParameters()` which allows developers to specify a dictionary of parameters that will be set on every event logged. - - Analytics: `LogEvent()` now takes a vector of `Parameter` objects, instead of a pointer to an array and a count. + - Analytics: Added `SetDefaultEventParameters()` which allows developers to + specify a list of parameters that will be set on every event logged. + - Analytics: `LogEvent()` now takes a vector of `Parameter` objects, instead + of a pointer to an array and a count. ### 13.5.0 - Changes From f950b86784a4445298a546f33493c6a05a74e398 Mon Sep 17 00:00:00 2001 From: Austin Benoit Date: Mon, 17 Nov 2025 16:25:40 -0500 Subject: [PATCH 4/4] fixup: reword readme changes to be consistent with csharp changes --- docs/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/readme.md b/docs/readme.md index 151d22c13..fcf67dfe5 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -113,8 +113,8 @@ Release Notes - Changes - Analytics: Added `SetDefaultEventParameters()` which allows developers to specify a list of parameters that will be set on every event logged. - - Analytics: `LogEvent()` now takes a vector of `Parameter` objects, instead - of a pointer to an array and a count. + - Analytics: Added a new `LogEvent()` that take in a IEnumerable of + parameters. ### 13.5.0 - Changes