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 - } -}