Skip to content

Commit b6da98c

Browse files
Add SetDefaultEventParameters and ClearDefaultEventParameters to Analytics
This change introduces two new C++ Analytics SDK functions: - `SetDefaultEventParameters(const std::map<std::string, firebase::Variant>& params)`: Allows setting default parameters (string, int64, double, bool, null) that will be included in all subsequent `LogEvent` calls. If a `firebase::Variant::Null()` is provided for a key, that specific default parameter will be cleared. Aggregate types (maps, vectors) are not supported and will be skipped with an error logged. - `ClearDefaultEventParameters()`: Clears all currently set default event parameters. Platform implementations: - iOS: Uses `[FIRAnalytics setDefaultEventParameters:]`. `firebase::Variant::Null()` maps to `[NSNull null]`. Unsupported types are skipped. - Android: Uses `FirebaseAnalytics.setDefaultEventParameters(Bundle)`. `firebase::Variant::Null()` results in `Bundle.putString(key, null)`. Unsupported types are skipped. `AddVariantToBundle` is used for efficiency with scalar types. - Stub: Implemented as no-ops. Unit tests and integration tests have been reviewed and updated to cover these functionalities and type constraints.
1 parent 032dc37 commit b6da98c

File tree

2 files changed

+36
-24
lines changed

2 files changed

+36
-24
lines changed

analytics/src/analytics_android.cc

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -627,26 +627,39 @@ void SetDefaultEventParameters(
627627
}
628628

629629
for (const auto& pair : default_parameters) {
630-
jstring key_jstring = env->NewStringUTF(pair.first.c_str());
631-
if (util::CheckAndClearJniExceptions(env) || !key_jstring) {
632-
LogError("Failed to create jstring for key: %s", pair.first.c_str());
633-
if (key_jstring) env->DeleteLocalRef(key_jstring);
634-
continue;
635-
}
636-
637-
if (pair.second.is_null()) {
638-
// Equivalent to Bundle.putString(String key, String value) with value as null.
639-
env->CallVoidMethod(bundle, util::bundle::GetMethodId(util::bundle::kPutString),
640-
key_jstring, nullptr);
641-
if (util::CheckAndClearJniExceptions(env)) {
642-
LogError("Failed to put null string for key: %s", pair.first.c_str());
643-
}
630+
const firebase::Variant& value = pair.second;
631+
const char* key_cstr = pair.first.c_str();
632+
633+
if (value.is_null()) {
634+
jstring key_jstring = env->NewStringUTF(key_cstr);
635+
if (util::CheckAndClearJniExceptions(env) || !key_jstring) {
636+
LogError("SetDefaultEventParameters: Failed to create jstring for null value key: %s", key_cstr);
637+
if (key_jstring) env->DeleteLocalRef(key_jstring);
638+
continue;
639+
}
640+
env->CallVoidMethod(bundle, util::bundle::GetMethodId(util::bundle::kPutString),
641+
key_jstring, nullptr);
642+
if (util::CheckAndClearJniExceptions(env)) {
643+
LogError("SetDefaultEventParameters: Failed to put null string for key: %s", key_cstr);
644+
}
645+
env->DeleteLocalRef(key_jstring);
646+
} else if (value.is_string() || value.is_int64() || value.is_double() || value.is_bool()) {
647+
// AddVariantToBundle handles these types and their JNI conversions.
648+
// It also logs if an individual AddToBundle within it fails or if a type is unsupported by it.
649+
if (!AddVariantToBundle(env, bundle, key_cstr, value)) {
650+
// This specific log gives context that the failure happened during SetDefaultEventParameters
651+
// for a type that was expected to be supported by AddVariantToBundle.
652+
LogError("SetDefaultEventParameters: Failed to add parameter for key '%s' with supported type '%s'. This might indicate a JNI issue during conversion.",
653+
key_cstr, firebase::Variant::TypeName(value.type()));
654+
}
655+
} else if (value.is_vector() || value.is_map()) {
656+
LogError("SetDefaultEventParameters: Value for key '%s' has type '%s' which is not supported for default event parameters. Only string, int64, double, bool, and null are supported. Skipping.",
657+
key_cstr, firebase::Variant::TypeName(value.type()));
644658
} else {
645-
if (!AddVariantToBundle(env, bundle, pair.first.c_str(), pair.second)) {
646-
// AddVariantToBundle already logs errors for unsupported types.
647-
}
659+
// This case handles other fundamental Variant types that are not scalars and not vector/map.
660+
LogError("SetDefaultEventParameters: Value for key '%s' has an unexpected and unsupported type '%s'. Skipping.",
661+
key_cstr, firebase::Variant::TypeName(value.type()));
648662
}
649-
env->DeleteLocalRef(key_jstring);
650663
}
651664

652665
env->CallVoidMethod(g_analytics_class_instance,

analytics/src/analytics_ios.mm

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -392,13 +392,12 @@ void SetDefaultEventParameters(
392392
[ns_default_parameters setObject:SafeString(value.string_value()) forKey:key];
393393
} else if (value.is_bool()) {
394394
[ns_default_parameters setObject:[NSNumber numberWithBool:value.bool_value()] forKey:key];
395+
} else if (value.is_vector() || value.is_map()) {
396+
LogError("SetDefaultEventParameters: Value for key '%s' has type '%s' which is not supported for default event parameters. Only string, int64, double, bool, and null are supported. Skipping.",
397+
pair.first.c_str(), firebase::Variant::TypeName(value.type()));
395398
} else {
396-
// Log an error for unsupported types.
397-
// Note: FIRAnalytics.setDefaultEventParameters only supports NSNumber, NSString, NSNull.
398-
// It does not support nested collections (NSArray, NSDictionary) unlike LogEvent.
399-
LogError("SetDefaultEventParameters: Unsupported Variant type (%s) for key %s. "
400-
"Only Int64, Double, String, Bool, and Null are supported for default event parameters.",
401-
firebase::Variant::TypeName(value.type()), pair.first.c_str());
399+
LogError("SetDefaultEventParameters: Value for key '%s' has an unexpected type '%s' which is not supported. Skipping.",
400+
pair.first.c_str(), firebase::Variant::TypeName(value.type()));
402401
}
403402
}
404403
[FIRAnalytics setDefaultEventParameters:ns_default_parameters];

0 commit comments

Comments
 (0)