From c7469d3ffce55a50cfa1995e41c049e7332a335a Mon Sep 17 00:00:00 2001 From: Denis Chilik Date: Wed, 1 Apr 2026 10:57:09 -0400 Subject: [PATCH 1/5] Delegate onSetAllUserAttributes to setAllUserAttributes in dual-listener kits AppsFlyer and Braze: forward snapshot maps to AttributeListener.setAllUserAttributes. Singular: align override parameter names with UserAttributeListener and delegate. Made-with: Cursor --- .../src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt | 4 ++++ .../src/main/kotlin/com/mparticle/kits/AppboyKit.kt | 4 ++++ .../src/main/kotlin/com/mparticle/kits/AppboyKit.kt | 4 ++++ .../src/main/kotlin/com/mparticle/kits/AppboyKit.kt | 4 ++++ .../src/main/kotlin/com/mparticle/kits/AppboyKit.kt | 4 ++++ .../src/main/kotlin/com/mparticle/kits/SingularKit.kt | 7 ++++--- 6 files changed, 24 insertions(+), 3 deletions(-) diff --git a/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt b/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt index 9bdf709ef..0dee73c61 100644 --- a/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt +++ b/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt @@ -289,6 +289,10 @@ class AppsFlyerKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { + setAllUserAttributes( + userAttributes ?: emptyMap(), + userAttributeLists ?: emptyMap(), + ) } override fun supportsAttributeLists(): Boolean = true diff --git a/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index e725d8754..cde729dcc 100644 --- a/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -535,6 +535,10 @@ open class AppboyKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { + setAllUserAttributes( + userAttributes ?: emptyMap(), + userAttributeLists ?: emptyMap(), + ) } override fun supportsAttributeLists(): Boolean = true diff --git a/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index e725d8754..cde729dcc 100644 --- a/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -535,6 +535,10 @@ open class AppboyKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { + setAllUserAttributes( + userAttributes ?: emptyMap(), + userAttributeLists ?: emptyMap(), + ) } override fun supportsAttributeLists(): Boolean = true diff --git a/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index e725d8754..cde729dcc 100644 --- a/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -535,6 +535,10 @@ open class AppboyKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { + setAllUserAttributes( + userAttributes ?: emptyMap(), + userAttributeLists ?: emptyMap(), + ) } override fun supportsAttributeLists(): Boolean = true diff --git a/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index e725d8754..cde729dcc 100644 --- a/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -535,6 +535,10 @@ open class AppboyKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { + setAllUserAttributes( + userAttributes ?: emptyMap(), + userAttributeLists ?: emptyMap(), + ) } override fun supportsAttributeLists(): Boolean = true diff --git a/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt b/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt index 8e945b4ba..a7fec9010 100644 --- a/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt +++ b/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt @@ -394,10 +394,11 @@ open class SingularKit : } override fun onSetAllUserAttributes( - map: Map, - map1: Map>, - filteredMParticleUser: FilteredMParticleUser, + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, ) { + setAllUserAttributes(userAttributes, userAttributeLists) } override fun supportsAttributeLists(): Boolean = false From 605e76d0d5047852fc24fb05df2dede6661ae52b Mon Sep 17 00:00:00 2001 From: Denis Chilik Date: Wed, 1 Apr 2026 11:01:57 -0400 Subject: [PATCH 2/5] Move onSetAllUserAttributes to BaseAttributeListener; route sync via one call - Declare onSetAllUserAttributes on BaseAttributeListener; remove from UserAttributeListener - KitManagerImpl: call BaseAttributeListener.onSetAllUserAttributes only (no duplicate setAllUserAttributes) - AttributeListener-only kits: delegate onSetAllUserAttributes to setAllUserAttributes - AttributeListenerTestKit: align setAllUserAttributes maps with Java API Made-with: Cursor --- .../kits/testkits/AttributeListenerTestKit.kt | 10 ++++++- .../com/mparticle/kits/KitIntegration.java | 18 ++++++++++-- .../com/mparticle/kits/KitManagerImpl.java | 28 ++++++------------- .../kotlin/com/mparticle/kits/AdobeKitBase.kt | 8 ++++++ .../kotlin/com/mparticle/kits/AdobeKit.kt | 8 ++++++ .../kotlin/com/mparticle/kits/ApptimizeKit.kt | 8 ++++++ .../com/mparticle/kits/BranchMetricsKit.kt | 8 ++++++ .../kotlin/com/mparticle/kits/ComscoreKit.kt | 8 ++++++ .../kotlin/com/mparticle/kits/KochavaKit.kt | 8 ++++++ .../com/mparticle/kits/LocalyticsKit.kt | 8 ++++++ .../com/mparticle/kits/UrbanAirshipKit.kt | 8 ++++++ 11 files changed, 97 insertions(+), 23 deletions(-) diff --git a/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt b/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt index e3c00dacb..869cc43ca 100644 --- a/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt +++ b/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt @@ -35,13 +35,21 @@ open class AttributeListenerTestKit : override fun setAllUserAttributes( userAttributes: Map, - userAttributeLists: Map>, + userAttributeLists: Map>, ) { setAllUserAttributes?.invoke(userAttributes, userAttributeLists) userAttributes.forEach { onAttributeReceived?.invoke(it.key, it.value) } userAttributeLists.forEach { onAttributeReceived?.invoke(it.key, it.value) } } + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun setUserIdentity( identityType: MParticle.IdentityType, identity: String?, diff --git a/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java b/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java index 549e25967..5649f3db0 100644 --- a/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java +++ b/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java @@ -408,6 +408,21 @@ void onSetUserAttributeList( @Nullable String attributeKey, @Nullable List attributeValueList, @Nullable FilteredMParticleUser user); + + /** + * Called when the full set of user attributes is synchronized for the current user. + * Kits that also implement {@link AttributeListener} typically delegate to + * {@link AttributeListener#setAllUserAttributes(Map, Map)}. + * + * @param userAttributes scalar user attributes + * @param userAttributeLists list-valued user attributes when {@link #supportsAttributeLists()} is true; + * otherwise list values may be merged into scalars by the framework + * @param user filtered user context for this kit + */ + void onSetAllUserAttributes( + Map userAttributes, + Map> userAttributeLists, + FilteredMParticleUser user); } public interface AttributeListener extends BaseAttributeListener { @@ -575,9 +590,8 @@ public interface UserAttributeListener extends BaseAttributeListener { void onSetUserTag(String key, FilteredMParticleUser user); - void onSetAllUserAttributes(Map userAttributes, Map> userAttributeLists, FilteredMParticleUser user); - void onConsentStateUpdated(ConsentState oldState, ConsentState newState, FilteredMParticleUser user); + } public interface BatchListener { diff --git a/android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java b/android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java index 970d1d51a..50b042f19 100644 --- a/android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java +++ b/android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java @@ -606,27 +606,15 @@ public void onUserAttributesReceived(Map userAttributes, Map> filteredAttributeLists = (Map>) KitConfiguration.filterAttributes(provider.getConfiguration().getUserAttributeFilters(), userAttributeLists); boolean supportsAttributeLists = ((KitIntegration.BaseAttributeListener) provider).supportsAttributeLists(); - if (provider instanceof KitIntegration.AttributeListener) { - if (supportsAttributeLists) { - ((KitIntegration.AttributeListener) provider).setAllUserAttributes(filteredAttributeSingles, filteredAttributeLists); - } else { - Map singlesCopy = new HashMap<>(filteredAttributeSingles); - for (Map.Entry> entry : filteredAttributeLists.entrySet()) { - singlesCopy.put(entry.getKey(), KitUtils.join(entry.getValue())); - } - ((KitIntegration.AttributeListener) provider).setAllUserAttributes(singlesCopy, new HashMap>()); - } - } - if (provider instanceof KitIntegration.UserAttributeListener) { - if (supportsAttributeLists) { - ((KitIntegration.UserAttributeListener) provider).onSetAllUserAttributes(filteredAttributeSingles, filteredAttributeLists, FilteredMParticleUser.getInstance(mpid, provider)); - } else { - Map singlesCopy = new HashMap<>(filteredAttributeSingles); - for (Map.Entry> entry : filteredAttributeLists.entrySet()) { - singlesCopy.put(entry.getKey(), KitUtils.join(entry.getValue())); - } - ((KitIntegration.UserAttributeListener) provider).onSetAllUserAttributes(singlesCopy, new HashMap>(), FilteredMParticleUser.getInstance(mpid, provider)); + KitIntegration.BaseAttributeListener baseAttributeListener = (KitIntegration.BaseAttributeListener) provider; + if (supportsAttributeLists) { + baseAttributeListener.onSetAllUserAttributes(filteredAttributeSingles, filteredAttributeLists, FilteredMParticleUser.getInstance(mpid, provider)); + } else { + Map singlesCopy = new HashMap<>(filteredAttributeSingles); + for (Map.Entry> entry : filteredAttributeLists.entrySet()) { + singlesCopy.put(entry.getKey(), KitUtils.join(entry.getValue())); } + baseAttributeListener.onSetAllUserAttributes(singlesCopy, new HashMap>(), FilteredMParticleUser.getInstance(mpid, provider)); } } } catch (Exception e) { diff --git a/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt b/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt index 3196faff0..1dd49dbe0 100644 --- a/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt +++ b/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt @@ -65,6 +65,14 @@ abstract class AdobeKitBase : syncIds() } + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser, diff --git a/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt b/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt index 758689414..4972e18e1 100644 --- a/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt +++ b/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt @@ -102,6 +102,14 @@ open class AdobeKit : syncIds() } + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser, diff --git a/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt b/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt index 70d42766c..b04e017a5 100644 --- a/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt +++ b/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt @@ -143,6 +143,14 @@ class ApptimizeKit : } } + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser, diff --git a/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt b/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt index bdd2970b3..23610149b 100644 --- a/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt +++ b/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt @@ -189,6 +189,14 @@ class BranchMetricsKit : map1: Map>, ) {} + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser, diff --git a/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt b/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt index 704036f30..df8613865 100644 --- a/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt +++ b/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt @@ -115,6 +115,14 @@ class ComscoreKit : } } + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser, diff --git a/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt b/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt index 5a10c5279..98c9299a0 100644 --- a/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt +++ b/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt @@ -97,6 +97,14 @@ class KochavaKit : map1: Map>, ) {} + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser, diff --git a/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt b/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt index 9ba9bb001..91a8f2dda 100644 --- a/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt +++ b/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt @@ -173,6 +173,14 @@ class LocalyticsKit : } } + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser, diff --git a/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt b/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt index aa2dc09ef..9bf857489 100644 --- a/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt +++ b/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt @@ -266,6 +266,14 @@ class UrbanAirshipKit : } } + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, + ) { + setAllUserAttributes(userAttributes, userAttributeLists) + } + override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser, From a866404a328adba14762520ce52085e2a3df5008 Mon Sep 17 00:00:00 2001 From: Denis Chilik Date: Wed, 1 Apr 2026 11:08:26 -0400 Subject: [PATCH 3/5] Hoist FilteredMParticleUser in onUserAttributesReceived Compute getInstance(mpid, provider) once before the supportsAttributeLists branch. Made-with: Cursor --- .../main/java/com/mparticle/kits/KitManagerImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java b/android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java index 50b042f19..a37cd0a28 100644 --- a/android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java +++ b/android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java @@ -599,22 +599,22 @@ public void onUserAttributesReceived(Map userAttributes, Map filteredAttributeSingles = (Map) KitConfiguration.filterAttributes(provider.getConfiguration().getUserAttributeFilters(), userAttributes); Map> filteredAttributeLists = (Map>) KitConfiguration.filterAttributes(provider.getConfiguration().getUserAttributeFilters(), userAttributeLists); - boolean supportsAttributeLists = ((KitIntegration.BaseAttributeListener) provider).supportsAttributeLists(); - KitIntegration.BaseAttributeListener baseAttributeListener = (KitIntegration.BaseAttributeListener) provider; + boolean supportsAttributeLists = listener.supportsAttributeLists(); + FilteredMParticleUser filteredUser = FilteredMParticleUser.getInstance(mpid, provider); if (supportsAttributeLists) { - baseAttributeListener.onSetAllUserAttributes(filteredAttributeSingles, filteredAttributeLists, FilteredMParticleUser.getInstance(mpid, provider)); + listener.onSetAllUserAttributes(filteredAttributeSingles, filteredAttributeLists, filteredUser); } else { Map singlesCopy = new HashMap<>(filteredAttributeSingles); for (Map.Entry> entry : filteredAttributeLists.entrySet()) { singlesCopy.put(entry.getKey(), KitUtils.join(entry.getValue())); } - baseAttributeListener.onSetAllUserAttributes(singlesCopy, new HashMap>(), FilteredMParticleUser.getInstance(mpid, provider)); + listener.onSetAllUserAttributes(singlesCopy, new HashMap>(), filteredUser); } } } catch (Exception e) { From 06d77640eda36290475c99c2142e8fadb0690db6 Mon Sep 17 00:00:00 2001 From: Denis Chilik Date: Wed, 1 Apr 2026 11:16:29 -0400 Subject: [PATCH 4/5] Remove setAllUserAttributes from AttributeListener Drop the method from KitIntegration.AttributeListener; full sync is delivered via BaseAttributeListener.onSetAllUserAttributes. Kits keep setAllUserAttributes as ordinary helpers (no override). Update KitManagerImplTest and AttributeListenerTestKit accordingly. Made-with: Cursor --- .../mparticle/kits/testkits/AttributeListenerTestKit.kt | 2 +- .../src/main/java/com/mparticle/kits/KitIntegration.java | 6 ++---- .../test/kotlin/com/mparticle/kits/KitManagerImplTest.kt | 8 ++++---- .../src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/AdobeKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt | 2 +- .../main/kotlin/com/mparticle/kits/BranchMetricsKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/AppboyKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/AppboyKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/AppboyKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/AppboyKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/ComscoreKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/KochavaKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/SingularKit.kt | 2 +- .../src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt | 2 +- 17 files changed, 21 insertions(+), 23 deletions(-) diff --git a/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt b/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt index 869cc43ca..c95bab546 100644 --- a/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt +++ b/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt @@ -33,7 +33,7 @@ open class AttributeListenerTestKit : onAttributeReceived?.invoke(attributeKey, attributeValueList) } - override fun setAllUserAttributes( + fun setAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, ) { diff --git a/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java b/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java index 5649f3db0..c0b5885a3 100644 --- a/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java +++ b/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java @@ -411,8 +411,8 @@ void onSetUserAttributeList( /** * Called when the full set of user attributes is synchronized for the current user. - * Kits that also implement {@link AttributeListener} typically delegate to - * {@link AttributeListener#setAllUserAttributes(Map, Map)}. + * Kits implementing {@link AttributeListener} typically implement a {@code setAllUserAttributes} + * helper and invoke it from here with the same maps. * * @param userAttributes scalar user attributes * @param userAttributeLists list-valued user attributes when {@link #supportsAttributeLists()} is true; @@ -427,8 +427,6 @@ void onSetAllUserAttributes( public interface AttributeListener extends BaseAttributeListener { - void setAllUserAttributes(Map userAttributes, Map> userAttributeLists); - void setUserIdentity(MParticle.IdentityType identityType, String identity); void removeUserIdentity(MParticle.IdentityType identityType); diff --git a/android-kit-base/src/test/kotlin/com/mparticle/kits/KitManagerImplTest.kt b/android-kit-base/src/test/kotlin/com/mparticle/kits/KitManagerImplTest.kt index 7b4a10e3e..9ea28affe 100644 --- a/android-kit-base/src/test/kotlin/com/mparticle/kits/KitManagerImplTest.kt +++ b/android-kit-base/src/test/kotlin/com/mparticle/kits/KitManagerImplTest.kt @@ -519,15 +519,15 @@ class KitManagerImplTest { attributeList.add("3") userAttributeLists["test 3"] = attributeList manager.onUserAttributesReceived(userAttributeSingles, userAttributeLists, 1L) - verify(integration as AttributeListener, Mockito.times(1)) - .setAllUserAttributes(userAttributeSingles, userAttributeLists) + verify(integration as BaseAttributeListener, Mockito.times(1)) + .onSetAllUserAttributes(eq(userAttributeSingles), eq(userAttributeLists), any()) val userAttributesCombined: MutableMap = HashMap() userAttributesCombined["test"] = "whatever" userAttributesCombined["test 2"] = "whatever 2" userAttributesCombined["test 3"] = "1,2,3" val clearedOutList: Map> = HashMap() - verify(integration2 as AttributeListener, Mockito.times(1)) - .setAllUserAttributes(userAttributesCombined, clearedOutList) + verify(integration2 as BaseAttributeListener, Mockito.times(1)) + .onSetAllUserAttributes(eq(userAttributesCombined), eq(clearedOutList), any()) } @Test diff --git a/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt b/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt index 1dd49dbe0..d4453829c 100644 --- a/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt +++ b/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt @@ -58,7 +58,7 @@ abstract class AdobeKitBase : override fun supportsAttributeLists(): Boolean = false - override fun setAllUserAttributes( + fun setAllUserAttributes( map: Map, map1: Map>, ) { diff --git a/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt b/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt index 4972e18e1..eece1e88a 100644 --- a/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt +++ b/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt @@ -95,7 +95,7 @@ open class AdobeKit : override fun supportsAttributeLists(): Boolean = false - override fun setAllUserAttributes( + fun setAllUserAttributes( map: Map, map1: Map>, ) { diff --git a/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt b/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt index 0dee73c61..803cfd483 100644 --- a/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt +++ b/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt @@ -297,7 +297,7 @@ class AppsFlyerKit : override fun supportsAttributeLists(): Boolean = true - override fun setAllUserAttributes( + fun setAllUserAttributes( map: Map, map1: Map>, ) { diff --git a/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt b/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt index b04e017a5..eb08279cc 100644 --- a/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt +++ b/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt @@ -134,7 +134,7 @@ class ApptimizeKit : /** * @param attributeLists is ignored by the Apptimize kit. */ - override fun setAllUserAttributes( + fun setAllUserAttributes( attributes: Map, attributeLists: Map>, ) { diff --git a/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt b/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt index 23610149b..dfa3f9ec0 100644 --- a/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt +++ b/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt @@ -184,7 +184,7 @@ class BranchMetricsKit : override fun supportsAttributeLists(): Boolean = true - override fun setAllUserAttributes( + fun setAllUserAttributes( map: Map, map1: Map>, ) {} diff --git a/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index cde729dcc..1b442a9c4 100644 --- a/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -679,7 +679,7 @@ open class AppboyKit : /** * This is called when the Kit is added to the mParticle SDK, typically on app-startup. */ - override fun setAllUserAttributes( + fun setAllUserAttributes( attributes: Map, attributeLists: Map>, ) { diff --git a/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index cde729dcc..1b442a9c4 100644 --- a/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -679,7 +679,7 @@ open class AppboyKit : /** * This is called when the Kit is added to the mParticle SDK, typically on app-startup. */ - override fun setAllUserAttributes( + fun setAllUserAttributes( attributes: Map, attributeLists: Map>, ) { diff --git a/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index cde729dcc..1b442a9c4 100644 --- a/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -679,7 +679,7 @@ open class AppboyKit : /** * This is called when the Kit is added to the mParticle SDK, typically on app-startup. */ - override fun setAllUserAttributes( + fun setAllUserAttributes( attributes: Map, attributeLists: Map>, ) { diff --git a/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index cde729dcc..1b442a9c4 100644 --- a/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -679,7 +679,7 @@ open class AppboyKit : /** * This is called when the Kit is added to the mParticle SDK, typically on app-startup. */ - override fun setAllUserAttributes( + fun setAllUserAttributes( attributes: Map, attributeLists: Map>, ) { diff --git a/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt b/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt index df8613865..067892b98 100644 --- a/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt +++ b/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt @@ -104,7 +104,7 @@ class ComscoreKit : override fun supportsAttributeLists(): Boolean = !isEnterprise - override fun setAllUserAttributes( + fun setAllUserAttributes( attributes: Map, attributeLists: Map>, ) { diff --git a/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt b/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt index 98c9299a0..4b147c3d0 100644 --- a/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt +++ b/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt @@ -92,7 +92,7 @@ class KochavaKit : override fun supportsAttributeLists(): Boolean = true - override fun setAllUserAttributes( + fun setAllUserAttributes( map: Map, map1: Map>, ) {} diff --git a/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt b/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt index 91a8f2dda..a32bf3e54 100644 --- a/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt +++ b/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt @@ -161,7 +161,7 @@ class LocalyticsKit : override fun supportsAttributeLists(): Boolean = true - override fun setAllUserAttributes( + fun setAllUserAttributes( attributes: Map, attributeLists: Map>, ) { diff --git a/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt b/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt index a7fec9010..70c77adaa 100644 --- a/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt +++ b/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt @@ -413,7 +413,7 @@ open class SingularKit : }, forceInitSingular = false, "onConsentStateUpdated") } - override fun setAllUserAttributes( + fun setAllUserAttributes( map: Map, map1: Map>, ) {} diff --git a/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt b/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt index 9bf857489..b061467ef 100644 --- a/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt +++ b/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt @@ -247,7 +247,7 @@ class UrbanAirshipKit : override fun supportsAttributeLists(): Boolean = false - override fun setAllUserAttributes( + fun setAllUserAttributes( stringAttributes: Map, listAttributes: Map>, ) { From 641a6d385a90997410e6d893adacef77c8b58f99 Mon Sep 17 00:00:00 2001 From: Denis Chilik Date: Thu, 2 Apr 2026 08:56:29 -0400 Subject: [PATCH 5/5] refactor(kits): inline setAllUserAttributes into onSetAllUserAttributes Remove redundant setAllUserAttributes helpers from kits and AttributeListenerTestKit. Update BaseAttributeListener Javadoc in KitIntegration. Made-with: Cursor --- .../kits/testkits/AttributeListenerTestKit.kt | 11 +--- .../com/mparticle/kits/KitIntegration.java | 2 - .../kotlin/com/mparticle/kits/AdobeKitBase.kt | 9 +-- .../kotlin/com/mparticle/kits/AdobeKit.kt | 9 +-- .../kotlin/com/mparticle/kits/AppsFlyerKit.kt | 12 +--- .../kotlin/com/mparticle/kits/ApptimizeKit.kt | 15 ++--- .../com/mparticle/kits/BranchMetricsKit.kt | 6 -- .../kotlin/com/mparticle/kits/AppboyKit.kt | 61 ++++++++----------- .../kotlin/com/mparticle/kits/AppboyKit.kt | 61 ++++++++----------- .../kotlin/com/mparticle/kits/AppboyKit.kt | 61 ++++++++----------- .../kotlin/com/mparticle/kits/AppboyKit.kt | 61 ++++++++----------- .../kotlin/com/mparticle/kits/ComscoreKit.kt | 17 ++---- .../kotlin/com/mparticle/kits/KochavaKit.kt | 6 -- .../com/mparticle/kits/LocalyticsKit.kt | 19 ++---- .../kotlin/com/mparticle/kits/SingularKit.kt | 6 -- .../com/mparticle/kits/UrbanAirshipKit.kt | 17 ++---- 16 files changed, 125 insertions(+), 248 deletions(-) diff --git a/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt b/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt index c95bab546..8d1ca5573 100644 --- a/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt +++ b/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/testkits/AttributeListenerTestKit.kt @@ -33,23 +33,16 @@ open class AttributeListenerTestKit : onAttributeReceived?.invoke(attributeKey, attributeValueList) } - fun setAllUserAttributes( + override fun onSetAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, + user: FilteredMParticleUser, ) { setAllUserAttributes?.invoke(userAttributes, userAttributeLists) userAttributes.forEach { onAttributeReceived?.invoke(it.key, it.value) } userAttributeLists.forEach { onAttributeReceived?.invoke(it.key, it.value) } } - override fun onSetAllUserAttributes( - userAttributes: Map, - userAttributeLists: Map>, - user: FilteredMParticleUser, - ) { - setAllUserAttributes(userAttributes, userAttributeLists) - } - override fun setUserIdentity( identityType: MParticle.IdentityType, identity: String?, diff --git a/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java b/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java index c0b5885a3..ccf78f24e 100644 --- a/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java +++ b/android-kit-base/src/main/java/com/mparticle/kits/KitIntegration.java @@ -411,8 +411,6 @@ void onSetUserAttributeList( /** * Called when the full set of user attributes is synchronized for the current user. - * Kits implementing {@link AttributeListener} typically implement a {@code setAllUserAttributes} - * helper and invoke it from here with the same maps. * * @param userAttributes scalar user attributes * @param userAttributeLists list-valued user attributes when {@link #supportsAttributeLists()} is true; diff --git a/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt b/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt index d4453829c..fe0abda91 100644 --- a/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt +++ b/kits/adobe/adobe-5/src/main/kotlin/com/mparticle/kits/AdobeKitBase.kt @@ -58,19 +58,12 @@ abstract class AdobeKitBase : override fun supportsAttributeLists(): Boolean = false - fun setAllUserAttributes( - map: Map, - map1: Map>, - ) { - syncIds() - } - override fun onSetAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, user: FilteredMParticleUser, ) { - setAllUserAttributes(userAttributes, userAttributeLists) + syncIds() } override fun onRemoveUserAttribute( diff --git a/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt b/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt index eece1e88a..6fd47dd2d 100644 --- a/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt +++ b/kits/adobemedia/adobemedia-5/src/main/kotlin/com/mparticle/kits/AdobeKit.kt @@ -95,19 +95,12 @@ open class AdobeKit : override fun supportsAttributeLists(): Boolean = false - fun setAllUserAttributes( - map: Map, - map1: Map>, - ) { - syncIds() - } - override fun onSetAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, user: FilteredMParticleUser, ) { - setAllUserAttributes(userAttributes, userAttributeLists) + syncIds() } override fun onRemoveUserAttribute( diff --git a/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt b/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt index 803cfd483..8d2356b9c 100644 --- a/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt +++ b/kits/appsflyer/appsflyer-6/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt @@ -289,21 +289,11 @@ class AppsFlyerKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { - setAllUserAttributes( - userAttributes ?: emptyMap(), - userAttributeLists ?: emptyMap(), - ) + // No-op: this kit does not implement this feature. } override fun supportsAttributeLists(): Boolean = true - fun setAllUserAttributes( - map: Map, - map1: Map>, - ) { - // No-op: this kit does not implement this feature. - } - override fun removeUserIdentity(identityType: MParticle.IdentityType) { with(instance) { if (MParticle.IdentityType.CustomerId == identityType) { diff --git a/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt b/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt index eb08279cc..2cf24e0e7 100644 --- a/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt +++ b/kits/apptimize/apptimize-3/src/main/kotlin/com/mparticle/kits/ApptimizeKit.kt @@ -132,23 +132,16 @@ class ApptimizeKit : override fun supportsAttributeLists(): Boolean = false /** - * @param attributeLists is ignored by the Apptimize kit. + * [userAttributeLists] is ignored by the Apptimize kit. */ - fun setAllUserAttributes( - attributes: Map, - attributeLists: Map>, - ) { - for ((key, value) in attributes) { - Apptimize.setUserAttribute(key, value) - } - } - override fun onSetAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, user: FilteredMParticleUser, ) { - setAllUserAttributes(userAttributes, userAttributeLists) + for ((key, value) in userAttributes) { + Apptimize.setUserAttribute(key, value) + } } override fun onRemoveUserAttribute( diff --git a/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt b/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt index dfa3f9ec0..b420ec33b 100644 --- a/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt +++ b/kits/branch/branch-5/src/main/kotlin/com/mparticle/kits/BranchMetricsKit.kt @@ -184,17 +184,11 @@ class BranchMetricsKit : override fun supportsAttributeLists(): Boolean = true - fun setAllUserAttributes( - map: Map, - map1: Map>, - ) {} - override fun onSetAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, user: FilteredMParticleUser, ) { - setAllUserAttributes(userAttributes, userAttributeLists) } override fun onRemoveUserAttribute( diff --git a/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index 1b442a9c4..5aa06e6ec 100644 --- a/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-38/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -535,10 +535,31 @@ open class AppboyKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { - setAllUserAttributes( - userAttributes ?: emptyMap(), - userAttributeLists ?: emptyMap(), - ) + val attributes = userAttributes ?: emptyMap() + val attributeLists = userAttributeLists ?: emptyMap() + if (!kitPreferences.getBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, false)) { + for ((key, value) in attributes) { + applyScalarUserAttribute(key, value) + } + for ((key, value) in attributeLists) { + Braze + .getInstance(context) + .getCurrentUser( + object : IValueCallback { + override fun onSuccess(brazeUser: BrazeUser) { + val array = value.toTypedArray() + brazeUser.setCustomAttributeArray(key, array) + queueDataFlush() + } + + override fun onError() { + Logger.warning("unable to set key: " + key + " with User Attribute List: " + value) + } + }, + ) + } + kitPreferences.edit().putBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, true).apply() + } } override fun supportsAttributeLists(): Boolean = true @@ -676,38 +697,6 @@ open class AppboyKit : dataFlushRunnable?.let { dataFlushHandler.postDelayed(it, FLUSH_DELAY.toLong()) } } - /** - * This is called when the Kit is added to the mParticle SDK, typically on app-startup. - */ - fun setAllUserAttributes( - attributes: Map, - attributeLists: Map>, - ) { - if (!kitPreferences.getBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, false)) { - for ((key, value) in attributes) { - applyScalarUserAttribute(key, value) - } - for ((key, value) in attributeLists) { - Braze - .getInstance(context) - .getCurrentUser( - object : IValueCallback { - override fun onSuccess(brazeUser: BrazeUser) { - val array = value.toTypedArray() - brazeUser.setCustomAttributeArray(key, array) - queueDataFlush() - } - - override fun onError() { - Logger.warning("unable to set key: " + key + " with User Attribute List: " + value) - } - }, - ) - } - kitPreferences.edit().putBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, true).apply() - } - } - override fun setUserIdentity( identityType: IdentityType, identity: String, diff --git a/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index 1b442a9c4..5aa06e6ec 100644 --- a/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-39/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -535,10 +535,31 @@ open class AppboyKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { - setAllUserAttributes( - userAttributes ?: emptyMap(), - userAttributeLists ?: emptyMap(), - ) + val attributes = userAttributes ?: emptyMap() + val attributeLists = userAttributeLists ?: emptyMap() + if (!kitPreferences.getBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, false)) { + for ((key, value) in attributes) { + applyScalarUserAttribute(key, value) + } + for ((key, value) in attributeLists) { + Braze + .getInstance(context) + .getCurrentUser( + object : IValueCallback { + override fun onSuccess(brazeUser: BrazeUser) { + val array = value.toTypedArray() + brazeUser.setCustomAttributeArray(key, array) + queueDataFlush() + } + + override fun onError() { + Logger.warning("unable to set key: " + key + " with User Attribute List: " + value) + } + }, + ) + } + kitPreferences.edit().putBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, true).apply() + } } override fun supportsAttributeLists(): Boolean = true @@ -676,38 +697,6 @@ open class AppboyKit : dataFlushRunnable?.let { dataFlushHandler.postDelayed(it, FLUSH_DELAY.toLong()) } } - /** - * This is called when the Kit is added to the mParticle SDK, typically on app-startup. - */ - fun setAllUserAttributes( - attributes: Map, - attributeLists: Map>, - ) { - if (!kitPreferences.getBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, false)) { - for ((key, value) in attributes) { - applyScalarUserAttribute(key, value) - } - for ((key, value) in attributeLists) { - Braze - .getInstance(context) - .getCurrentUser( - object : IValueCallback { - override fun onSuccess(brazeUser: BrazeUser) { - val array = value.toTypedArray() - brazeUser.setCustomAttributeArray(key, array) - queueDataFlush() - } - - override fun onError() { - Logger.warning("unable to set key: " + key + " with User Attribute List: " + value) - } - }, - ) - } - kitPreferences.edit().putBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, true).apply() - } - } - override fun setUserIdentity( identityType: IdentityType, identity: String, diff --git a/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index 1b442a9c4..5aa06e6ec 100644 --- a/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-40/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -535,10 +535,31 @@ open class AppboyKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { - setAllUserAttributes( - userAttributes ?: emptyMap(), - userAttributeLists ?: emptyMap(), - ) + val attributes = userAttributes ?: emptyMap() + val attributeLists = userAttributeLists ?: emptyMap() + if (!kitPreferences.getBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, false)) { + for ((key, value) in attributes) { + applyScalarUserAttribute(key, value) + } + for ((key, value) in attributeLists) { + Braze + .getInstance(context) + .getCurrentUser( + object : IValueCallback { + override fun onSuccess(brazeUser: BrazeUser) { + val array = value.toTypedArray() + brazeUser.setCustomAttributeArray(key, array) + queueDataFlush() + } + + override fun onError() { + Logger.warning("unable to set key: " + key + " with User Attribute List: " + value) + } + }, + ) + } + kitPreferences.edit().putBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, true).apply() + } } override fun supportsAttributeLists(): Boolean = true @@ -676,38 +697,6 @@ open class AppboyKit : dataFlushRunnable?.let { dataFlushHandler.postDelayed(it, FLUSH_DELAY.toLong()) } } - /** - * This is called when the Kit is added to the mParticle SDK, typically on app-startup. - */ - fun setAllUserAttributes( - attributes: Map, - attributeLists: Map>, - ) { - if (!kitPreferences.getBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, false)) { - for ((key, value) in attributes) { - applyScalarUserAttribute(key, value) - } - for ((key, value) in attributeLists) { - Braze - .getInstance(context) - .getCurrentUser( - object : IValueCallback { - override fun onSuccess(brazeUser: BrazeUser) { - val array = value.toTypedArray() - brazeUser.setCustomAttributeArray(key, array) - queueDataFlush() - } - - override fun onError() { - Logger.warning("unable to set key: " + key + " with User Attribute List: " + value) - } - }, - ) - } - kitPreferences.edit().putBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, true).apply() - } - } - override fun setUserIdentity( identityType: IdentityType, identity: String, diff --git a/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index 1b442a9c4..5aa06e6ec 100644 --- a/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/kits/braze/braze-41/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -535,10 +535,31 @@ open class AppboyKit : userAttributeLists: MutableMap>?, user: FilteredMParticleUser?, ) { - setAllUserAttributes( - userAttributes ?: emptyMap(), - userAttributeLists ?: emptyMap(), - ) + val attributes = userAttributes ?: emptyMap() + val attributeLists = userAttributeLists ?: emptyMap() + if (!kitPreferences.getBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, false)) { + for ((key, value) in attributes) { + applyScalarUserAttribute(key, value) + } + for ((key, value) in attributeLists) { + Braze + .getInstance(context) + .getCurrentUser( + object : IValueCallback { + override fun onSuccess(brazeUser: BrazeUser) { + val array = value.toTypedArray() + brazeUser.setCustomAttributeArray(key, array) + queueDataFlush() + } + + override fun onError() { + Logger.warning("unable to set key: " + key + " with User Attribute List: " + value) + } + }, + ) + } + kitPreferences.edit().putBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, true).apply() + } } override fun supportsAttributeLists(): Boolean = true @@ -676,38 +697,6 @@ open class AppboyKit : dataFlushRunnable?.let { dataFlushHandler.postDelayed(it, FLUSH_DELAY.toLong()) } } - /** - * This is called when the Kit is added to the mParticle SDK, typically on app-startup. - */ - fun setAllUserAttributes( - attributes: Map, - attributeLists: Map>, - ) { - if (!kitPreferences.getBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, false)) { - for ((key, value) in attributes) { - applyScalarUserAttribute(key, value) - } - for ((key, value) in attributeLists) { - Braze - .getInstance(context) - .getCurrentUser( - object : IValueCallback { - override fun onSuccess(brazeUser: BrazeUser) { - val array = value.toTypedArray() - brazeUser.setCustomAttributeArray(key, array) - queueDataFlush() - } - - override fun onError() { - Logger.warning("unable to set key: " + key + " with User Attribute List: " + value) - } - }, - ) - } - kitPreferences.edit().putBoolean(PREF_KEY_HAS_SYNCED_ATTRIBUTES, true).apply() - } - } - override fun setUserIdentity( identityType: IdentityType, identity: String, diff --git a/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt b/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt index 067892b98..23ee806a5 100644 --- a/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt +++ b/kits/comscore/comscore-6/src/main/kotlin/com/mparticle/kits/ComscoreKit.kt @@ -104,23 +104,16 @@ class ComscoreKit : override fun supportsAttributeLists(): Boolean = !isEnterprise - fun setAllUserAttributes( - attributes: Map, - attributeLists: Map>, - ) { - if (isEnterprise) { - for ((key, value) in attributes) { - applyEnterpriseScalarUserAttribute(key, value) - } - } - } - override fun onSetAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, user: FilteredMParticleUser, ) { - setAllUserAttributes(userAttributes, userAttributeLists) + if (isEnterprise) { + for ((key, value) in userAttributes) { + applyEnterpriseScalarUserAttribute(key, value) + } + } } override fun onRemoveUserAttribute( diff --git a/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt b/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt index 4b147c3d0..fcbf5141d 100644 --- a/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt +++ b/kits/kochava/kochava-5/src/main/kotlin/com/mparticle/kits/KochavaKit.kt @@ -92,17 +92,11 @@ class KochavaKit : override fun supportsAttributeLists(): Boolean = true - fun setAllUserAttributes( - map: Map, - map1: Map>, - ) {} - override fun onSetAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, user: FilteredMParticleUser, ) { - setAllUserAttributes(userAttributes, userAttributeLists) } override fun onRemoveUserAttribute( diff --git a/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt b/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt index a32bf3e54..130386da6 100644 --- a/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt +++ b/kits/localytics/localytics-6/src/main/kotlin/com/mparticle/kits/LocalyticsKit.kt @@ -161,24 +161,17 @@ class LocalyticsKit : override fun supportsAttributeLists(): Boolean = true - fun setAllUserAttributes( - attributes: Map, - attributeLists: Map>, - ) { - for ((key, value) in attributes) { - applyScalarUserAttribute(key, value) - } - for ((key, value) in attributeLists) { - Localytics.setProfileAttribute(key, value.toTypedArray()) - } - } - override fun onSetAllUserAttributes( userAttributes: Map, userAttributeLists: Map>, user: FilteredMParticleUser, ) { - setAllUserAttributes(userAttributes, userAttributeLists) + for ((key, value) in userAttributes) { + applyScalarUserAttribute(key, value) + } + for ((key, value) in userAttributeLists) { + Localytics.setProfileAttribute(key, value.toTypedArray()) + } } override fun onRemoveUserAttribute( diff --git a/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt b/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt index 70c77adaa..ab6df79f8 100644 --- a/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt +++ b/kits/singular/singular-12/src/main/kotlin/com/mparticle/kits/SingularKit.kt @@ -398,7 +398,6 @@ open class SingularKit : userAttributeLists: Map>, user: FilteredMParticleUser, ) { - setAllUserAttributes(userAttributes, userAttributeLists) } override fun supportsAttributeLists(): Boolean = false @@ -413,11 +412,6 @@ open class SingularKit : }, forceInitSingular = false, "onConsentStateUpdated") } - fun setAllUserAttributes( - map: Map, - map1: Map>, - ) {} - override fun setUserIdentity( identityType: IdentityType, s: String, diff --git a/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt b/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt index b061467ef..28b1cc7c8 100644 --- a/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt +++ b/kits/urbanairship/urbanairship-20/src/main/kotlin/com/mparticle/kits/UrbanAirshipKit.kt @@ -247,15 +247,16 @@ class UrbanAirshipKit : override fun supportsAttributeLists(): Boolean = false - fun setAllUserAttributes( - stringAttributes: Map, - listAttributes: Map>, + override fun onSetAllUserAttributes( + userAttributes: Map, + userAttributeLists: Map>, + user: FilteredMParticleUser, ) { if (configuration?.enableTags == true) { val editor = Airship.channel .editTags() - for ((key, value) in stringAttributes) { + for ((key, value) in userAttributes) { if (KitUtils.isEmpty(value)) { editor.addTag(KitUtils.sanitizeAttributeKey(key)) } else if (configuration?.includeUserAttributes == true) { @@ -266,14 +267,6 @@ class UrbanAirshipKit : } } - override fun onSetAllUserAttributes( - userAttributes: Map, - userAttributeLists: Map>, - user: FilteredMParticleUser, - ) { - setAllUserAttributes(userAttributes, userAttributeLists) - } - override fun onRemoveUserAttribute( key: String, user: FilteredMParticleUser,