Skip to content

Commit 6a05416

Browse files
authored
Feat: add SetDefaultEventParameters and have EventLog to take in a vector (#1801)
* Feat: add setdefaulteventparameters for android and stub for others This brings the Android SDK into parity for C++. * Feat: add setdefaulteventparameters for iOS and take in vector This adds in the iOS setdefaulteventparameters. Along with that I will make the setdefaulteventparameters and logevent take in vector for the parameters. * docs: add release notes for setdefaulteventparameters and logevent * fix: format code * fix: fixup stings and minor errors * fix: check for errors during the creation of bundle. * fix: intergation_test use the vectors in setdefaulteventparameters
1 parent 1097939 commit 6a05416

File tree

9 files changed

+180
-3
lines changed

9 files changed

+180
-3
lines changed

analytics/integration_test/src/integration_test.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,18 @@ TEST_F(FirebaseAnalyticsTest, TestLogEventWithComplexParameters) {
297297
sizeof(kViewCartParameters) / sizeof(kViewCartParameters[0]));
298298
}
299299

300+
TEST_F(FirebaseAnalyticsTest, TestSetDefaultEventParameters) {
301+
const std::vector<firebase::analytics::Parameter> kDefaultParameters = {
302+
firebase::analytics::Parameter("default_parameter_double", 123.456),
303+
firebase::analytics::Parameter("default_parameter_int", 4),
304+
firebase::analytics::Parameter("default_parameter_str", "Hello World"),
305+
};
306+
307+
firebase::analytics::SetDefaultEventParameters(kDefaultParameters);
308+
firebase::analytics::LogEvent("default_parameter_event");
309+
firebase::analytics::SetDefaultEventParameters(nullptr, 0);
310+
}
311+
300312
TEST_F(FirebaseAnalyticsTest, TestSetConsent) {
301313
// On Android, this test must be performed at the end, after all the tests for
302314
// session ID and instance ID. This is because once you call SetConsent to

analytics/src/analytics_android.cc

Lines changed: 60 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include <cstdint>
2121
#include <cstring>
22+
#include <vector>
2223

2324
#include "analytics/src/analytics_common.h"
2425
#include "analytics/src/include/firebase/analytics.h"
@@ -60,7 +61,9 @@ static const ::firebase::App* g_app = nullptr;
6061
"()Lcom/google/android/gms/tasks/Task;"), \
6162
X(GetInstance, "getInstance", "(Landroid/content/Context;)" \
6263
"Lcom/google/firebase/analytics/FirebaseAnalytics;", \
63-
firebase::util::kMethodTypeStatic)
64+
firebase::util::kMethodTypeStatic), \
65+
X(SetDefaultEventParameters, "setDefaultEventParameters", \
66+
"(Landroid/os/Bundle;)V")
6467
// clang-format on
6568

6669
// clang-format off
@@ -340,8 +343,8 @@ void AddToBundle(JNIEnv* env, jobject bundle, const char* key,
340343
void AddToBundle(JNIEnv* env, jobject bundle, const char* key, double value) {
341344
jstring key_string = env->NewStringUTF(key);
342345
env->CallVoidMethod(bundle,
343-
util::bundle::GetMethodId(util::bundle::kPutFloat),
344-
key_string, static_cast<jfloat>(value));
346+
util::bundle::GetMethodId(util::bundle::kPutDouble),
347+
key_string, static_cast<jdouble>(value));
345348
util::CheckAndClearJniExceptions(env);
346349
env->DeleteLocalRef(key_string);
347350
}
@@ -518,6 +521,60 @@ void LogEvent(const char* name, const Parameter* parameters,
518521
});
519522
}
520523

