diff --git a/analytics/src/swig/analytics.i b/analytics/src/swig/analytics.i index 13b8bd8e..f49be9cd 100644 --- a/analytics/src/swig/analytics.i +++ b/analytics/src/swig/analytics.i @@ -21,6 +21,8 @@ %{#include "app/src/export_fix.h"%} #endif +%include "std_map.i" + %pragma(csharp) moduleclassmodifiers="public sealed class" %pragma(csharp) modulecode=%{ // Hold a reference to the default app when methods from this module are @@ -45,6 +47,11 @@ #include "analytics/src/include/firebase/analytics/user_property_names.h" %} +%rename(kConsentTypeAdStorage) firebase::analytics::kConsentTypeAdStorage; +%rename(kConsentTypeAnalyticsStorage) firebase::analytics::kConsentTypeAnalyticsStorage; +%rename(kConsentStatusGranted) firebase::analytics::kConsentStatusGranted; +%rename(kConsentStatusDenied) firebase::analytics::kConsentStatusDenied; + // Constant renaming must happen before SWIG_CONSTANT_HEADERS is included. %rename(kParameterAchievementId) firebase::analytics::kParameterAchievementID; %rename(kParameterGroupId) firebase::analytics::kParameterGroupID; @@ -231,6 +238,9 @@ class ParameterCopy : private firebase::analytics::Parameter { // Initialize / Terminate implicitly called when App is created / destroyed. %ignore Initialize; %ignore Terminate; +// SetConsent handled via SetConsentInternal below. +%ignore SetConsent; + } // namespace analytics } // namespace firebase @@ -278,5 +288,49 @@ class ParameterCopy : private firebase::analytics::Parameter { } %} - %include "analytics/src/include/firebase/analytics.h" + +%rename(ConsentType) firebase::analytics::ConsentType; +%rename(ConsentStatus) firebase::analytics::ConsentStatus; +// Add a swig C++ function to call into the Analytics C++ implementation. +%{ +namespace firebase { +namespace analytics { + + void SetConsentInternal(std::map *ptr) { + firebase::analytics::SetConsent(*ptr); + } + +} // namespace analytics +} // namespace firebase +%} +// The definition on the C++ side, so that swig is aware of the function's existence. +void SetConsentInternal(std::map *ptr); + +%typemap(csclassmodifiers) firebase::analytics::ConsentType "enum"; +%typemap(csclassmodifiers) firebase::analytics::ConsentStatus "enum"; + +%typemap(csclassmodifiers) std::map "internal class" +%template(ConsentMap) std::map; + +namespace firebase { +namespace analytics { + +%pragma(csharp) modulecode=%{ + /// @brief Sets the applicable end user consent state (e.g., for device + /// identifiers) for this app on this device. + /// + /// Use the consent map to specify individual consent type values. Settings are + /// persisted across app sessions. By default consent types are set to + /// "granted". + public static void SetConsent(System.Collections.Generic.IDictionary consentSettings) { + ConsentMap consentSettingsMap = new ConsentMap(); + foreach(var kv in consentSettings) { + consentSettingsMap[kv.Key] = kv.Value; + } + SetConsentInternal(consentSettingsMap); + } +%} + +} // namespace analytics +} // namespace firebase diff --git a/analytics/testapp/Assets/Firebase/Sample/Analytics/UIHandler.cs b/analytics/testapp/Assets/Firebase/Sample/Analytics/UIHandler.cs index 999b2a23..a2f8293e 100644 --- a/analytics/testapp/Assets/Firebase/Sample/Analytics/UIHandler.cs +++ b/analytics/testapp/Assets/Firebase/Sample/Analytics/UIHandler.cs @@ -17,6 +17,7 @@ namespace Firebase.Sample.Analytics { using Firebase.Analytics; using Firebase.Extensions; using System; + using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; @@ -121,6 +122,20 @@ public void ResetAnalyticsData() { FirebaseAnalytics.ResetAnalyticsData(); } + public void AnalyticsSetConsent() { + FirebaseAnalytics.SetConsent(new Dictionary() + { + { ConsentType.AnalyticsStorage, ConsentStatus.Denied }, + { ConsentType.AdStorage, ConsentStatus.Denied } + }); + FirebaseAnalytics.SetConsent(new Dictionary()); + FirebaseAnalytics.SetConsent(new Dictionary() + { + { ConsentType.AnalyticsStorage, ConsentStatus.Granted }, + { ConsentType.AdStorage, ConsentStatus.Granted } + }); + } + // Get the current app instance ID. public Task DisplayAnalyticsInstanceId() { return FirebaseAnalytics.GetAnalyticsInstanceIdAsync().ContinueWithOnMainThread(task => { @@ -192,6 +207,9 @@ void GUIDisplayControls() { if (GUILayout.Button("Show Analytics Instance ID")) { DisplayAnalyticsInstanceId(); } + if (GUILayout.Button("Test SetConsent")) { + AnalyticsSetConsent(); + } GUILayout.EndVertical(); GUILayout.EndScrollView(); } diff --git a/analytics/testapp/Assets/Firebase/Sample/Analytics/UIHandlerAutomated.cs b/analytics/testapp/Assets/Firebase/Sample/Analytics/UIHandlerAutomated.cs index 6db2bb57..ab78d7b4 100644 --- a/analytics/testapp/Assets/Firebase/Sample/Analytics/UIHandlerAutomated.cs +++ b/analytics/testapp/Assets/Firebase/Sample/Analytics/UIHandlerAutomated.cs @@ -30,6 +30,7 @@ public override void Start() { TestAnalyticsScoreDoesNotThrow, TestAnalyticsGroupJoinDoesNotThrow, TestAnalyticsLevelUpDoesNotThrow, + TestAnalyticsSetConsentDoesNotThrow, TestInstanceIdChangeAfterReset, TestResetAnalyticsData, // Temporarily disabled until this test is deflaked. b/143603151 @@ -87,6 +88,12 @@ Task TestAnalyticsLevelUpDoesNotThrow() { }); } + Task TestAnalyticsSetConsentDoesNotThrow() { + return WrapWithTask(() => { + base.AnalyticsSetConsent(); + return true; + }); + } Task TestCheckAndFixDependenciesInvalidOperation() { // Only run the test on Android, as CheckAndFixDependenciesAsync is short // lived on other platforms, and thus could finish before the extra call.