diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4c10b3d45..523e1dc13 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
### Removed
+- Remove deprecated `KitIntegration.getAllUserAttributes()`. Custom kits must use `getCurrentUser().getUserAttributes()` (or other `FilteredMParticleUser` APIs) and `AttributeListener` callbacks instead ([#682](https://github.com/mParticle/mparticle-android-sdk/pull/682))
- Remove deprecated `KitIntegration.getUserIdentities()`. Custom kits must use identity data from kit callbacks and request objects instead ([#681](https://github.com/mParticle/mparticle-android-sdk/pull/681)) ([8d3a23c8](https://github.com/mParticle/mparticle-android-sdk/commit/8d3a23c84c96d11f0ee1f80763adacc4f964b544))
## [5.78.2](https://github.com/mParticle/mparticle-android-sdk/compare/v5.78.1...v5.78.2) (2026-02-27)
diff --git a/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/DataplanBlockingUserTests.kt b/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/DataplanBlockingUserTests.kt
index 6ae485f6e..c52d55e4e 100644
--- a/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/DataplanBlockingUserTests.kt
+++ b/android-kit-base/src/androidTest/kotlin/com/mparticle/kits/DataplanBlockingUserTests.kt
@@ -90,7 +90,7 @@ class DataplanBlockingUserTests : BaseKitOptionsTest() {
AccessUtils.awaitMessageHandler()
kitIntegrationTestKits.forEach { kit ->
- assertEquals(kit.name, allowedAttributes, kit.allUserAttributes)
+ assertEquals(kit.name, allowedAttributes, kit.getCurrentUser()?.userAttributes)
}
// sanity check to make sure the non-filtered User has the blocked identities
assertEquals(
@@ -174,7 +174,7 @@ class DataplanBlockingUserTests : BaseKitOptionsTest() {
assertEquals(count, allowedAttributes.size * 4)
kitIntegrationTestKits.forEach {
- assertEquals(0, it.allUserAttributes.size)
+ assertEquals(0, it.getCurrentUser()?.userAttributes?.size ?: 0)
}
// sanity check to make sure the non-filtered User has the blocked identities
assertEquals(
@@ -241,8 +241,9 @@ class DataplanBlockingUserTests : BaseKitOptionsTest() {
assertEquals(count, allowedAttributes.size * 4)
kitIntegrationTestKits.forEach { kit ->
- assertEquals(allowedAttributes.size, kit.allUserAttributes.size)
- assertEquals(allowedAttributes.keys, kit.allUserAttributes.keys)
+ val filtered = kit.getCurrentUser()?.userAttributes
+ assertEquals(allowedAttributes.size, filtered?.size ?: 0)
+ assertEquals(allowedAttributes.keys, filtered?.keys)
}
// sanity check to make sure the non-filtered User has the blocked attributes
assertEquals(
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 34229c9e3..ab5ba20b3 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
@@ -30,7 +30,6 @@
import java.lang.ref.WeakReference;
import java.math.BigDecimal;
import java.util.Collections;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -119,46 +118,6 @@ public boolean isDisabled(boolean isOptOutEvent) {
(getConfiguration().shouldHonorOptOut() && kitManager.isOptedOut() && !isOptOutEvent);
}
- /**
- * Retrieve filtered user attributes. Use this method to retrieve user attributes at any time.
- * To ensure that filtering is respected, kits must use this method rather than the public API.
- *
- * If the KitIntegration implements the {@link AttributeListener} interface and returns true
- * for {@link AttributeListener#supportsAttributeLists()}, this method will pass back all attributes
- * as they are (as String values or as List<String> values). Otherwise, this method will comma-separate
- * the List values and return back all String values.
- *
- * @return a Map of attributes according to the logic above.
- */
- @Deprecated
- public final Map getAllUserAttributes() {
- MParticle instance = MParticle.getInstance();
- if (instance != null) {
- MParticleUser user = instance.Identity().getCurrentUser();
- if (user != null) {
- Map userAttributes = user.getUserAttributes();
- if (kitManager != null) {
- userAttributes = kitManager.getDataplanFilter().transformUserAttributes(userAttributes);
- }
- Map attributes = (Map) KitConfiguration.filterAttributes(
- getConfiguration().getUserAttributeFilters(),
- userAttributes
- );
- if ((this instanceof AttributeListener) && ((AttributeListener) this).supportsAttributeLists()) {
- return attributes;
- } else {
- for (Map.Entry entry : attributes.entrySet()) {
- if (entry.getValue() instanceof List) {
- attributes.put(entry.getKey(), KitUtils.join((List) entry.getValue()));
- }
- }
- return attributes;
- }
- }
- }
- return new HashMap();
- }
-
public final MParticleUser getCurrentUser() {
MParticle instance = MParticle.getInstance();
if (instance != null) {
diff --git a/android-kit-base/src/test/kotlin/com/mparticle/kits/KitIntegrationTest.kt b/android-kit-base/src/test/kotlin/com/mparticle/kits/KitIntegrationTest.kt
deleted file mode 100644
index dd8c8b096..000000000
--- a/android-kit-base/src/test/kotlin/com/mparticle/kits/KitIntegrationTest.kt
+++ /dev/null
@@ -1,235 +0,0 @@
-package com.mparticle.kits
-
-import android.content.Context
-import android.util.SparseBooleanArray
-import com.mparticle.MParticle
-import com.mparticle.MParticle.IdentityType
-import com.mparticle.internal.Logger
-import com.mparticle.internal.MPUtility
-import com.mparticle.kits.KitIntegration.AttributeListener
-import com.mparticle.mock.MockMParticle
-import org.junit.Assert
-import org.junit.Test
-import org.mockito.Mockito
-import java.util.LinkedList
-
-class KitIntegrationTest {
- @Test
- @Throws(Exception::class)
- fun testGetAllUserAttributesWithoutLists() {
- MParticle.setInstance(MockMParticle())
- val integration: KitIntegration =
- object : KitIntegration() {
- override fun getName(): String? = null
-
- override fun onKitCreate(
- settings: Map,
- context: Context,
- ): List? = null
-
- override fun setOptOut(optedOut: Boolean): List? = null
- }
- integration.configuration = Mockito.mock(KitConfiguration::class.java)
- val attributes: MutableMap = HashMap()
- attributes["key 1"] = "value 1"
- val list: MutableList = LinkedList()
- list.add("value 2")
- list.add("value 3")
- attributes["key 2"] = list
- Mockito
- .`when`(
- MParticle
- .getInstance()!!
- .Identity()
- .currentUser!!
- .userAttributes,
- ).thenReturn(attributes)
- val filteredAttributes = integration.allUserAttributes
- Assert.assertEquals("value 1", filteredAttributes["key 1"])
- Assert.assertEquals("value 2,value 3", filteredAttributes["key 2"])
- }
-
- internal inner class MockSparseBooleanArray : SparseBooleanArray() {
- override fun get(key: Int): Boolean = get(key, false)
-
- override fun get(
- key: Int,
- valueIfKeyNotFound: Boolean,
- ): Boolean {
- Logger.verbose("SparseArray getting: $key")
- return if (map.containsKey(key)) {
- map[key]!!
- } else {
- valueIfKeyNotFound
- }
- }
-
- var map: MutableMap = HashMap()
-
- override fun put(
- key: Int,
- value: Boolean,
- ) {
- map[key] = value
- }
-
- override fun clear() {
- map.clear()
- }
-
- override fun size(): Int = map.size
-
- override fun toString(): String = map.toString()
- }
-
- @Test
- @Throws(Exception::class)
- fun testGetAllUserAttributesWithoutListsWithFilters() {
- MParticle.setInstance(MockMParticle())
- val integration: KitIntegration =
- object : KitIntegration() {
- override fun getName(): String? = null
-
- override fun onKitCreate(
- settings: Map,
- context: Context,
- ): List? = null
-
- override fun setOptOut(optedOut: Boolean): List? = null
- }
- val configuration =
- Mockito.mock(
- KitConfiguration::class.java,
- )
- val mockArray = MockSparseBooleanArray()
- mockArray.put(MPUtility.mpHash("key 4"), false)
- mockArray.put(MPUtility.mpHash("key 3"), false)
- Mockito.`when`(configuration.userAttributeFilters).thenReturn(mockArray)
- integration.configuration = configuration
- val attributes: MutableMap = HashMap()
- attributes["key 1"] = "value 1"
- attributes["key 4"] = "value 4"
- val list: MutableList = LinkedList()
- list.add("value 2")
- list.add("value 3")
- attributes["key 2"] = list
- attributes["key 3"] = list
- Mockito
- .`when`(
- MParticle
- .getInstance()!!
- .Identity()
- .currentUser!!
- .userAttributes,
- ).thenReturn(attributes)
- val filteredAttributes = integration.allUserAttributes
- Assert.assertEquals("value 1", filteredAttributes["key 1"])
- Assert.assertEquals("value 2,value 3", filteredAttributes["key 2"])
- Assert.assertNull(filteredAttributes["key 3"])
- Assert.assertNull(filteredAttributes["key 4"])
- }
-
- @Test
- @Throws(Exception::class)
- fun testGetAllUserAttributesWithLists() {
- MParticle.setInstance(MockMParticle())
- val integration: KitIntegration = AttributeListenerIntegration()
- integration.configuration = Mockito.mock(KitConfiguration::class.java)
- val attributes: MutableMap = HashMap()
- attributes["key 1"] = "value 1"
- val list: MutableList = LinkedList()
- list.add("value 2")
- list.add("value 3")
- attributes["key 2"] = list
- Mockito
- .`when`(
- MParticle
- .getInstance()!!
- .Identity()
- .currentUser!!
- .userAttributes,
- ).thenReturn(attributes)
- val filteredAttributes = integration.allUserAttributes
- Assert.assertEquals("value 1", filteredAttributes["key 1"])
- Assert.assertEquals(list, filteredAttributes["key 2"])
- }
-
- @Test
- @Throws(Exception::class)
- fun testGetAllUserAttributesWithListsAndFilters() {
- MParticle.setInstance(MockMParticle())
- val integration: KitIntegration = AttributeListenerIntegration()
- val configuration =
- Mockito.mock(
- KitConfiguration::class.java,
- )
- val mockArray = MockSparseBooleanArray()
- mockArray.put(MPUtility.mpHash("key 4"), false)
- mockArray.put(MPUtility.mpHash("key 3"), false)
- Mockito.`when`(configuration.userAttributeFilters).thenReturn(mockArray)
- integration.configuration = configuration
- val attributes: MutableMap = HashMap()
- attributes["key 1"] = "value 1"
- attributes["key 4"] = "value 4"
- val list: MutableList = LinkedList()
- list.add("value 2")
- list.add("value 3")
- attributes["key 2"] = list
- attributes["key 3"] = list
- Mockito
- .`when`(
- MParticle
- .getInstance()!!
- .Identity()
- .currentUser!!
- .userAttributes,
- ).thenReturn(attributes)
- val filteredAttributes = integration.allUserAttributes
- Assert.assertEquals("value 1", filteredAttributes["key 1"])
- Assert.assertEquals(list, filteredAttributes["key 2"])
- Assert.assertNull(filteredAttributes["key 3"])
- Assert.assertNull(filteredAttributes["key 4"])
- }
-
- private inner class AttributeListenerIntegration :
- KitIntegration(),
- AttributeListener {
- override fun setUserAttribute(
- attributeKey: String,
- attributeValue: String,
- ) {}
-
- override fun setUserAttributeList(
- attributeKey: String,
- attributeValueList: List,
- ) {}
-
- override fun supportsAttributeLists(): Boolean = true
-
- override fun setAllUserAttributes(
- userAttributes: Map,
- userAttributeLists: Map>,
- ) {
- }
-
- override fun removeUserAttribute(key: String) {}
-
- override fun setUserIdentity(
- identityType: IdentityType,
- identity: String,
- ) {}
-
- override fun removeUserIdentity(identityType: IdentityType) {}
-
- override fun logout(): List? = null
-
- override fun getName(): String? = null
-
- override fun onKitCreate(
- settings: Map,
- context: Context,
- ): List? = null
-
- override fun setOptOut(optedOut: Boolean): List? = null
- }
-}