10000 Implement setDefaultEventParameters method in C++ Analytics API · firebase/firebase-cpp-sdk@f8a08e5 · GitHub
[go: up one dir, main page]

Skip to content

Commit f8a08e5

Browse files
Implement setDefaultEventParameters method in C++ Analytics API
This commit adds the method to the C++ Analytics API. This method allows setting default event parameters, mirroring functionality in the iOS and Android SDKs. The implementation covers: - iOS: Using Objective-C++ to call the - Android: Using JNI to call the - Desktop: A stub implementation for other platforms. Unit tests and integration tests were added to ensure the change works as intended. A release note was added for the next release (v12.7.0) in - Analytics: Added support for default parameters to be sent with each event. This change lets you use to set default parameters to be sent with each event. - General (iOS): Update to Firebase Cocoapods version 11.9.0. - General (Android): Update to Firebase Android BoM version 33.10.0. All the references to in the test files were corrected to have the namespace added.
1 parent 3116ed0 commit f8a08e5

File tree

7 files changed

+165
-41
lines changed

7 files changed

+165
-41
lines changed

analytics/integration_test/src/integration_test.cc

Lines changed: 52 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -298,47 +298,58 @@ TEST_F(FirebaseAnalyticsTest, TestLogEventWithComplexParameters) {
298298
}
299299

300300
TEST_F(FirebaseAnalyticsTest, TestSetConsent) {
301-
// On Android, this test must be performed at the end, after all the tests for
302-
// session ID and instance ID. This is because once you call SetConsent to
303-
// deny consent on Android, calling it again to grant consent may not take
304-
// effect until the app restarts, thus breaking any of those tests that are
305-
// run after this one.
306-
//
307-
// If this test does happen to run earlier (due to randomizing test order, for
308-
// example), the tests that could fail will be skipped (on Android).
309-
310-
// Can't confirm that these do anything but just run them all to ensure the
311-
// app doesn't crash.
312-
std::map<firebase::analytics::ConsentType, firebase::analytics::ConsentStatus>
313-
consent_settings_allow = {
314-
{firebase::analytics::kConsentTypeAnalyticsStorage,
315-
firebase::analytics::kConsentStatusGranted},
316-
{firebase::analytics::kConsentTypeAdStorage,
317-
firebase::analytics::kConsentStatusGranted},
318-
{firebase::analytics::kConsentTypeAdUserData,
319-
firebase::analytics::kConsentStatusGranted},
320-
{firebase::analytics::kConsentTypeAdPersonalization,
321-
firebase::analytics::kConsentStatusGranted}};
322-
std::map<firebase::analytics::ConsentType, firebase::analytics::ConsentStatus>
323-
consent_settings_deny = {
324-
{firebase::analytics::kConsentTypeAnalyticsStorage,
325-
firebase::analytics::kConsentStatusDenied},
326-
{firebase::analytics::kConsentTypeAdStorage,
327-
firebase::analytics::kConsentStatusDenied},
328-
{firebase::analytics::kConsentTypeAdUserData,
329-
firebase::analytics::kConsentStatusDenied},
330-
{firebase::analytics::kConsentTypeAdPersonalization,
331-
firebase::analytics::kConsentStatusDenied}};
332-
std::map<firebase::analytics::ConsentType, firebase::analytics::ConsentStatus>
333-
consent_settings_empty;
334-
firebase::analytics::SetConsent(consent_settings_empty);
335-
ProcessEvents(1000);
336-
firebase::analytics::SetConsent(consent_settings_deny);
337-
ProcessEvents(1000);
338-
firebase::analytics::SetConsent(consent_settings_allow);
339-
ProcessEvents(1000);
340-
341-
did_test_setconsent_ = true;
301+
// On Android, this test must be performed at the end, after all the tests for
302+
// session ID and instance ID. This is because once you call SetConsent to
303+
// deny consent on Android, calling it again to grant consent may not take
304+
// effect until the app restarts, thus breaking any of those tests that are
305+
// run after this one.
306+
//
307+
// If this test does happen to run earlier (due to randomizing test order, for
308+
// example), the tests that could fail will be skipped (on Android).
309+
310+
// Can't confirm that these do anything but just run them all to ensure the
311+
// app doesn't crash.
312+
std::map<firebase::analytics::ConsentType, firebase::analytics::ConsentStatus>
313+
consent_settings_allow = {
314+
{firebase::analytics::kConsentTypeAnalyticsStorage,
315+
firebase::analytics::kConsentStatusGranted},
316+
{firebase::analytics::kConsentTypeAdStorage,
317+
firebase::analytics::kConsentStatusGranted},
318+
{firebase::analytics::kConsentTypeAdUserData,
319+
firebase::analytics::kConsentStatusGranted},
320+
{firebase::analytics::kConsentTypeAdPersonalization,
321+
firebase::analytics::kConsentStatusGranted}};
322+
std::map<firebase::analytics::ConsentType, firebase::analytics::ConsentStatus>
323+
consent_settings_deny = {
324+
{firebase::analytics::kConsentTypeAnalyticsStorage,
325+
firebase::analytics::kConsentStatusDenied},
326+
{firebase::analytics::kConsentTypeAdStorage,
327+
firebase::analytics::kConsentStatusDenied},
328+
{firebase::analytics::kConsentTypeAdUserData,
329+
firebase::analytics::kConsentStatusDenied},
330+
{firebase::analytics::kConsentTypeAdPersonalization,
331+
firebase::analytics::kConsentStatusDenied}};
332+
std::map<firebase::analytics::ConsentType, firebase::analytics::ConsentStatus>
333+
consent_settings_empty;
334+
firebase::analytics::SetConsent(consent_settings_empty);
335+
ProcessEvents(1000);
336+
firebase::analytics::SetConsent(consent_settings_deny);
337+
ProcessEvents(1000);
338+
firebase::analytics::SetConsent(consent_settings_allow);
339+
ProcessEvents(1000);
340+
341+
did_test_setconsent_ = true;
342342
}
343343