524+
// log an event and the associated parameters via a vector.
525+
void LogEvent(const char* name, const std::vector<Parameter>& parameters) {
526+
LogEvent(name, parameters.data(), parameters.size());
527+
}
528+
529+
// Set the default event parameters.
530+
void SetDefaultEventParameters(const Parameter* parameters,
531+
size_t number_of_parameters) {
532+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
533+
JNIEnv* env = g_app->GetJNIEnv();
534+
535+
if (!parameters || number_of_parameters == 0) {
536+
env->CallVoidMethod(
537+
g_analytics_class_instance,
538+
analytics::GetMethodId(analytics::kSetDefaultEventParameters), nullptr);
539+
if (util::CheckAndClearJniExceptions(env)) {
540+
LogError("Failed to set default event parameters");
541+
}
542+
return;
543+
}
544+
545+
jobject bundle =
546+
env->NewObject(util::bundle::GetClass(),
547+
util::bundle::GetMethodId(util::bundle::kConstructor));
548+
if (util::CheckAndClearJniExceptions(env) || !bundle) {
549+
LogError("Failed to create bundle for SetDefaultEventParameters.");
550+
if (bundle) env->DeleteLocalRef(bundle);
551+
return;
552+
}
553+
554+
for (size_t i = 0; i < number_of_parameters; ++i) {
555+
const Parameter& parameter = parameters[i];
556+
if (!AddVariantToBundle(env, bundle, parameter.name, parameter.value)) {
557+
// A Variant type that couldn't be handled was passed in.
558+
LogError(
559+
"SetDefaultEventParameters(%s): %s is not a valid parameter value"
560+
" type. Excluded from default parameters.",
561+
parameter.name, Variant::TypeName(parameter.value.type()));
562+
}
563+
}
564+
env->CallVoidMethod(
565+
g_analytics_class_instance,
566+
analytics::GetMethodId(analytics::kSetDefaultEventParameters), bundle);
567+
if (util::CheckAndClearJniExceptions(env)) {
568+
LogError("Failed to set default event parameters");
569+
}
570+
env->DeleteLocalRef(bundle);
571+
}
572+
573+
// Set the default event parameters
574+
void SetDefaultEventParameters(const std::vector<Parameter>& parameters) {
575+
SetDefaultEventParameters(parameters.data(), parameters.size());
576+
}
577+
521578
/// Initiates on-device conversion measurement given a user email address on iOS
522579
/// (no-op on Android). On iOS, requires dependency
523580
/// GoogleAppMeasurementOnDeviceConversion to be linked in, otherwise it is a

analytics/src/analytics_desktop.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,11 @@ void LogEvent(const char* name, const Parameter* parameters,
310310
// c_event_params if non-null.
311311
}
312312

