From 1e138812f2eef9560f728723110d8206f3571b7e Mon Sep 17 00:00:00 2001 From: Muccy Date: Tue, 23 May 2023 14:48:06 +0200 Subject: [PATCH 01/11] Adding extra parameters to `AnalyticsEventItem` --- .../lib/src/analytics_event_item.dart | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/firebase_analytics/firebase_analytics_platform_interface/lib/src/analytics_event_item.dart b/packages/firebase_analytics/firebase_analytics_platform_interface/lib/src/analytics_event_item.dart index 427a4cdef6a0..f990df0b816b 100644 --- a/packages/firebase_analytics/firebase_analytics_platform_interface/lib/src/analytics_event_item.dart +++ b/packages/firebase_analytics/firebase_analytics_platform_interface/lib/src/analytics_event_item.dart @@ -30,6 +30,7 @@ class AnalyticsEventItem { this.promotionId, this.promotionName, this.quantity, + this.parameters, }); /// A product affiliation to designate a supplying company or brick and @@ -131,9 +132,15 @@ class AnalyticsEventItem { /// e.g. 1 final int? quantity; + /// Extra parameters to pass along default ones + /// + /// Only strings and numbers are correctly handled by Google Analytics + final Map? parameters; + /// Returns the current instance as a [Map]. Map asMap() { return { + if (parameters != null) ...parameters!, if (affiliation != null) 'affiliation': affiliation, if (currency != null) 'currency': currency, if (coupon != null) 'coupon': coupon, From bdd036b840a33bc0816e1b19c0c73da637b5f5ef Mon Sep 17 00:00:00 2001 From: Muccy Date: Tue, 23 May 2023 14:57:51 +0200 Subject: [PATCH 02/11] Overriding `firebase_analytics_platform_interface` for debugging purposes --- packages/firebase_analytics/firebase_analytics/pubspec.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/firebase_analytics/firebase_analytics/pubspec.yaml b/packages/firebase_analytics/firebase_analytics/pubspec.yaml index 99a836dc8029..ab5049cc93a9 100755 --- a/packages/firebase_analytics/firebase_analytics/pubspec.yaml +++ b/packages/firebase_analytics/firebase_analytics/pubspec.yaml @@ -25,6 +25,10 @@ dev_dependencies: flutter_test: sdk: flutter +dependency_overrides: + firebase_analytics_platform_interface: + path: ../firebase_analytics_platform_interface + flutter: plugin: platforms: From 6d5444b57445a1688184d03e855736c0c641e132 Mon Sep 17 00:00:00 2001 From: Muccy Date: Tue, 23 May 2023 17:32:53 +0200 Subject: [PATCH 03/11] Override `firebase_analytics_platform_interface` using Git --- packages/firebase_analytics/firebase_analytics/pubspec.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/firebase_analytics/firebase_analytics/pubspec.yaml b/packages/firebase_analytics/firebase_analytics/pubspec.yaml index ab5049cc93a9..867c011afc00 100755 --- a/packages/firebase_analytics/firebase_analytics/pubspec.yaml +++ b/packages/firebase_analytics/firebase_analytics/pubspec.yaml @@ -27,7 +27,9 @@ dev_dependencies: dependency_overrides: firebase_analytics_platform_interface: - path: ../firebase_analytics_platform_interface + git: + url: https://github.com/marcomagno/flutterfire.git + path: packages/firebase_analytics/firebase_analytics_platform_interface flutter: plugin: From 86ca96896e38586fa63287002a046f8bf64ce472 Mon Sep 17 00:00:00 2001 From: Muccy Date: Tue, 23 May 2023 17:34:13 +0200 Subject: [PATCH 04/11] Adding `parameters` to every `log*` method --- .../lib/src/firebase_analytics.dart | 249 ++++++++++++++++-- 1 file changed, 226 insertions(+), 23 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart index 18fb7ae4b489..378a57520377 100755 --- a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart +++ b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart @@ -6,8 +6,7 @@ part of firebase_analytics; /// Firebase Analytics API. class FirebaseAnalytics extends FirebasePluginPlatform { - FirebaseAnalytics._({required this.app}) - : super(app.name, 'plugins.flutter.io/firebase_analytics'); + FirebaseAnalytics._({required this.app}) : super(app.name, 'plugins.flutter.io/firebase_analytics'); /// Namespace for analytics API available on Android only. This is deprecated in favor of /// `FirebaseAnalytics.instance.setSessionTimeoutDuration()`. @@ -24,9 +23,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { 'Android namespace will be removed in a future release. Please use FirebaseAnalytics.instance.setSessionTimeoutDuration()', ) final FirebaseAnalyticsAndroid? android = - defaultTargetPlatform == TargetPlatform.android && !kIsWeb - ? FirebaseAnalyticsAndroid() - : null; + defaultTargetPlatform == TargetPlatform.android && !kIsWeb ? FirebaseAnalyticsAndroid() : null; static Map _firebaseAnalyticsInstances = {}; @@ -36,8 +33,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { FirebaseAnalyticsPlatform? _delegatePackingProperty; FirebaseAnalyticsPlatform get _delegate { - return _delegatePackingProperty ??= - FirebaseAnalyticsPlatform.instanceFor(app: app); + return _delegatePackingProperty ??= FirebaseAnalyticsPlatform.instanceFor(app: app); } /// Returns an instance using a specified [FirebaseApp]. @@ -110,12 +106,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { }) async { _logEventNameValidation(name); - parameters?.forEach((key, value) { - assert( - value is String || value is num, - "'string' OR 'number' must be set as the value of the parameter: $key", - ); - }); + _assertParameterTypesAreCorrect(parameters); await _delegate.logEvent( name: name, @@ -219,10 +210,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { required String? value, AnalyticsCallOptions? callOptions, }) async { - if (name.isEmpty || - name.length > 24 || - name.indexOf(_alpha) != 0 || - name.contains(_nonAlphaNumeric)) { + if (name.isEmpty || name.length > 24 || name.indexOf(_alpha) != 0 || name.contains(_nonAlphaNumeric)) { throw ArgumentError.value( name, 'name', @@ -258,11 +246,19 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? paymentType, double? value, List? items, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'add_payment_info', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _COUPON: coupon, _CURRENCY: currency, _PAYMENT_TYPE: paymentType, @@ -285,11 +281,19 @@ class FirebaseAnalytics extends FirebasePluginPlatform { double? value, String? shippingTier, List? items, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'add_shipping_info', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _COUPON: coupon, _CURRENCY: currency, _SHIPPING_TIER: shippingTier, @@ -311,13 +315,21 @@ class FirebaseAnalytics extends FirebasePluginPlatform { List? items, double? value, String? currency, + Map? parameters, AnalyticsCallOptions? callOptions, }) { _requireValueAndCurrencyTogether(value, currency); + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'add_to_cart', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _ITEMS: _marshalItems(items), _VALUE: value, _CURRENCY: currency, @@ -338,13 +350,21 @@ class FirebaseAnalytics extends FirebasePluginPlatform { List? items, double? value, String? currency, + Map? parameters, AnalyticsCallOptions? callOptions, }) { _requireValueAndCurrencyTogether(value, currency); + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'add_to_wishlist', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _ITEMS: _marshalItems(items), _VALUE: value, _CURRENCY: currency, @@ -420,13 +440,17 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? adUnitName, double? value, String? currency, + Map? parameters, AnalyticsCallOptions? callOptions, }) { _requireValueAndCurrencyTogether(value, currency); + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'ad_impression', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _AD_PLATFORM: adPlatform, _AD_SOURCE: adSource, _AD_FORMAT: adFormat, @@ -441,9 +465,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// Logs the standard `app_open` event. /// /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#APP_OPEN - Future logAppOpen({AnalyticsCallOptions? callOptions}) { + Future logAppOpen({ + AnalyticsCallOptions? callOptions, + Map? parameters, + }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'app_open', + parameters: parameters, callOptions: callOptions, ); } @@ -460,13 +490,21 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? currency, List? items, String? coupon, + Map? parameters, AnalyticsCallOptions? callOptions, }) { _requireValueAndCurrencyTogether(value, currency); + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'begin_checkout', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _VALUE: value, _CURRENCY: currency, _ITEMS: _marshalItems(items), @@ -489,11 +527,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? content, String? aclid, String? cp1, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'campaign_details', - parameters: filterOutNulls({ + parameters: filterOutNulls({ + if (parameters != null) ...parameters, _SOURCE: source, _MEDIUM: medium, _CAMPAIGN: campaign, @@ -516,11 +558,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Future logEarnVirtualCurrency({ required String virtualCurrencyName, required num value, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'earn_virtual_currency', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _VIRTUAL_CURRENCY_NAME: virtualCurrencyName, _VALUE: value, }), @@ -603,13 +649,17 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Future logGenerateLead({ String? currency, double? value, + Map? parameters, AnalyticsCallOptions? callOptions, }) { _requireValueAndCurrencyTogether(value, currency); + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'generate_lead', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CURRENCY: currency, _VALUE: value, }), @@ -626,11 +676,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#JOIN_GROUP Future logJoinGroup({ required String groupId, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'join_group', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _GROUP_ID: groupId, }), callOptions: callOptions, @@ -647,11 +701,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Future logLevelUp({ required int level, String? character, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'level_up', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _LEVEL: level, _CHARACTER: character, }), @@ -664,11 +722,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#LEVEL_START Future logLevelStart({ required String levelName, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'level_start', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _LEVEL_NAME: levelName, }), callOptions: callOptions, @@ -681,11 +743,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Future logLevelEnd({ required String levelName, int? success, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'level_end', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _LEVEL_NAME: levelName, _SUCCESS: success, }), @@ -698,10 +764,14 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Future logSetCheckoutOption({ required int checkoutStep, required String checkoutOption, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'set_checkout_option', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CHECKOUT_STEP: checkoutStep, _CHECKOUT_OPTION: checkoutOption, }), @@ -716,11 +786,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#LOGIN Future logLogin({ String? loginMethod, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'login', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _METHOD: loginMethod, }), callOptions: callOptions, @@ -739,11 +813,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { required int score, int? level, String? character, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'post_score', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _SCORE: score, _LEVEL: level, _CHARACTER: character, @@ -768,13 +846,21 @@ class FirebaseAnalytics extends FirebasePluginPlatform { double? shipping, String? transactionId, String? affiliation, + Map? parameters, AnalyticsCallOptions? callOptions, }) { _requireValueAndCurrencyTogether(value, currency); + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'purchase', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CURRENCY: currency, _COUPON: coupon, _VALUE: value, @@ -797,13 +883,21 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? currency, double? value, List? items, + Map? parameters, AnalyticsCallOptions? callOptions, }) { _requireValueAndCurrencyTogether(value, currency); + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'remove_from_cart', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CURRENCY: currency, _VALUE: value, _ITEMS: _marshalItems(items), @@ -820,11 +914,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Future logScreenView({ String? screenClass, String? screenName, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'screen_view', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _SCREEN_CLASS: screenClass, _SCREEN_NAME: screenName, }), @@ -841,11 +939,19 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? itemListId, String? itemListName, List? items, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'select_item', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _ITEM_LIST_ID: itemListId, _ITEM_LIST_NAME: itemListName, _ITEMS: _marshalItems(items), @@ -866,11 +972,19 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? locationId, String? promotionId, String? promotionName, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'select_promotion', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CREATIVE_NAME: creativeName, _CREATIVE_SLOT: creativeSlot, _ITEMS: _marshalItems(items), @@ -891,11 +1005,19 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? currency, double? value, List? items, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'view_cart', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CURRENCY: currency, _VALUE: value, _ITEMS: _marshalItems(items), @@ -921,12 +1043,16 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? startDate, String? endDate, String? travelClass, + Map? parameters, AnalyticsCallOptions? callOptions, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'search', parameters: filterOutNulls( { + if (parameters != null) ...parameters, _SEARCH_TERM: searchTerm, _NUMBER_OF_NIGHTS: numberOfNights, _NUMBER_OF_ROOMS: numberOfRooms, @@ -953,10 +1079,14 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Future logSelectContent({ required String contentType, required String itemId, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'select_content', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CONTENT_TYPE: contentType, _ITEM_ID: itemId, }), @@ -973,10 +1103,14 @@ class FirebaseAnalytics extends FirebasePluginPlatform { required String contentType, required String itemId, required String method, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'share', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CONTENT_TYPE: contentType, _ITEM_ID: itemId, _METHOD: method, @@ -994,10 +1128,14 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#SIGN_UP Future logSignUp({ required String signUpMethod, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'sign_up', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _METHOD: signUpMethod, }), ); @@ -1013,10 +1151,14 @@ class FirebaseAnalytics extends FirebasePluginPlatform { required String itemName, required String virtualCurrencyName, required num value, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'spend_virtual_currency', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _ITEM_NAME: itemName, _VIRTUAL_CURRENCY_NAME: virtualCurrencyName, _VALUE: value, @@ -1031,8 +1173,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// users complete this process and move on to the full app experience. /// /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#TUTORIAL_BEGIN - Future logTutorialBegin() { - return _delegate.logEvent(name: 'tutorial_begin'); + Future logTutorialBegin({ + Map? parameters, + }) { + _assertParameterTypesAreCorrect(parameters); + + return _delegate.logEvent( + name: 'tutorial_begin', + parameters: parameters, + ); } /// Logs the standard `tutorial_complete` event. @@ -1042,8 +1191,15 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// completion rate of your on-boarding process. /// /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#TUTORIAL_COMPLETE - Future logTutorialComplete() { - return _delegate.logEvent(name: 'tutorial_complete'); + Future logTutorialComplete({ + Map? parameters, + }) { + _assertParameterTypesAreCorrect(parameters); + + return _delegate.logEvent( + name: 'tutorial_complete', + parameters: parameters, + ); } /// Logs the standard `unlock_achievement` event with a given achievement @@ -1057,10 +1213,14 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#UNLOCK_ACHIEVEMENT Future logUnlockAchievement({ required String id, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'unlock_achievement', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _ACHIEVEMENT_ID: id, }), ); @@ -1080,12 +1240,20 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? currency, double? value, List? items, + Map? parameters, }) { _requireValueAndCurrencyTogether(value, currency); + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'view_item', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CURRENCY: currency, _VALUE: value, _ITEMS: _marshalItems(items), @@ -1103,10 +1271,18 @@ class FirebaseAnalytics extends FirebasePluginPlatform { List? items, String? itemListId, String? itemListName, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'view_item_list', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _ITEMS: _marshalItems(items), _ITEM_LIST_ID: itemListId, _ITEM_LIST_NAME: itemListName, @@ -1126,10 +1302,18 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? locationId, String? promotionId, String? promotionName, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'view_promotion', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CREATIVE_NAME: creativeName, _CREATIVE_SLOT: creativeSlot, _ITEMS: _marshalItems(items), @@ -1148,10 +1332,14 @@ class FirebaseAnalytics extends FirebasePluginPlatform { /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html#VIEW_SEARCH_RESULTS Future logViewSearchResults({ required String searchTerm, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + return _delegate.logEvent( name: 'view_search_results', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _SEARCH_TERM: searchTerm, }), ); @@ -1171,10 +1359,18 @@ class FirebaseAnalytics extends FirebasePluginPlatform { String? transactionId, String? affiliation, List? items, + Map? parameters, }) { + _assertParameterTypesAreCorrect(parameters); + + items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + return _delegate.logEvent( name: 'refund', parameters: filterOutNulls({ + if (parameters != null) ...parameters, _CURRENCY: currency, _COUPON: coupon, _VALUE: value, @@ -1261,6 +1457,13 @@ List>? _marshalItems(List? items) { return items.map((AnalyticsEventItem item) => item.asMap()).toList(); } +void _assertParameterTypesAreCorrect(Map? parameters) => parameters?.forEach((key, value) { + assert( + value is String || value is num, + "'string' OR 'number' must be set as the value of the parameter: $key. $value found instead", + ); + }); + /// Reserved event names that cannot be used. /// /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html From 4783d67db630588e7ed1f9fa7dd93468aab0e094 Mon Sep 17 00:00:00 2001 From: Muccy Date: Fri, 26 May 2023 09:15:09 +0200 Subject: [PATCH 05/11] `firebase_analytics_platform_interface` is now properly commanded by melos --- packages/firebase_analytics/firebase_analytics/pubspec.yaml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/pubspec.yaml b/packages/firebase_analytics/firebase_analytics/pubspec.yaml index 867c011afc00..99a836dc8029 100755 --- a/packages/firebase_analytics/firebase_analytics/pubspec.yaml +++ b/packages/firebase_analytics/firebase_analytics/pubspec.yaml @@ -25,12 +25,6 @@ dev_dependencies: flutter_test: sdk: flutter -dependency_overrides: - firebase_analytics_platform_interface: - git: - url: https://github.com/marcomagno/flutterfire.git - path: packages/firebase_analytics/firebase_analytics_platform_interface - flutter: plugin: platforms: From a2bc02c6b109e25dbbad1d9042ac98b4fddf599a Mon Sep 17 00:00:00 2001 From: Muccy Date: Fri, 16 Jun 2023 15:34:16 +0200 Subject: [PATCH 06/11] `parameters` trump data with same label --- .../lib/src/firebase_analytics.dart | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart index 378a57520377..6435503c2792 100755 --- a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart +++ b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart @@ -258,12 +258,12 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'add_payment_info', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _COUPON: coupon, _CURRENCY: currency, _PAYMENT_TYPE: paymentType, _VALUE: value, _ITEMS: _marshalItems(items), + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -293,12 +293,12 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'add_shipping_info', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _COUPON: coupon, _CURRENCY: currency, _SHIPPING_TIER: shippingTier, _VALUE: value, _ITEMS: _marshalItems(items), + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -329,10 +329,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'add_to_cart', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _ITEMS: _marshalItems(items), _VALUE: value, _CURRENCY: currency, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -364,10 +364,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'add_to_wishlist', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _ITEMS: _marshalItems(items), _VALUE: value, _CURRENCY: currency, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -450,13 +450,13 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'ad_impression', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _AD_PLATFORM: adPlatform, _AD_SOURCE: adSource, _AD_FORMAT: adFormat, _AD_UNIT_NAME: adUnitName, _VALUE: value, _CURRENCY: currency, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -504,11 +504,11 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'begin_checkout', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _VALUE: value, _CURRENCY: currency, _ITEMS: _marshalItems(items), _COUPON: coupon, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -535,7 +535,6 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'campaign_details', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _SOURCE: source, _MEDIUM: medium, _CAMPAIGN: campaign, @@ -543,6 +542,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _CONTENT: content, _ACLID: aclid, _CP1: cp1, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -566,9 +566,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'earn_virtual_currency', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _VIRTUAL_CURRENCY_NAME: virtualCurrencyName, _VALUE: value, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -659,9 +659,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'generate_lead', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CURRENCY: currency, _VALUE: value, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -684,8 +684,8 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'join_group', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _GROUP_ID: groupId, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -709,9 +709,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'level_up', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _LEVEL: level, _CHARACTER: character, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -730,8 +730,8 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'level_start', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _LEVEL_NAME: levelName, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -751,9 +751,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'level_end', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _LEVEL_NAME: levelName, _SUCCESS: success, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -771,9 +771,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'set_checkout_option', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CHECKOUT_STEP: checkoutStep, _CHECKOUT_OPTION: checkoutOption, + if (parameters != null) ...parameters, }), ); } @@ -794,8 +794,8 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'login', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _METHOD: loginMethod, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -821,10 +821,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'post_score', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _SCORE: score, _LEVEL: level, _CHARACTER: character, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -860,7 +860,6 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'purchase', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CURRENCY: currency, _COUPON: coupon, _VALUE: value, @@ -869,6 +868,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _SHIPPING: shipping, _TRANSACTION_ID: transactionId, _AFFILIATION: affiliation, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -897,10 +897,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'remove_from_cart', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CURRENCY: currency, _VALUE: value, _ITEMS: _marshalItems(items), + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -922,9 +922,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'screen_view', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _SCREEN_CLASS: screenClass, _SCREEN_NAME: screenName, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -951,10 +951,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'select_item', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _ITEM_LIST_ID: itemListId, _ITEM_LIST_NAME: itemListName, _ITEMS: _marshalItems(items), + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -984,13 +984,13 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'select_promotion', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CREATIVE_NAME: creativeName, _CREATIVE_SLOT: creativeSlot, _ITEMS: _marshalItems(items), _LOCATION_ID: locationId, _PROMOTION_ID: promotionId, _PROMOTION_NAME: promotionName, + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -1017,10 +1017,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'view_cart', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CURRENCY: currency, _VALUE: value, _ITEMS: _marshalItems(items), + if (parameters != null) ...parameters, }), callOptions: callOptions, ); @@ -1052,7 +1052,6 @@ class FirebaseAnalytics extends FirebasePluginPlatform { name: 'search', parameters: filterOutNulls( { - if (parameters != null) ...parameters, _SEARCH_TERM: searchTerm, _NUMBER_OF_NIGHTS: numberOfNights, _NUMBER_OF_ROOMS: numberOfRooms, @@ -1062,6 +1061,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _START_DATE: startDate, _END_DATE: endDate, _TRAVEL_CLASS: travelClass, + if (parameters != null) ...parameters, }, ), callOptions: callOptions, @@ -1086,9 +1086,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'select_content', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CONTENT_TYPE: contentType, _ITEM_ID: itemId, + if (parameters != null) ...parameters, }), ); } @@ -1110,10 +1110,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'share', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CONTENT_TYPE: contentType, _ITEM_ID: itemId, _METHOD: method, + if (parameters != null) ...parameters, }), ); } @@ -1135,8 +1135,8 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'sign_up', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _METHOD: signUpMethod, + if (parameters != null) ...parameters, }), ); } @@ -1158,10 +1158,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'spend_virtual_currency', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _ITEM_NAME: itemName, _VIRTUAL_CURRENCY_NAME: virtualCurrencyName, _VALUE: value, + if (parameters != null) ...parameters, }), ); } @@ -1220,8 +1220,8 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'unlock_achievement', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _ACHIEVEMENT_ID: id, + if (parameters != null) ...parameters, }), ); } @@ -1253,10 +1253,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'view_item', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CURRENCY: currency, _VALUE: value, _ITEMS: _marshalItems(items), + if (parameters != null) ...parameters, }), ); } @@ -1282,10 +1282,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'view_item_list', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _ITEMS: _marshalItems(items), _ITEM_LIST_ID: itemListId, _ITEM_LIST_NAME: itemListName, + if (parameters != null) ...parameters, }), ); } @@ -1313,13 +1313,13 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'view_promotion', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CREATIVE_NAME: creativeName, _CREATIVE_SLOT: creativeSlot, _ITEMS: _marshalItems(items), _LOCATION_ID: locationId, _PROMOTION_ID: promotionId, _PROMOTION_NAME: promotionName, + if (parameters != null) ...parameters, }), ); } @@ -1339,8 +1339,8 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'view_search_results', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _SEARCH_TERM: searchTerm, + if (parameters != null) ...parameters, }), ); } @@ -1370,7 +1370,6 @@ class FirebaseAnalytics extends FirebasePluginPlatform { return _delegate.logEvent( name: 'refund', parameters: filterOutNulls({ - if (parameters != null) ...parameters, _CURRENCY: currency, _COUPON: coupon, _VALUE: value, @@ -1379,6 +1378,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _TRANSACTION_ID: transactionId, _AFFILIATION: affiliation, _ITEMS: _marshalItems(items), + if (parameters != null) ...parameters, }), ); } From 682a67b88877e4901237a71750c65a6e2b2ff517 Mon Sep 17 00:00:00 2001 From: Muccy Date: Tue, 25 Jul 2023 11:32:29 +0200 Subject: [PATCH 07/11] Adding `parameters` to unit tests --- .../test/firebase_analytics_test.dart | 145 ++++++++++++++---- 1 file changed, 117 insertions(+), 28 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart b/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart index a0b6213a695b..f3bb7ba234ea 100755 --- a/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart +++ b/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter_test/flutter_test.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_core/firebase_core.dart'; +import 'package:flutter_test/flutter_test.dart'; + import './mock.dart'; const String COUPON = 'coupon'; @@ -92,6 +93,7 @@ AnalyticsEventItem ITEM = AnalyticsEventItem( promotionId: 'promotionId', promotionName: 'promotionName', quantity: 1, + parameters: {'a': 'b'}, ); void main() { @@ -149,6 +151,7 @@ void main() { value: VALUE_DOUBLE, items: [ITEM], paymentType: PAYMENT_TYPE, + parameters: {'a': 'b'}, ); expect( methodCallLog, @@ -163,6 +166,7 @@ void main() { PAYMENT_TYPE: PAYMENT_TYPE, VALUE: VALUE_DOUBLE, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -177,6 +181,7 @@ void main() { shippingTier: SHIPPING_TIER, value: VALUE_DOUBLE, items: [ITEM], + parameters: {'a': 'b'}, ); expect( methodCallLog, @@ -191,6 +196,7 @@ void main() { SHIPPING_TIER: SHIPPING_TIER, VALUE: VALUE_DOUBLE, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -203,6 +209,7 @@ void main() { currency: CURRENCY, value: VALUE_DOUBLE, items: [ITEM], + parameters: {'a': 'b'}, ); expect( @@ -216,6 +223,7 @@ void main() { CURRENCY: CURRENCY, VALUE: VALUE_DOUBLE, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -228,6 +236,7 @@ void main() { currency: CURRENCY, value: VALUE_DOUBLE, items: [ITEM], + parameters: {'a': 'b'}, ); expect( @@ -241,6 +250,7 @@ void main() { CURRENCY: CURRENCY, VALUE: VALUE_DOUBLE, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -256,6 +266,7 @@ void main() { adUnitName: AD_UNIT_NAME, currency: CURRENCY, value: VALUE_DOUBLE, + parameters: {'a': 'b'}, ); expect( @@ -272,6 +283,7 @@ void main() { AD_SOURCE: AD_SOURCE, AD_FORMAT: AD_FORMAT, AD_UNIT_NAME: AD_UNIT_NAME, + 'a': 'b', }, }, ) @@ -280,7 +292,9 @@ void main() { }); test('logAppOpen', () async { - await analytics!.logAppOpen(); + await analytics!.logAppOpen( + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -289,7 +303,9 @@ void main() { 'Analytics#logEvent', arguments: { 'eventName': 'app_open', - 'parameters': null + 'parameters': { + 'a': 'b', + }, }, ) ], @@ -302,6 +318,7 @@ void main() { currency: CURRENCY, items: [ITEM], coupon: COUPON, + parameters: {'a': 'b'}, ); expect( @@ -316,6 +333,7 @@ void main() { VALUE: VALUE_DOUBLE, ITEMS: [ITEM.asMap()], COUPON: COUPON, + 'a': 'b', }, }, ) @@ -332,6 +350,7 @@ void main() { content: CONTENT, aclid: ACLID, cp1: CP1, + parameters: {'a': 'b'}, ); expect( @@ -349,6 +368,7 @@ void main() { CONTENT: CONTENT, ACLID: ACLID, CP1: CP1, + 'a': 'b', }, }, ) @@ -360,6 +380,7 @@ void main() { await analytics!.logEarnVirtualCurrency( virtualCurrencyName: VIRTUAL_CURRENCY_NAME, value: VALUE_DOUBLE, + parameters: {'a': 'b'}, ); expect( @@ -372,6 +393,7 @@ void main() { 'parameters': { VALUE: VALUE_DOUBLE, VIRTUAL_CURRENCY_NAME: VIRTUAL_CURRENCY_NAME, + 'a': 'b', }, }, ) @@ -383,6 +405,7 @@ void main() { await analytics!.logGenerateLead( value: VALUE_DOUBLE, currency: CURRENCY, + parameters: {'a': 'b'}, ); expect( @@ -395,6 +418,7 @@ void main() { 'parameters': { VALUE: VALUE_DOUBLE, CURRENCY: CURRENCY, + 'a': 'b', }, }, ) @@ -405,6 +429,7 @@ void main() { test('logJoinGroup', () async { await analytics!.logJoinGroup( groupId: GROUP_ID, + parameters: {'a': 'b'}, ); expect( @@ -416,6 +441,7 @@ void main() { 'eventName': 'join_group', 'parameters': { GROUP_ID: GROUP_ID, + 'a': 'b', }, }, ) @@ -424,7 +450,11 @@ void main() { }); test('logLevelUp', () async { - await analytics!.logLevelUp(level: LEVEL_INT, character: CHARACTER); + await analytics!.logLevelUp( + level: LEVEL_INT, + character: CHARACTER, + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -433,7 +463,11 @@ void main() { 'Analytics#logEvent', arguments: { 'eventName': 'level_up', - 'parameters': {LEVEL: LEVEL_INT, CHARACTER: CHARACTER}, + 'parameters': { + LEVEL: LEVEL_INT, + CHARACTER: CHARACTER, + 'a': 'b', + }, }, ) ], @@ -443,6 +477,7 @@ void main() { test('logLevelStart', () async { await analytics!.logLevelStart( levelName: LEVEL_NAME, + parameters: {'a': 'b'}, ); expect( @@ -454,6 +489,7 @@ void main() { 'eventName': 'level_start', 'parameters': { LEVEL_NAME: LEVEL_NAME, + 'a': 'b', }, }, ) @@ -462,8 +498,11 @@ void main() { }); test('logLevelEnd', () async { - await analytics! - .logLevelEnd(levelName: LEVEL_NAME, success: SUCCESS_INT); + await analytics!.logLevelEnd( + levelName: LEVEL_NAME, + success: SUCCESS_INT, + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -475,6 +514,7 @@ void main() { 'parameters': { LEVEL_NAME: LEVEL_NAME, SUCCESS: SUCCESS_INT, + 'a': 'b', }, }, ) @@ -483,7 +523,10 @@ void main() { }); test('logLogin', () async { - await analytics!.logLogin(loginMethod: METHOD); + await analytics!.logLogin( + loginMethod: METHOD, + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -494,6 +537,7 @@ void main() { 'eventName': 'login', 'parameters': { METHOD: METHOD, + 'a': 'b', }, }, ) @@ -506,6 +550,7 @@ void main() { score: SCORE_INT, level: LEVEL_INT, character: CHARACTER, + parameters: {'a': 'b'}, ); expect( @@ -519,6 +564,7 @@ void main() { LEVEL: LEVEL_INT, SCORE: SCORE_INT, CHARACTER: CHARACTER, + 'a': 'b', }, }, ) @@ -536,6 +582,7 @@ void main() { shipping: SHIPPING_DOUBLE, transactionId: TRANSACTION_ID, affiliation: AFFILIATION, + parameters: {'a': 'b'}, ); expect( @@ -554,6 +601,7 @@ void main() { SHIPPING: SHIPPING_DOUBLE, TRANSACTION_ID: TRANSACTION_ID, AFFILIATION: AFFILIATION, + 'a': 'b', }, }, ) @@ -566,6 +614,7 @@ void main() { currency: CURRENCY, value: VALUE_DOUBLE, items: [ITEM], + parameters: {'a': 'b'}, ); expect( @@ -579,6 +628,7 @@ void main() { CURRENCY: CURRENCY, VALUE: VALUE_DOUBLE, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -590,6 +640,7 @@ void main() { await analytics!.logScreenView( screenClass: SCREEN_CLASS, screenName: SCREEN_NAME, + parameters: {'a': 'b'}, ); expect( @@ -602,6 +653,7 @@ void main() { 'parameters': { SCREEN_CLASS: SCREEN_CLASS, SCREEN_NAME: SCREEN_NAME, + 'a': 'b', }, }, ) @@ -614,6 +666,7 @@ void main() { items: [ITEM], itemListId: ITEM_LIST_ID, itemListName: ITEM_LIST_NAME, + parameters: {'a': 'b'}, ); expect( @@ -627,6 +680,7 @@ void main() { ITEM_LIST_ID: ITEM_LIST_ID, ITEM_LIST_NAME: ITEM_LIST_NAME, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -642,6 +696,7 @@ void main() { locationId: LOCATION_ID, promotionId: PROMOTION_ID, promotionName: PROMOTION_NAME, + parameters: {'a': 'b'}, ); expect( @@ -658,6 +713,7 @@ void main() { PROMOTION_ID: PROMOTION_ID, PROMOTION_NAME: PROMOTION_NAME, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -670,6 +726,7 @@ void main() { currency: CURRENCY, value: VALUE_DOUBLE, items: [ITEM], + parameters: {'a': 'b'}, ); expect( @@ -683,6 +740,7 @@ void main() { CURRENCY: CURRENCY, VALUE: VALUE_DOUBLE, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -701,6 +759,7 @@ void main() { startDate: START_DATE, endDate: END_DATE, travelClass: TRAVEL_CLASS, + parameters: {'a': 'b'}, ); expect( @@ -720,6 +779,7 @@ void main() { START_DATE: START_DATE, END_DATE: END_DATE, TRAVEL_CLASS: TRAVEL_CLASS, + 'a': 'b', }, }, ) @@ -731,6 +791,7 @@ void main() { await analytics!.logSelectContent( contentType: CONTENT_TYPE, itemId: ITEM_ID, + parameters: {'a': 'b'}, ); expect( @@ -743,6 +804,7 @@ void main() { 'parameters': { CONTENT_TYPE: CONTENT_TYPE, ITEM_ID: ITEM_ID, + 'a': 'b', }, }, ) @@ -755,6 +817,7 @@ void main() { contentType: CONTENT_TYPE, itemId: ITEM_ID, method: METHOD, + parameters: {'a': 'b'}, ); expect( @@ -768,6 +831,7 @@ void main() { CONTENT_TYPE: CONTENT_TYPE, ITEM_ID: ITEM_ID, METHOD: METHOD, + 'a': 'b', }, }, ) @@ -776,7 +840,10 @@ void main() { }); test('logSignUp', () async { - await analytics!.logSignUp(signUpMethod: METHOD); + await analytics!.logSignUp( + signUpMethod: METHOD, + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -787,6 +854,7 @@ void main() { 'eventName': 'sign_up', 'parameters': { METHOD: METHOD, + 'a': 'b', }, }, ) @@ -799,6 +867,7 @@ void main() { itemName: ITEM_NAME, virtualCurrencyName: VIRTUAL_CURRENCY_NAME, value: VALUE_DOUBLE, + parameters: {'a': 'b'}, ); expect( @@ -812,6 +881,7 @@ void main() { ITEM_NAME: ITEM_NAME, VIRTUAL_CURRENCY_NAME: VIRTUAL_CURRENCY_NAME, VALUE: VALUE_DOUBLE, + 'a': 'b', }, }, ) @@ -820,7 +890,9 @@ void main() { }); test('logTutorialBegin', () async { - await analytics!.logTutorialBegin(); + await analytics!.logTutorialBegin( + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -829,7 +901,9 @@ void main() { 'Analytics#logEvent', arguments: { 'eventName': 'tutorial_begin', - 'parameters': null, + 'parameters': { + 'a': 'b', + }, }, ) ], @@ -837,7 +911,9 @@ void main() { }); test('logTutorialComplete', () async { - await analytics!.logTutorialComplete(); + await analytics!.logTutorialComplete( + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -846,7 +922,9 @@ void main() { 'Analytics#logEvent', arguments: { 'eventName': 'tutorial_complete', - 'parameters': null + 'parameters': { + 'a': 'b', + }, }, ) ], @@ -854,7 +932,10 @@ void main() { }); test('logUnlockAchievement', () async { - await analytics!.logUnlockAchievement(id: ACHIEVEMENT_ID); + await analytics!.logUnlockAchievement( + id: ACHIEVEMENT_ID, + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -863,7 +944,10 @@ void main() { 'Analytics#logEvent', arguments: { 'eventName': 'unlock_achievement', - 'parameters': {ACHIEVEMENT_ID: ACHIEVEMENT_ID}, + 'parameters': { + ACHIEVEMENT_ID: ACHIEVEMENT_ID, + 'a': 'b', + }, }, ) ], @@ -875,6 +959,7 @@ void main() { currency: CURRENCY, value: VALUE_DOUBLE, items: [ITEM], + parameters: {'a': 'b'}, ); expect( @@ -887,7 +972,8 @@ void main() { 'parameters': { CURRENCY: CURRENCY, VALUE: VALUE_DOUBLE, - ITEMS: [ITEM.asMap()] + ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -900,6 +986,7 @@ void main() { itemListId: ITEM_LIST_ID, itemListName: ITEM_LIST_NAME, items: [ITEM], + parameters: {'a': 'b'}, ); expect( @@ -913,6 +1000,7 @@ void main() { ITEM_LIST_ID: ITEM_LIST_ID, ITEM_LIST_NAME: ITEM_LIST_NAME, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -928,6 +1016,7 @@ void main() { locationId: LOCATION_ID, promotionName: PROMOTION_NAME, promotionId: PROMOTION_ID, + parameters: {'a': 'b'}, ); expect( @@ -944,6 +1033,7 @@ void main() { PROMOTION_NAME: PROMOTION_NAME, PROMOTION_ID: PROMOTION_ID, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -952,7 +1042,10 @@ void main() { }); test('logViewSearchResults', () async { - await analytics!.logViewSearchResults(searchTerm: SEARCH_TERM); + await analytics!.logViewSearchResults( + searchTerm: SEARCH_TERM, + parameters: {'a': 'b'}, + ); expect( methodCallLog, @@ -963,6 +1056,7 @@ void main() { 'eventName': 'view_search_results', 'parameters': { SEARCH_TERM: SEARCH_TERM, + 'a': 'b', }, }, ) @@ -980,6 +1074,7 @@ void main() { shipping: SHIPPING_DOUBLE, affiliation: AFFILIATION, items: [ITEM], + parameters: {'a': 'b'}, ); expect( @@ -998,6 +1093,7 @@ void main() { SHIPPING: SHIPPING_DOUBLE, AFFILIATION: AFFILIATION, ITEMS: [ITEM.asMap()], + 'a': 'b', }, }, ) @@ -1062,11 +1158,7 @@ void main() { group('filter out nulls', () { test('filters out null values', () { - final Map original = { - 'a': 1, - 'b': null, - 'c': 'd' - }; + final Map original = {'a': 1, 'b': null, 'c': 'd'}; final Map filtered = filterOutNulls(original); expect(filtered, isNot(same(original))); @@ -1112,8 +1204,7 @@ void main() { }); test('setUserProperty', () async { - await analytics! - .setUserProperty(name: 'test_name', value: 'test-value'); + await analytics!.setUserProperty(name: 'test_name', value: 'test-value'); expect( methodCallLog, [ @@ -1146,8 +1237,7 @@ void main() { ); // reserved prefix expect( - analytics! - .setUserProperty(name: 'firebase_test', value: 'test-value'), + analytics!.setUserProperty(name: 'firebase_test', value: 'test-value'), throwsArgumentError, ); }); @@ -1168,8 +1258,7 @@ void main() { test( 'setSessionTimeoutDuration', () async { - await analytics! - .setSessionTimeoutDuration(const Duration(milliseconds: 234)); + await analytics!.setSessionTimeoutDuration(const Duration(milliseconds: 234)); expect( methodCallLog, [ From 2ff81c0ca3bf3e85b82ad8feec89da2be3d08b4a Mon Sep 17 00:00:00 2001 From: Muccy Date: Mon, 31 Jul 2023 11:12:38 +0200 Subject: [PATCH 08/11] Running `melos run format` --- .../lib/src/firebase_analytics.dart | 18 +++++++++++++----- .../test/firebase_analytics_test.dart | 15 +++++++++++---- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart index 6435503c2792..9792789ca1f3 100755 --- a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart +++ b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart @@ -6,7 +6,8 @@ part of firebase_analytics; /// Firebase Analytics API. class FirebaseAnalytics extends FirebasePluginPlatform { - FirebaseAnalytics._({required this.app}) : super(app.name, 'plugins.flutter.io/firebase_analytics'); + FirebaseAnalytics._({required this.app}) + : super(app.name, 'plugins.flutter.io/firebase_analytics'); /// Namespace for analytics API available on Android only. This is deprecated in favor of /// `FirebaseAnalytics.instance.setSessionTimeoutDuration()`. @@ -23,7 +24,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { 'Android namespace will be removed in a future release. Please use FirebaseAnalytics.instance.setSessionTimeoutDuration()', ) final FirebaseAnalyticsAndroid? android = - defaultTargetPlatform == TargetPlatform.android && !kIsWeb ? FirebaseAnalyticsAndroid() : null; + defaultTargetPlatform == TargetPlatform.android && !kIsWeb + ? FirebaseAnalyticsAndroid() + : null; static Map _firebaseAnalyticsInstances = {}; @@ -33,7 +36,8 @@ class FirebaseAnalytics extends FirebasePluginPlatform { FirebaseAnalyticsPlatform? _delegatePackingProperty; FirebaseAnalyticsPlatform get _delegate { - return _delegatePackingProperty ??= FirebaseAnalyticsPlatform.instanceFor(app: app); + return _delegatePackingProperty ??= + FirebaseAnalyticsPlatform.instanceFor(app: app); } /// Returns an instance using a specified [FirebaseApp]. @@ -210,7 +214,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { required String? value, AnalyticsCallOptions? callOptions, }) async { - if (name.isEmpty || name.length > 24 || name.indexOf(_alpha) != 0 || name.contains(_nonAlphaNumeric)) { + if (name.isEmpty || + name.length > 24 || + name.indexOf(_alpha) != 0 || + name.contains(_nonAlphaNumeric)) { throw ArgumentError.value( name, 'name', @@ -1457,7 +1464,8 @@ List>? _marshalItems(List? items) { return items.map((AnalyticsEventItem item) => item.asMap()).toList(); } -void _assertParameterTypesAreCorrect(Map? parameters) => parameters?.forEach((key, value) { +void _assertParameterTypesAreCorrect(Map? parameters) => + parameters?.forEach((key, value) { assert( value is String || value is num, "'string' OR 'number' must be set as the value of the parameter: $key. $value found instead", diff --git a/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart b/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart index f3bb7ba234ea..a6b604816738 100755 --- a/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart +++ b/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart @@ -1158,7 +1158,11 @@ void main() { group('filter out nulls', () { test('filters out null values', () { - final Map original = {'a': 1, 'b': null, 'c': 'd'}; + final Map original = { + 'a': 1, + 'b': null, + 'c': 'd' + }; final Map filtered = filterOutNulls(original); expect(filtered, isNot(same(original))); @@ -1204,7 +1208,8 @@ void main() { }); test('setUserProperty', () async { - await analytics!.setUserProperty(name: 'test_name', value: 'test-value'); + await analytics! + .setUserProperty(name: 'test_name', value: 'test-value'); expect( methodCallLog, [ @@ -1237,7 +1242,8 @@ void main() { ); // reserved prefix expect( - analytics!.setUserProperty(name: 'firebase_test', value: 'test-value'), + analytics! + .setUserProperty(name: 'firebase_test', value: 'test-value'), throwsArgumentError, ); }); @@ -1258,7 +1264,8 @@ void main() { test( 'setSessionTimeoutDuration', () async { - await analytics!.setSessionTimeoutDuration(const Duration(milliseconds: 234)); + await analytics! + .setSessionTimeoutDuration(const Duration(milliseconds: 234)); expect( methodCallLog, [ From 0dc12d2023e9af52e392e7647b3c9981f8326c8c Mon Sep 17 00:00:00 2001 From: Muccy Date: Thu, 7 Sep 2023 15:19:29 +0200 Subject: [PATCH 09/11] Introducing `_assertItemsParameterTypesAreCorrect` in order to reduce code duplication --- .../lib/src/firebase_analytics.dart | 92 +++++-------------- 1 file changed, 23 insertions(+), 69 deletions(-) diff --git a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart index 9792789ca1f3..df22a6c8a6e4 100755 --- a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart +++ b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart @@ -6,8 +6,7 @@ part of firebase_analytics; /// Firebase Analytics API. class FirebaseAnalytics extends FirebasePluginPlatform { - FirebaseAnalytics._({required this.app}) - : super(app.name, 'plugins.flutter.io/firebase_analytics'); + FirebaseAnalytics._({required this.app}) : super(app.name, 'plugins.flutter.io/firebase_analytics'); /// Namespace for analytics API available on Android only. This is deprecated in favor of /// `FirebaseAnalytics.instance.setSessionTimeoutDuration()`. @@ -24,9 +23,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { 'Android namespace will be removed in a future release. Please use FirebaseAnalytics.instance.setSessionTimeoutDuration()', ) final FirebaseAnalyticsAndroid? android = - defaultTargetPlatform == TargetPlatform.android && !kIsWeb - ? FirebaseAnalyticsAndroid() - : null; + defaultTargetPlatform == TargetPlatform.android && !kIsWeb ? FirebaseAnalyticsAndroid() : null; static Map _firebaseAnalyticsInstances = {}; @@ -36,8 +33,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { FirebaseAnalyticsPlatform? _delegatePackingProperty; FirebaseAnalyticsPlatform get _delegate { - return _delegatePackingProperty ??= - FirebaseAnalyticsPlatform.instanceFor(app: app); + return _delegatePackingProperty ??= FirebaseAnalyticsPlatform.instanceFor(app: app); } /// Returns an instance using a specified [FirebaseApp]. @@ -214,10 +210,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { required String? value, AnalyticsCallOptions? callOptions, }) async { - if (name.isEmpty || - name.length > 24 || - name.indexOf(_alpha) != 0 || - name.contains(_nonAlphaNumeric)) { + if (name.isEmpty || name.length > 24 || name.indexOf(_alpha) != 0 || name.contains(_nonAlphaNumeric)) { throw ArgumentError.value( name, 'name', @@ -257,10 +250,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { AnalyticsCallOptions? callOptions, }) { _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'add_payment_info', @@ -292,10 +282,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { AnalyticsCallOptions? callOptions, }) { _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'add_shipping_info', @@ -328,10 +315,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _requireValueAndCurrencyTogether(value, currency); _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'add_to_cart', @@ -363,10 +347,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _requireValueAndCurrencyTogether(value, currency); _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'add_to_wishlist', @@ -503,10 +484,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _requireValueAndCurrencyTogether(value, currency); _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'begin_checkout', @@ -859,10 +837,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _requireValueAndCurrencyTogether(value, currency); _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'purchase', @@ -896,10 +871,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _requireValueAndCurrencyTogether(value, currency); _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'remove_from_cart', @@ -950,10 +922,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { AnalyticsCallOptions? callOptions, }) { _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'select_item', @@ -983,10 +952,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { AnalyticsCallOptions? callOptions, }) { _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'select_promotion', @@ -1016,10 +982,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { AnalyticsCallOptions? callOptions, }) { _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'view_cart', @@ -1252,10 +1215,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { _requireValueAndCurrencyTogether(value, currency); _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'view_item', @@ -1281,10 +1241,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Map? parameters, }) { _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'view_item_list', @@ -1312,10 +1269,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Map? parameters, }) { _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'view_promotion', @@ -1369,10 +1323,7 @@ class FirebaseAnalytics extends FirebasePluginPlatform { Map? parameters, }) { _assertParameterTypesAreCorrect(parameters); - - items?.forEach((item) { - _assertParameterTypesAreCorrect(item.parameters); - }); + _assertItemsParameterTypesAreCorrect(items); return _delegate.logEvent( name: 'refund', @@ -1464,14 +1415,17 @@ List>? _marshalItems(List? items) { return items.map((AnalyticsEventItem item) => item.asMap()).toList(); } -void _assertParameterTypesAreCorrect(Map? parameters) => - parameters?.forEach((key, value) { +void _assertParameterTypesAreCorrect(Map? parameters) => parameters?.forEach((key, value) { assert( value is String || value is num, "'string' OR 'number' must be set as the value of the parameter: $key. $value found instead", ); }); +void _assertItemsParameterTypesAreCorrect(List? items) => items?.forEach((item) { + _assertParameterTypesAreCorrect(item.parameters); + }); + /// Reserved event names that cannot be used. /// /// See: https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.Event.html From 9dd31c1cb3ea1ac43ce5828ddf6c71dd055fd8c3 Mon Sep 17 00:00:00 2001 From: Muccy Date: Fri, 10 Nov 2023 18:17:56 +0100 Subject: [PATCH 10/11] melos run format --- .../ios/Classes/FirestorePigeonParser.m | 54 +++++++++---------- .../windows/cloud_firestore_plugin.cpp | 4 +- .../lib/src/firebase_analytics.dart | 21 +++++--- .../test/firebase_analytics_test.dart | 9 ++-- 4 files changed, 50 insertions(+), 38 deletions(-) diff --git a/packages/cloud_firestore/cloud_firestore/ios/Classes/FirestorePigeonParser.m b/packages/cloud_firestore/cloud_firestore/ios/Classes/FirestorePigeonParser.m index 8b983e1f0c0e..e10eb0919d56 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/Classes/FirestorePigeonParser.m +++ b/packages/cloud_firestore/cloud_firestore/ios/Classes/FirestorePigeonParser.m @@ -117,27 +117,27 @@ + (FIRQuery *)parseQueryWithParameters:(nonnull PigeonQueryParameters *)paramete // Limit id limit = parameters.limit; if (limit) { - query = [query queryLimitedTo:((NSNumber *)limit).intValue]; + query = [query queryLimitedTo:((NSNumber *)limit).intValue]; } // Limit To Last id limitToLast = parameters.limitToLast; if (limitToLast) { - query = [query queryLimitedToLast:((NSNumber *)limitToLast).intValue]; + query = [query queryLimitedToLast:((NSNumber *)limitToLast).intValue]; } // Ordering NSArray *orderBy = parameters.orderBy; if (!orderBy) { - // We return early if no ordering set as cursor queries below require at least one orderBy - // set - return query; + // We return early if no ordering set as cursor queries below require at least one orderBy + // set + return query; } for (NSArray *orderByParameters in orderBy) { - FIRFieldPath *fieldPath = (FIRFieldPath *)orderByParameters[0]; - NSNumber *descending = orderByParameters[1]; - query = [query queryOrderedByFieldPath:fieldPath descending:[descending boolValue]]; + FIRFieldPath *fieldPath = (FIRFieldPath *)orderByParameters[0]; + NSNumber *descending = orderByParameters[1]; + query = [query queryOrderedByFieldPath:fieldPath descending:[descending boolValue]]; } // Start At @@ -165,15 +165,15 @@ + (FIRQuery *)parseQueryWithParameters:(nonnull PigeonQueryParameters *)paramete + (FIRFirestoreSource)parseSource:(Source)source { switch (source) { case SourceServerAndCache: - return FIRFirestoreSourceDefault; + return FIRFirestoreSourceDefault; case SourceServer: - return FIRFirestoreSourceServer; + return FIRFirestoreSourceServer; case SourceCache: - return FIRFirestoreSourceCache; + return FIRFirestoreSourceCache; default: - @throw [NSException exceptionWithName:@"Invalid Source" - reason:@"This source is not supported by the SDK" - userInfo:nil]; + @throw [NSException exceptionWithName:@"Invalid Source" + reason:@"This source is not supported by the SDK" + userInfo:nil]; } } @@ -190,16 +190,16 @@ + (FIRServerTimestampBehavior)parseServerTimestampBehavior: (ServerTimestampBehavior)serverTimestampBehavior { switch (serverTimestampBehavior) { case ServerTimestampBehaviorNone: - return FIRServerTimestampBehaviorNone; + return FIRServerTimestampBehaviorNone; case ServerTimestampBehaviorEstimate: - return FIRServerTimestampBehaviorEstimate; + return FIRServerTimestampBehaviorEstimate; case ServerTimestampBehaviorPrevious: - return FIRServerTimestampBehaviorPrevious; + return FIRServerTimestampBehaviorPrevious; default: - @throw [NSException - exceptionWithName:@"Invalid Server Timestamp Behavior" - reason:@"This Server Timestamp Behavior is not supported by the SDK" - userInfo:nil]; + @throw [NSException + exceptionWithName:@"Invalid Server Timestamp Behavior" + reason:@"This Server Timestamp Behavior is not supported by the SDK" + userInfo:nil]; } } @@ -221,15 +221,15 @@ + (PigeonDocumentSnapshot *)toPigeonDocumentSnapshot:(FIRDocumentSnapshot *)docu + (DocumentChangeType)toPigeonDocumentChangeType:(FIRDocumentChangeType)documentChangeType { switch (documentChangeType) { case FIRDocumentChangeTypeAdded: - return DocumentChangeTypeAdded; + return DocumentChangeTypeAdded; case FIRDocumentChangeTypeModified: - return DocumentChangeTypeModified; + return DocumentChangeTypeModified; case FIRDocumentChangeTypeRemoved: - return DocumentChangeTypeRemoved; + return DocumentChangeTypeRemoved; default: - @throw [NSException exceptionWithName:@"InvalidDocumentChangeType" - reason:@"Invalid document change type" - userInfo:nil]; + @throw [NSException exceptionWithName:@"InvalidDocumentChangeType" + reason:@"Invalid document change type" + userInfo:nil]; } } diff --git a/packages/cloud_firestore/cloud_firestore/windows/cloud_firestore_plugin.cpp b/packages/cloud_firestore/cloud_firestore/windows/cloud_firestore_plugin.cpp index b11febd56d16..599bd69ec0f1 100644 --- a/packages/cloud_firestore/cloud_firestore/windows/cloud_firestore_plugin.cpp +++ b/packages/cloud_firestore/cloud_firestore/windows/cloud_firestore_plugin.cpp @@ -2,8 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -#pragma comment(lib, \ - "rpcrt4.lib") // UuidCreate - Minimum supported OS Win 2000 +#pragma comment( \ + lib, "rpcrt4.lib") // UuidCreate - Minimum supported OS Win 2000 #include "cloud_firestore_plugin.h" diff --git a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart index 9357dc4acdf7..ac71155cb103 100755 --- a/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart +++ b/packages/firebase_analytics/firebase_analytics/lib/src/firebase_analytics.dart @@ -6,7 +6,8 @@ part of firebase_analytics; /// Firebase Analytics API. class FirebaseAnalytics extends FirebasePluginPlatform { - FirebaseAnalytics._({required this.app}) : super(app.name, 'plugins.flutter.io/firebase_analytics'); + FirebaseAnalytics._({required this.app}) + : super(app.name, 'plugins.flutter.io/firebase_analytics'); /// Namespace for analytics API available on Android only. This is deprecated in favor of /// `FirebaseAnalytics.instance.setSessionTimeoutDuration()`. @@ -23,7 +24,9 @@ class FirebaseAnalytics extends FirebasePluginPlatform { 'Android namespace will be removed in a future release. Please use FirebaseAnalytics.instance.setSessionTimeoutDuration()', ) final FirebaseAnalyticsAndroid? android = - defaultTargetPlatform == TargetPlatform.android && !kIsWeb ? FirebaseAnalyticsAndroid() : null; + defaultTargetPlatform == TargetPlatform.android && !kIsWeb + ? FirebaseAnalyticsAndroid() + : null; static Map _firebaseAnalyticsInstances = {}; @@ -33,7 +36,8 @@ class FirebaseAnalytics extends FirebasePluginPlatform { FirebaseAnalyticsPlatform? _delegatePackingProperty; FirebaseAnalyticsPlatform get _delegate { - return _delegatePackingProperty ??= FirebaseAnalyticsPlatform.instanceFor(app: app); + return _delegatePackingProperty ??= + FirebaseAnalyticsPlatform.instanceFor(app: app); } /// Returns an instance using a specified [FirebaseApp]. @@ -216,7 +220,10 @@ class FirebaseAnalytics extends FirebasePluginPlatform { required String? value, AnalyticsCallOptions? callOptions, }) async { - if (name.isEmpty || name.length > 24 || name.indexOf(_alpha) != 0 || name.contains(_nonAlphaNumeric)) { + if (name.isEmpty || + name.length > 24 || + name.indexOf(_alpha) != 0 || + name.contains(_nonAlphaNumeric)) { throw ArgumentError.value( name, 'name', @@ -1421,14 +1428,16 @@ List>? _marshalItems(List? items) { return items.map((AnalyticsEventItem item) => item.asMap()).toList(); } -void _assertParameterTypesAreCorrect(Map? parameters) => parameters?.forEach((key, value) { +void _assertParameterTypesAreCorrect(Map? parameters) => + parameters?.forEach((key, value) { assert( value is String || value is num, "'string' OR 'number' must be set as the value of the parameter: $key. $value found instead", ); }); -void _assertItemsParameterTypesAreCorrect(List? items) => items?.forEach((item) { +void _assertItemsParameterTypesAreCorrect(List? items) => + items?.forEach((item) { _assertParameterTypesAreCorrect(item.parameters); }); diff --git a/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart b/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart index 3cae3e524f37..ae768a7fe836 100755 --- a/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart +++ b/packages/firebase_analytics/firebase_analytics/test/firebase_analytics_test.dart @@ -1208,7 +1208,8 @@ void main() { }); test('setUserProperty', () async { - await analytics!.setUserProperty(name: 'test_name', value: 'test-value'); + await analytics! + .setUserProperty(name: 'test_name', value: 'test-value'); expect( methodCallLog, [ @@ -1241,7 +1242,8 @@ void main() { ); // reserved prefix expect( - analytics!.setUserProperty(name: 'firebase_test', value: 'test-value'), + analytics! + .setUserProperty(name: 'firebase_test', value: 'test-value'), throwsArgumentError, ); }); @@ -1262,7 +1264,8 @@ void main() { test( 'setSessionTimeoutDuration', () async { - await analytics!.setSessionTimeoutDuration(const Duration(milliseconds: 234)); + await analytics! + .setSessionTimeoutDuration(const Duration(milliseconds: 234)); expect( methodCallLog, [ From 60882f7f10d7e96d4727c1bc518d8563296ba773 Mon Sep 17 00:00:00 2001 From: Muccy Date: Mon, 13 Nov 2023 10:17:33 +0100 Subject: [PATCH 11/11] Remove formatting changes to files unrelated to the PR --- .../ios/Classes/FirestorePigeonParser.m | 54 +++++++++---------- .../windows/cloud_firestore_plugin.cpp | 4 +- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/cloud_firestore/cloud_firestore/ios/Classes/FirestorePigeonParser.m b/packages/cloud_firestore/cloud_firestore/ios/Classes/FirestorePigeonParser.m index e10eb0919d56..8b983e1f0c0e 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/Classes/FirestorePigeonParser.m +++ b/packages/cloud_firestore/cloud_firestore/ios/Classes/FirestorePigeonParser.m @@ -117,27 +117,27 @@ + (FIRQuery *)parseQueryWithParameters:(nonnull PigeonQueryParameters *)paramete // Limit id limit = parameters.limit; if (limit) { - query = [query queryLimitedTo:((NSNumber *)limit).intValue]; + query = [query queryLimitedTo:((NSNumber *)limit).intValue]; } // Limit To Last id limitToLast = parameters.limitToLast; if (limitToLast) { - query = [query queryLimitedToLast:((NSNumber *)limitToLast).intValue]; + query = [query queryLimitedToLast:((NSNumber *)limitToLast).intValue]; } // Ordering NSArray *orderBy = parameters.orderBy; if (!orderBy) { - // We return early if no ordering set as cursor queries below require at least one orderBy - // set - return query; + // We return early if no ordering set as cursor queries below require at least one orderBy + // set + return query; } for (NSArray *orderByParameters in orderBy) { - FIRFieldPath *fieldPath = (FIRFieldPath *)orderByParameters[0]; - NSNumber *descending = orderByParameters[1]; - query = [query queryOrderedByFieldPath:fieldPath descending:[descending boolValue]]; + FIRFieldPath *fieldPath = (FIRFieldPath *)orderByParameters[0]; + NSNumber *descending = orderByParameters[1]; + query = [query queryOrderedByFieldPath:fieldPath descending:[descending boolValue]]; } // Start At @@ -165,15 +165,15 @@ + (FIRQuery *)parseQueryWithParameters:(nonnull PigeonQueryParameters *)paramete + (FIRFirestoreSource)parseSource:(Source)source { switch (source) { case SourceServerAndCache: - return FIRFirestoreSourceDefault; + return FIRFirestoreSourceDefault; case SourceServer: - return FIRFirestoreSourceServer; + return FIRFirestoreSourceServer; case SourceCache: - return FIRFirestoreSourceCache; + return FIRFirestoreSourceCache; default: - @throw [NSException exceptionWithName:@"Invalid Source" - reason:@"This source is not supported by the SDK" - userInfo:nil]; + @throw [NSException exceptionWithName:@"Invalid Source" + reason:@"This source is not supported by the SDK" + userInfo:nil]; } } @@ -190,16 +190,16 @@ + (FIRServerTimestampBehavior)parseServerTimestampBehavior: (ServerTimestampBehavior)serverTimestampBehavior { switch (serverTimestampBehavior) { case ServerTimestampBehaviorNone: - return FIRServerTimestampBehaviorNone; + return FIRServerTimestampBehaviorNone; case ServerTimestampBehaviorEstimate: - return FIRServerTimestampBehaviorEstimate; + return FIRServerTimestampBehaviorEstimate; case ServerTimestampBehaviorPrevious: - return FIRServerTimestampBehaviorPrevious; + return FIRServerTimestampBehaviorPrevious; default: - @throw [NSException - exceptionWithName:@"Invalid Server Timestamp Behavior" - reason:@"This Server Timestamp Behavior is not supported by the SDK" - userInfo:nil]; + @throw [NSException + exceptionWithName:@"Invalid Server Timestamp Behavior" + reason:@"This Server Timestamp Behavior is not supported by the SDK" + userInfo:nil]; } } @@ -221,15 +221,15 @@ + (PigeonDocumentSnapshot *)toPigeonDocumentSnapshot:(FIRDocumentSnapshot *)docu + (DocumentChangeType)toPigeonDocumentChangeType:(FIRDocumentChangeType)documentChangeType { switch (documentChangeType) { case FIRDocumentChangeTypeAdded: - return DocumentChangeTypeAdded; + return DocumentChangeTypeAdded; case FIRDocumentChangeTypeModified: - return DocumentChangeTypeModified; + return DocumentChangeTypeModified; case FIRDocumentChangeTypeRemoved: - return DocumentChangeTypeRemoved; + return DocumentChangeTypeRemoved; default: - @throw [NSException exceptionWithName:@"InvalidDocumentChangeType" - reason:@"Invalid document change type" - userInfo:nil]; + @throw [NSException exceptionWithName:@"InvalidDocumentChangeType" + reason:@"Invalid document change type" + userInfo:nil]; } } diff --git a/packages/cloud_firestore/cloud_firestore/windows/cloud_firestore_plugin.cpp b/packages/cloud_firestore/cloud_firestore/windows/cloud_firestore_plugin.cpp index 599bd69ec0f1..b11febd56d16 100644 --- a/packages/cloud_firestore/cloud_firestore/windows/cloud_firestore_plugin.cpp +++ b/packages/cloud_firestore/cloud_firestore/windows/cloud_firestore_plugin.cpp @@ -2,8 +2,8 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -#pragma comment( \ - lib, "rpcrt4.lib") // UuidCreate - Minimum supported OS Win 2000 +#pragma comment(lib, \ + "rpcrt4.lib") // UuidCreate - Minimum supported OS Win 2000 #include "cloud_firestore_plugin.h"