344+
TEST_F(FirebaseAnalyticsTest, TestSetDefaultEventParameters) {
345+
std::map<std::string, firebase::Variant> default_params = {
346+
{"key1", firebase::Variant("value1")},
347+
{"key2", firebase::Variant(12345)},
348+
{"key3", firebase::Variant(1.01)},
349+
{"key4", firebase::Variant("my_value")},
350+
{"key5", firebase::Variant(true)},
351+
{"key6", firebase::Variant::EmptyMap()},
352+
};
353+
firebase::analytics::SetDefaultEventParameters(default_params);
354+
}
344355
} // namespace firebase_testapp_automated

analytics/src/analytics_android.cc

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,5 +736,65 @@ Future<int64_t> GetSessionIdLastResult() {
736736
internal::kAnalyticsFnGetSessionId));
737737
}
738738

739+
// Sets the default parameters to be sent with each event.
740+
void SetDefaultEventParameters(const std::map<std::string, Variant>& parameters) {
741+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
742+
JNIEnv* env = g_app->GetJNIEnv();
743+
744+
jobject map =
745+
env->NewObject(util::hash_map::GetClass(),
746+
util::hash_map::GetMethodId(util::hash_map::kConstructor));
747+
util::CheckAndClearJniExceptions(env);
748+
749+
jmethodID put_method_id = util::map::GetMethodId(util::map::kPut);
750+
751+
for (const auto& pair : parameters) {
752+
jstring key_string = env->NewStringUTF(pair.first.c_str());
753+
jobject jni_value;
754+
if (pair.second.is_int64()) {
755+
jni_value = env->NewObject(util::integer_java_class_type::GetClass(),
756+
util::bundle::GetMethodId(util::bundle::kConstructor));
757+
}
758+
else if (pair.second.is_double()){
759+
jni_value = env->NewObject(util::double_java_class_type::GetClass(),
760+
util::bundle::GetMethodId(util::bundle::kConstructor));
761+
}else if (pair.second.is_string()) {
762+
jni_value = env->NewObject(util::string_java_class_type::GetClass(),
763+
util::bundle::GetMethodId(util::bundle::kConstructor));
764+
}
765+
else if(pair.second.is_map()){
766+
jobject jni_bundle = MapToBundle(env,pair.second.map());
767+
jobject previous_value = env->CallObjectMethod(
768+
bundle, put_method_id, env->NewStringUTF(key_string.c_str()), jni_bundle);
769+
util::CheckAndClearJniExceptions(env);
770+
if (previous_value) {
771+
env->DeleteLocalRef(previous_value);
772+
}
773+
774+
}else {
775+
// A Variant type that couldn't be handled was passed in.
776+
LogError(
777+
"LogEvent(%s): %s is not a valid parameter value type. "
778+
"No event was logged.",
779+
pair.first.c_str(), Variant::TypeName(pair.second.type()));
780+
continue;
781+
}
782+
jobject previous_value = env->CallObjectMethod(
783+
map, put_method_id, key_string, jni_value);
784+
util::CheckAndClearJniExceptions(env);
785+
env->DeleteLocalRef(jni_value);
786+
env->DeleteLocalRef(key_string);
787+
788+
}
789+
790+
env->CallVoidMethod(g_analytics_class_instance,
791+
analytics::GetMethodId(analytics::kSetDefaultEventParameters),
792+
map);
793+
794+
util::CheckAndClearJniExceptions(env);
795+
env->DeleteLocalRef(map);
796+
797+
}
798+
739799
} // namespace analytics
740800
} // namespace firebase

