Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import com.mparticle.Utils.randomString
import com.mparticle.identity.IdentityApiRequest
import com.mparticle.internal.AccessUtils
import com.mparticle.kits.DataplanFilterImpl.Companion.getEventsApiName
import com.mparticle.kits.testkits.AttributeListenerTestKit
import com.mparticle.kits.testkits.IdentityListenerTestKit
import com.mparticle.kits.testkits.ListenerTestKit
import com.mparticle.kits.testkits.ModifyIdentityListenerTestKit
import com.mparticle.kits.testkits.UserAttributeListenerTestKit
import com.mparticle.testutils.MPLatch
import org.junit.Assert.assertEquals
Expand All @@ -25,7 +25,7 @@ import org.junit.Test
import kotlin.random.Random

class DataplanBlockingUserTests : BaseKitOptionsTest() {
private lateinit var attributeListenerKitKit: AttributeListenerTestKit
private lateinit var attributeListenerKitKit: ModifyIdentityListenerTestKit
private lateinit var identityListenerKitKit: IdentityListenerTestKit
private lateinit var userAttributeListenerKitKit: UserAttributeListenerTestKit
private lateinit var kitIntegrationTestKits: List<ListenerTestKit>
Expand All @@ -36,15 +36,15 @@ class DataplanBlockingUserTests : BaseKitOptionsTest() {
.builder(mContext)
.configuration(
KitOptions {
addKit(-1, AttributeListenerTestKit::class.java)
addKit(-1, ModifyIdentityListenerTestKit::class.java)
addKit(-2, IdentityListenerTestKit::class.java)
addKit(-3, UserAttributeListenerTestKit::class.java)
},
).let {
startMParticle(it)
}
attributeListenerKitKit =
MParticle.getInstance()?.getKitInstance(-1) as AttributeListenerTestKit
MParticle.getInstance()?.getKitInstance(-1) as ModifyIdentityListenerTestKit
identityListenerKitKit =
MParticle.getInstance()?.getKitInstance(-2) as IdentityListenerTestKit
userAttributeListenerKitKit =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import com.mparticle.MParticle
import com.mparticle.MParticleOptions
import com.mparticle.internal.ConfigManager
import com.mparticle.internal.KitManager
import com.mparticle.kits.testkits.AttributeListenerTestKit
import com.mparticle.kits.testkits.IdentityListenerTestKit
import com.mparticle.kits.testkits.ModifyIdentityListenerTestKit
import com.mparticle.kits.testkits.UserAttributeListenerTestKit
import com.mparticle.networking.Matcher
import com.mparticle.testutils.MPLatch
Expand All @@ -22,7 +22,7 @@ class KitManagerImplTests : BaseKitOptionsTest() {
@Test
fun testKitIntializationViaKitOptions() {
KitOptions()
.addKit(1001, AttributeListenerTestKit::class.java)
.addKit(1001, ModifyIdentityListenerTestKit::class.java)
.addKit(1002, IdentityListenerTestKit::class.java)
.addKit(1003, UserAttributeListenerTestKit::class.java)
.let {
Expand All @@ -35,7 +35,7 @@ class KitManagerImplTests : BaseKitOptionsTest() {

fun getKit(kitId: Int) = MParticle.getInstance()?.getKitInstance(kitId)

assertTrue(getKit(1001) is AttributeListenerTestKit)
assertTrue(getKit(1001) is ModifyIdentityListenerTestKit)
assertTrue(getKit(1002) is IdentityListenerTestKit)
assertTrue(getKit(1003) is UserAttributeListenerTestKit)
}
Expand All @@ -62,10 +62,10 @@ class KitManagerImplTests : BaseKitOptionsTest() {
.builder(mContext)
.configuration(
ConfiguredKitOptions {
addKit(-1, AttributeListenerTestKit::class.java, JSONObject().put("eau", true))
addKit(-1, ModifyIdentityListenerTestKit::class.java, JSONObject().put("eau", true))
addKit(-2, IdentityListenerTestKit::class.java)
addKit(-3, UserAttributeListenerTestKit::class.java)
addKit(-4, AttributeListenerTestKit::class.java, JSONObject().put("eau", true))
addKit(-4, ModifyIdentityListenerTestKit::class.java, JSONObject().put("eau", true))
addKit(-5, IdentityListenerTestKit::class.java)
addKit(-6, UserAttributeListenerTestKit::class.java)
}.apply {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package com.mparticle.kits.testkits

import com.mparticle.MParticle
import com.mparticle.consent.ConsentState
import com.mparticle.kits.FilteredMParticleUser
import com.mparticle.kits.KitIntegration.AttributeListener
import com.mparticle.kits.KitIntegration.LogoutListener
import com.mparticle.kits.KitIntegration.ModifyIdentityListener
import com.mparticle.kits.KitIntegration.UserAttributeListener
import com.mparticle.kits.ReportingMessage

open class AttributeListenerTestKit :
open class ModifyIdentityListenerTestKit :
ListenerTestKit(),
AttributeListener,
UserAttributeListener,
ModifyIdentityListener,
LogoutListener {
var setUserAttributeCallback: ((attributeKey: String?, attributeValue: String?) -> Unit)? = null
var setUserAttributeList: ((attributeKey: String?, attributeValueList: List<String>?) -> Unit)? =
Expand Down Expand Up @@ -76,5 +79,26 @@ open class AttributeListenerTestKit :
onAttributeReceived?.invoke(key, value)
}

override fun onIncrementUserAttribute(
key: String?,
incrementedBy: Number?,
value: String?,
user: FilteredMParticleUser?,
) {
}

override fun onSetUserTag(
key: String?,
user: FilteredMParticleUser?,
) {
}

override fun onConsentStateUpdated(
oldState: ConsentState?,
newState: ConsentState?,
user: FilteredMParticleUser?,
) {
}

override fun logout(): List<ReportingMessage> = logout?.invoke() ?: listOf()
}
Original file line number Diff line number Diff line change
Expand Up @@ -361,69 +361,10 @@ public interface LogoutListener {
}

/**
* Temporary shared contract used while {@link AttributeListener} behavior is migrated to
* {@link UserAttributeListener}. Factoring out common API surface lets the SDK land incremental changes
* and smaller pull requests instead of a single large refactor.
* <p>
* Kits implement {@link AttributeListener} and/or {@link UserAttributeListener}; they do not implement this
* type directly.
* Identity forwarding for kits that also receive user attribute callbacks. Implement together with
* {@link UserAttributeListener} when the kit should receive user attribute updates.
*/
@Deprecated
public interface BaseAttributeListener {

/**
* Indicate to the mParticle Kit framework if this listener supports attribute-values as lists.
* <p>
* If false, list-specific APIs are not used; values are passed via scalar/csv paths instead.
*
* @return true if this listener supports attribute values as lists.
*/
boolean supportsAttributeLists();

/**
* Called when a user attribute is removed for the current user.
*
* @param key attribute key
* @param user filtered user context for this kit
*/
void onRemoveUserAttribute(String key, FilteredMParticleUser user);

/**
* Called when a scalar user attribute is set for the current user.
*
* @param key attribute key
* @param value attribute value (may be non-String for some {@link UserAttributeListener} call paths)
* @param user filtered user context for this kit
*/
void onSetUserAttribute(String key, Object value, FilteredMParticleUser user);

/**
* Called when a list-valued user attribute is set and {@link #supportsAttributeLists()} returns true.
*
* @param attributeKey attribute key (may be null)
* @param attributeValueList attribute values (may be null)
* @param user filtered user context for this kit (may be null)
*/
void onSetUserAttributeList(
@Nullable String attributeKey,
@Nullable List<String> attributeValueList,
@Nullable FilteredMParticleUser user);

/**
* Called when the full set of user attributes is synchronized for the current user.
*
* @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<String, String> userAttributes,
Map<String, List<String>> userAttributeLists,
FilteredMParticleUser user);
}

public interface AttributeListener extends BaseAttributeListener {
public interface ModifyIdentityListener {

void setUserIdentity(MParticle.IdentityType identityType, String identity);

Expand Down Expand Up @@ -580,14 +521,68 @@ public interface IdentityListener {

}

public interface UserAttributeListener extends BaseAttributeListener {
/**
* Kits should implement this interface to receive user attribute updates, tags, increments, consent changes,
* and full attribute syncs from the mParticle SDK.
*/
public interface UserAttributeListener {

/**
* Indicate to the mParticle Kit framework if this listener supports attribute-values as lists.
* <p>
* If false, list-specific APIs are not used; values are passed via scalar/csv paths instead.
*
* @return true if this listener supports attribute values as lists.
*/
boolean supportsAttributeLists();

/**
* Called when a user attribute is removed for the current user.
*
* @param key attribute key
* @param user filtered user context for this kit
*/
void onRemoveUserAttribute(String key, FilteredMParticleUser user);

/**
* Called when a scalar user attribute is set for the current user.
*
* @param key attribute key
* @param value attribute value (may be non-String for some call paths)
* @param user filtered user context for this kit
*/
void onSetUserAttribute(String key, Object value, FilteredMParticleUser user);

/**
* Called when a list-valued user attribute is set and {@link #supportsAttributeLists()} returns true.
*
* @param attributeKey attribute key (may be null)
* @param attributeValueList attribute values (may be null)
* @param user filtered user context for this kit (may be null)
*/
void onSetUserAttributeList(
@Nullable String attributeKey,
@Nullable List<String> attributeValueList,
@Nullable FilteredMParticleUser user);

/**
* Called when the full set of user attributes is synchronized for the current user.
*
* @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<String, String> userAttributes,
Map<String, List<String>> userAttributeLists,
FilteredMParticleUser user);

void onIncrementUserAttribute(String key, Number incrementedBy, String value, FilteredMParticleUser user);

void onSetUserTag(String key, FilteredMParticleUser user);

void onConsentStateUpdated(ConsentState oldState, ConsentState newState, FilteredMParticleUser user);

}

public interface BatchListener {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,8 @@
}
}

if (activeKit instanceof KitIntegration.AttributeListener) {
syncUserIdentities((KitIntegration.AttributeListener) activeKit, activeKit.getConfiguration());
if (activeKit instanceof KitIntegration.ModifyIdentityListener) {

Check warning on line 313 in android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this instanceof check and cast with 'instanceof ModifyIdentityListener modifyidentitylistener'

See more on https://sonarcloud.io/project/issues?id=mParticle_mparticle-android-sdk&issues=AZ1OzS_AUjsYa_fHe7Px&open=AZ1OzS_AUjsYa_fHe7Px&pullRequest=692
syncUserIdentities((KitIntegration.ModifyIdentityListener) activeKit, activeKit.getConfiguration());
}

MParticle instance = MParticle.getInstance();
Expand Down Expand Up @@ -592,14 +592,14 @@
}

//================================================================================
// KitIntegration.AttributeListener forwarding
// UserAttributeListener user-attribute forwarding
//================================================================================
public void onUserAttributesReceived(Map<String, String> userAttributes, Map<String, List<String>> userAttributeLists, Long mpid) {
userAttributes = mDataplanFilter.transformUserAttributes(userAttributes);
userAttributeLists = mDataplanFilter.transformUserAttributes(userAttributeLists);
for (KitIntegration provider : providers.values()) {
try {
if ((provider instanceof KitIntegration.BaseAttributeListener listener)
if ((provider instanceof KitIntegration.UserAttributeListener listener)
&& !provider.isDisabled()) {
Map<String, String> filteredAttributeSingles = (Map<String, String>) KitConfiguration.filterAttributes(provider.getConfiguration().getUserAttributeFilters(),
userAttributes);
Expand All @@ -623,7 +623,7 @@
}
}

private void syncUserIdentities(KitIntegration.AttributeListener attributeListener, KitConfiguration configuration) {
private void syncUserIdentities(KitIntegration.ModifyIdentityListener listener, KitConfiguration configuration) {
MParticle instance = MParticle.getInstance();
if (instance != null) {
MParticleUser user = instance.Identity().getCurrentUser();
Expand All @@ -632,7 +632,7 @@
if (identities != null) {
for (Map.Entry<MParticle.IdentityType, String> entry : identities.entrySet()) {
if (configuration.shouldSetIdentity(entry.getKey())) {
attributeListener.setUserIdentity(entry.getKey(), entry.getValue());
listener.setUserIdentity(entry.getKey(), entry.getValue());
}
}
}
Expand Down Expand Up @@ -669,7 +669,7 @@
}

private void setUserAttribute(KitIntegration provider, String attributeKey, List<String> valueList, long mpid) {
if ((provider instanceof KitIntegration.BaseAttributeListener listener)
if ((provider instanceof KitIntegration.UserAttributeListener listener)
&& !provider.isDisabled()
&& KitConfiguration.shouldForwardAttribute(provider.getConfiguration().getUserAttributeFilters(), attributeKey)) {
boolean supportsAttributeLists = listener.supportsAttributeLists();
Expand All @@ -683,7 +683,7 @@
}

private void setUserAttribute(KitIntegration provider, String attributeKey, String attributeValue, long mpid) {
if ((provider instanceof KitIntegration.BaseAttributeListener listener)
if ((provider instanceof KitIntegration.UserAttributeListener listener)
&& !provider.isDisabled()
&& KitConfiguration.shouldForwardAttribute(provider.getConfiguration().getUserAttributeFilters(),
attributeKey)) {
Expand All @@ -698,7 +698,7 @@
}
for (KitIntegration provider : providers.values()) {
try {
if ((provider instanceof KitIntegration.BaseAttributeListener listener)
if ((provider instanceof KitIntegration.UserAttributeListener listener)
&& !provider.isDisabled()
&& KitConfiguration.shouldForwardAttribute(provider.getConfiguration().getUserAttributeFilters(), key)) {
listener.onRemoveUserAttribute(key, FilteredMParticleUser.getInstance(mpid, provider));
Expand All @@ -716,12 +716,11 @@
}
for (KitIntegration provider : providers.values()) {
try {
if (!provider.isDisabled() && KitConfiguration.shouldForwardAttribute(provider.getConfiguration().getUserAttributeFilters(), key))
if (provider instanceof KitIntegration.UserAttributeListener) {
((KitIntegration.UserAttributeListener) provider).onIncrementUserAttribute(key, incrementedBy, newValue, FilteredMParticleUser.getInstance(mpid, provider));
if (!provider.isDisabled() && KitConfiguration.shouldForwardAttribute(provider.getConfiguration().getUserAttributeFilters(), key)) {
if (provider instanceof KitIntegration.UserAttributeListener listener) {

Check warning on line 720 in android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Merge this if statement with the enclosing one.

See more on https://sonarcloud.io/project/issues?id=mParticle_mparticle-android-sdk&issues=AZ1OzS_AUjsYa_fHe7Pw&open=AZ1OzS_AUjsYa_fHe7Pw&pullRequest=692
listener.onIncrementUserAttribute(key, incrementedBy, newValue, FilteredMParticleUser.getInstance(mpid, provider));
listener.onSetUserAttribute(key, newValue, FilteredMParticleUser.getInstance(mpid, provider));
}
if (provider instanceof KitIntegration.BaseAttributeListener listener) {
listener.onSetUserAttribute(key, newValue, FilteredMParticleUser.getInstance(mpid, provider));
}
} catch (Exception e) {
Logger.warning("Failed to call onIncrementUserAttribute for kit: " + provider.getName() + ": " + e.getMessage());
Expand Down Expand Up @@ -753,8 +752,8 @@
}
for (KitIntegration provider : providers.values()) {
try {
if (provider instanceof KitIntegration.AttributeListener && !provider.isDisabled() && provider.getConfiguration().shouldSetIdentity(identityType)) {
((KitIntegration.AttributeListener) provider).setUserIdentity(identityType, id);
if (provider instanceof KitIntegration.ModifyIdentityListener && !provider.isDisabled() && provider.getConfiguration().shouldSetIdentity(identityType)) {

Check warning on line 755 in android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this instanceof check and cast with 'instanceof ModifyIdentityListener modifyidentitylistener'

See more on https://sonarcloud.io/project/issues?id=mParticle_mparticle-android-sdk&issues=AZ1OzS_AUjsYa_fHe7Py&open=AZ1OzS_AUjsYa_fHe7Py&pullRequest=692
((KitIntegration.ModifyIdentityListener) provider).setUserIdentity(identityType, id);
}
} catch (Exception e) {
Logger.warning("Failed to call setUserIdentity for kit: " + provider.getName() + ": " + e.getMessage());
Expand All @@ -769,8 +768,8 @@
}
for (KitIntegration provider : providers.values()) {
try {
if (provider instanceof KitIntegration.AttributeListener && !provider.isDisabled()) {
((KitIntegration.AttributeListener) provider).removeUserIdentity(identityType);
if (provider instanceof KitIntegration.ModifyIdentityListener && !provider.isDisabled()) {

Check warning on line 771 in android-kit-base/src/main/java/com/mparticle/kits/KitManagerImpl.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Replace this instanceof check and cast with 'instanceof ModifyIdentityListener modifyidentitylistener'

See more on https://sonarcloud.io/project/issues?id=mParticle_mparticle-android-sdk&issues=AZ1OzS_AUjsYa_fHe7Pz&open=AZ1OzS_AUjsYa_fHe7Pz&pullRequest=692
((KitIntegration.ModifyIdentityListener) provider).removeUserIdentity(identityType);
}
} catch (Exception e) {
Logger.warning("Failed to call removeUserIdentity for kit: " + provider.getName() + ": " + e.getMessage());
Expand Down
Loading
Loading