313+
// log an event and the associated parameters via a vector.
314+
void LogEvent(const char* name, const std::vector<Parameter>& parameters) {
315+
LogEvent(name, parameters.data(), parameters.size());
316+
}
317+
313318
// Sets a user property to the given value.
314319
//
315320
// Up to 25 user property names are supported. Once set, user property values
@@ -429,6 +434,15 @@ void LogEvent(const char* name, const char* parameter_name,
429434

430435
// --- Stub Implementations for Unsupported Features ---
431436

437+
void SetDefaultEventParameters(const Parameter* parameters,
438+
size_t number_of_parameters) {
439+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
440+
}
441+
442+
void SetDefaultEventParameters(const std::vector<Parameter>& parameters) {
443+
SetDefaultEventParameters(parameters.data(), parameters.size());
444+
}
445+
432446
void SetConsent(const std::map<ConsentType, ConsentStatus>& consent_settings) {
433447
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
434448

analytics/src/analytics_desktop_dynamic.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ static void Stub_GoogleAnalytics_LogEvent(const char* name, GoogleAnalytics_Even
139139
// No return value.
140140
}
141141

142+
static void Stub_GoogleAnalytics_SetDefaultEventParameters(GoogleAnalytics_EventParameters* parameters, size_t number_of_parameters) {
143+
// No return value.
144+
}
145+
142146
// Stub for GoogleAnalytics_SetUserProperty
143147
static void Stub_GoogleAnalytics_SetUserProperty(const char* name,
144148
const char* value) {
@@ -180,6 +184,7 @@ void (*ptr_GoogleAnalytics_EventParameters_InsertItemVector)(GoogleAnalytics_Eve
180184
void (*ptr_GoogleAnalytics_EventParameters_Destroy)(GoogleAnalytics_EventParameters* event_parameter_map) = &Stub_GoogleAnalytics_EventParameters_Destroy;
181185
bool (*ptr_GoogleAnalytics_Initialize)(const GoogleAnalytics_Options* options) = &Stub_GoogleAnalytics_Initialize;
182186
void (*ptr_GoogleAnalytics_LogEvent)(const char* name, GoogleAnalytics_EventParameters* parameters) = &Stub_GoogleAnalytics_LogEvent;
187+
void (*ptr_GoogleAnalytics_SetDefaultEventParameters)(GoogleAnalytics_EventParameters* parameters, size_t number_of_parameters) = &Stub_GoogleAnalytics_SetDefaultEventParameters;
183188
void (*ptr_GoogleAnalytics_SetUserProperty)(const char* name, const char* value) = &Stub_GoogleAnalytics_SetUserProperty;
184189
void (*ptr_GoogleAnalytics_SetUserId)(const char* user_id) = &Stub_GoogleAnalytics_SetUserId;
185190
void (*ptr_GoogleAnalytics_ResetAnalyticsData)() = &Stub_GoogleAnalytics_ResetAnalyticsData;

analytics/src/analytics_desktop_dynamic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ extern void (*ptr_GoogleAnalytics_EventParameters_InsertItemVector)(GoogleAnalyt
164164
extern void (*ptr_GoogleAnalytics_EventParameters_Destroy)(GoogleAnalytics_EventParameters* event_parameter_map);
165165
extern bool (*ptr_GoogleAnalytics_Initialize)(const GoogleAnalytics_Options* options);
166166
extern void (*ptr_GoogleAnalytics_LogEvent)(const char* name, GoogleAnalytics_EventParameters* parameters);
167+
extern void (*ptr_GoogleAnalytics_SetDefaultEventParameters)(GoogleAnalytics_EventParameters* parameters, size_t number_of_parameters);
167168
extern void (*ptr_GoogleAnalytics_SetUserProperty)(const char* name, const char* value);
168169
extern void (*ptr_GoogleAnalytics_SetUserId)(const char* user_id);
169170
extern void (*ptr_GoogleAnalytics_ResetAnalyticsData)();

analytics/src/analytics_ios.mm

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

315+
// log an event and the associated parameters via a vector.
316+
void LogEvent(const char* name, const std::vector<Parameter>& parameters) {
317+
LogEvent(name, parameters.data(), parameters.size());
318+
}
319+
320+
// Sets the default event parameter
321+
void SetDefaultEventParameters(const Parameter* parameters, size_t number_of_parameters) {
322+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
323+
324+
if (!parameters || number_of_parameters == 0) {
325+
[FIRAnalytics setDefaultEventParameters:nil];
326+
return;
327+
}
328+
329+
NSMutableDictionary* parameters_dict =
330+
[NSMutableDictionary dictionaryWithCapacity:number_of_parameters];
331+
for (size_t i = 0; i < number_of_parameters; ++i) {
332+
const Parameter& parameter = parameters[i];
333+
NSString* parameter_name = SafeString(parameter.name);
334+
if (!AddVariantToDictionary(parameters_dict, parameter_name, parameter.value)) {
335+
// A Variant type that couldn't be handled was passed in.
336+
LogError("SetDefaultEventParameters(%s): %s is not a valid parameter value type. "
337+
"The parameter was not added.",
338+
parameter.name, Variant::TypeName(parameter.value.type()));
339+
}
340+
}
341+
[FIRAnalytics setDefaultEventParameters:parameters_dict];
342+
}
343+
344+
// Sets the default event parameters via a vector
345+
void SetDefaultEventParameters(const std::vector<Parameter>& parameters) {
346+
SetDefaultEventParameters(parameters.data(), parameters.size());
347+
}
348+
315349
/// Initiates on-device conversion measurement given a user email address on iOS (no-op on
316350
/// Android). On iOS, requires dependency GoogleAppMeasurementOnDeviceConversion to be linked
317351
/// in, otherwise it is a no-op.

analytics/src/include/firebase/analytics.h

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

479+
/// @brief Log an event with associated parameters.
480+
///
481+
/// An Event is an important occurrence in your app that you want to
482+
/// measure. You can report up to 500 different types of events per app and
483+
/// you can associate up to 25 unique parameters with each Event type.
484+
///
485+
/// Some common events are documented in @ref event_names (%event_names.h),
486+
/// but you may also choose to specify custom event types that are associated
487+
/// with your specific app.
488+
///
489+
/// @param[in] name Name of the event to log. Should contain 1 to 40
490+
/// alphanumeric characters or underscores. The name must start with an
491+
/// alphabetic character. Some event names are reserved. See @ref event_names
492+
/// (%event_names.h) for the list of reserved event names. The "firebase_"
493+
/// prefix is reserved and should not be used. Note that event names are
494+
/// case-sensitive and that logging two events whose names differ only in
495+
/// case will result in two distinct events.
496+
/// @param[in] parameters Vector of Parameter structures.
497+
void LogEvent(const char* name, const std::vector<Parameter>& parameters);
498+
499+
/// @brief Adds parameters that will be set on every event logged from the SDK.
500+
///
501+
/// Adds parameters that will be set on every event logged from the SDK,
502+
/// including automatic ones. The values passed in the parameters bundle will
503+
/// be added to the map of default event parameters. These parameters persist
504+
/// across app runs. They are of lower precedence than event parameters, so if
505+
/// an event parameter and a parameter set using this API have the same name,
506+
/// the value of the event parameter will be used. The same limitations on event
507+
/// parameters apply to default event parameters.
508+
///
509+
/// @param[in] parameters Array of Parameter structures.
510+
/// @param[in] number_of_parameters Number of elements in the parameters
511+
/// array.
512+
void SetDefaultEventParameters(const Parameter* parameters,
513+
size_t number_of_parameters);
514+
515+
/// @brief Adds parameters that will be set on every event logged from the SDK.
516+
///
517+
/// Adds parameters that will be set on every event logged from the SDK,
518+
/// including automatic ones. The values passed in the parameters bundle will
519+
/// be added to the map of default event parameters. These parameters persist
520+
/// across app runs. They are of lower precedence than event parameters, so if
521+
/// an event parameter and a parameter set using this API have the same name,
522+
/// the value of the event parameter will be used. The same limitations on event
523+
/// parameters apply to default event parameters.
524+
///
525+
/// @param[in] parameters reference to vector of Parameter structures.
526+
void SetDefaultEventParameters(const std::vector<Parameter>& parameters);
527+
479528
/// Initiates on-device conversion measurement given a user email address on iOS
480529
/// and tvOS (no-op on Android). On iOS and tvOS, this method requires the
481530
/// dependency GoogleAppMeasurementOnDeviceConversion to be linked in,

app/src/util_android.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,7 @@ METHOD_LOOKUP_DECLARATION(activity, ACTIVITY_METHODS)
496496
X(GetString, "getString", "(Ljava/lang/String;)Ljava/lang/String;"), \
497497
X(KeySet, "keySet", "()Ljava/util/Set;"), \
498498
X(PutFloat, "putFloat", "(Ljava/lang/String;F)V"), \
499+
X(PutDouble, "putDouble", "(Ljava/lang/String;D)V"), \
499500
X(PutLong, "putLong", "(Ljava/lang/String;J)V"), \
500501
X(PutString, "putString", "(Ljava/lang/String;Ljava/lang/String;)V"), \
501502
X(PutBundle, "putBundle", "(Ljava/lang/String;Landroid/os/Bundle;)V"), \

release_build_files/readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,10 @@ code.
618618
- Storage: Add support for Firebase Storage emulator via `UseEmulator`.
619619
The `UseEmulator` method should be called before invoking any other
620620
methods on a new instance of Storage. Default port is 9199.
621+
- Analytics: Add support for SetDefaultEventParameters in Android and iOS.
622+
Adds parameters that will be set on every event logged from the SDK,
623+
including automatic ones.
624+
- Analytics: Enables LogEvent to take in a vector of parameters.
621625

622626
### 13.2.0
623627
- Changes

0 commit comments

Comments
 (0)