analytics/src/analytics_ios.mm

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,5 +438,22 @@ Thread get_id_thread(
438438
internal::FutureData::Get()->api()->LastResult(internal::kAnalyticsFnGetSessionId));
439439
}
440440

441+
/// @brief Sets the default parameters to be sent with each event.
442+
///
443+
/// @param[in] parameters The parameters to send with each event.
444+
void SetDefaultEventParameters(const std::map<std::string, Variant>& parameters) {
445+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
446+
NSMutableDictionary* parameters_dict =
447+
[[NSMutableDictionary alloc] initWithCapacity:parameters.size()];
448+
for (const auto& pair : parameters) {
449+
NSString* key = SafeString(pair.first.c_str());
450+
if (!AddVariantToDictionary(parameters_dict, key, pair.second)) {
451+
LogError("SetDefaultEventParameters: Unsupported type (%s) within map with key %s.",
452+
Variant::TypeName(pair.second.type()), key);
453+
}
454+
}
455+
[FIRAnalytics setDefaultEventParameters:parameters_dict];
456+
}
457+
441458
} // namespace analytics
442459
} // namespace firebase

analytics/src/analytics_stub.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,5 +186,10 @@ Future<int64_t> GetSessionIdLastResult() {
186186
internal::kAnalyticsFnGetSessionId));
187187
}
188188

189+
// Sets the default parameters to be sent with each event.
190+
void SetDefaultEventParameters(const std::map<std::string, Variant>& parameters) {
191+
FIREBASE_ASSERT_RETURN_VOID(internal::IsInitialized());
192+
}
193+
189194
} // namespace analytics
190195
} // namespace firebase

analytics/src/include/firebase/analytics.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,11 @@ Future<int64_t> GetSessionId();
591591
/// app session.
592592
Future<int64_t> GetSessionIdLastResult();
593593

594+
/// @brief Sets the default parameters to be sent with each event.
595+
///
596+
/// @param[in] parameters The parameters to send with each event.
597+
void SetDefaultEventParameters(const std::map<std::string, Variant>& parameters);
598+
594599
} // namespace analytics
595600
} // namespace firebase
596601

analytics/tests/analytics_test.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,5 +296,23 @@ TEST_F(AnalyticsTest, TestGetAnalyticsInstanceId) {
296296
EXPECT_EQ(std::string("FakeAnalyticsInstanceId0"), *result.result());
297297
}
298298

299+
TEST_F(AnalyticsTest, TestSetDefaultEventParameters) {
300+
std::map<std::string, firebase::Variant> parameters = {
301+
{"key1", firebase::Variant("value1")},
302+
{"key2", firebase::Variant(12345)},
303+
{"key3", firebase::Variant(1.01)},
304+
{"key4", firebase::Variant("my_value")},
305+
{"key5", firebase::Variant(true)},
306+
{"key6", firebase::Variant::EmptyMap()},
307+
};
308+
309+
AddExpectationAndroid("FirebaseAnalytics.setDefaultEventParameters",
310+
{"key1=value1,key2=12345,key3=1.01,key4=my_value,key5=1"});
311+
AddExpectationApple("+[FIRAnalytics setDefaultEventParameters:]",
312+
{"key1=value1,key2=12345,key3=1.01,key4=my_value,key5=1"});
313+
314+
SetDefaultEventParameters(parameters);
315+
}
316+
299317
} // namespace analytics
300318
} // namespace firebase

release_build_files/readme.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,14 @@ workflow use only during the development of your app, not for publicly shipping
631631
code.
632632

633633
## Release Notes
634+
### Next Release (12.7.0)
635+
- Changes
636+
- Analytics: Added support for default parameters to be sent with each event.
637+
This change lets you use `SetDefaultEventParameters` to set default
638+
parameters to be sent with each event.
639+
- General (iOS): Update to Firebase Cocoapods version 11.9.0.
640+
- General (Android): Update to Firebase Android BoM version 33.10.0.
641+
634642
### 12.6.0
635643
- Changes
636644
- General (iOS): Update to Firebase Cocoapods version 11.8.1.

0 commit comments

Comments
 (0)
0