diff --git a/android-core/src/main/java/com/mparticle/internal/KitFrameworkWrapper.java b/android-core/src/main/java/com/mparticle/internal/KitFrameworkWrapper.java index d400f30f7..f26e4f3b0 100644 --- a/android-core/src/main/java/com/mparticle/internal/KitFrameworkWrapper.java +++ b/android-core/src/main/java/com/mparticle/internal/KitFrameworkWrapper.java @@ -715,6 +715,13 @@ public void close() { } } + @Override + public void prepareAttributesAsync(@NonNull Map attributes) { + if (mKitManager != null) { + mKitManager.prepareAttributesAsync(attributes); + } + } + static class CoreCallbacksImpl implements CoreCallbacks { KitFrameworkWrapper mKitFrameworkWrapper; ConfigManager mConfigManager; diff --git a/android-core/src/main/java/com/mparticle/internal/KitManager.java b/android-core/src/main/java/com/mparticle/internal/KitManager.java index eac6f4e92..716f526d2 100644 --- a/android-core/src/main/java/com/mparticle/internal/KitManager.java +++ b/android-core/src/main/java/com/mparticle/internal/KitManager.java @@ -148,6 +148,8 @@ void execute(@NonNull String identifier, void close(); + void prepareAttributesAsync(@NonNull Map attributes); + enum KitStatus { NOT_CONFIGURED, STOPPED, 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 11fac2c05..878889e1d 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 @@ -628,6 +628,8 @@ void execute(@NonNull String viewName, Flow events(@NonNull String identifier); + void enrichAttributes( + @NonNull Map attributes, @Nullable FilteredMParticleUser user); /** * Set the SDK version of the mParticle SDK. * This should match the value set in MParticle.getWrapperSdkVersion() 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 280030bab..3acdfc1fc 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 @@ -35,11 +35,8 @@ import com.mparticle.identity.IdentityApi; import com.mparticle.identity.IdentityApiRequest; import com.mparticle.identity.IdentityApiResult; -import com.mparticle.identity.IdentityHttpResponse; import com.mparticle.identity.IdentityStateListener; import com.mparticle.identity.MParticleUser; -import com.mparticle.identity.TaskFailureListener; -import com.mparticle.identity.TaskSuccessListener; import com.mparticle.internal.Constants; import com.mparticle.internal.CoreCallbacks; import com.mparticle.internal.KitManager; @@ -1366,41 +1363,9 @@ public void execute(@NonNull String viewName, MParticleUser user = instance.Identity().getCurrentUser(); String email = getValueIgnoreCase(attributes, "email"); String hashedEmail = getValueIgnoreCase(attributes, "emailsha256"); - Map finalAttributes = attributes; + Map tempAttributes = attributes; confirmEmail(email, hashedEmail, user, instance.Identity(), () -> { - JSONArray jsonArray = new JSONArray(); - - KitConfiguration kitConfig = provider.getConfiguration(); - if (kitConfig != null) { - try { - jsonArray = kitConfig.getPlacementAttributesMapping(); - } catch (JSONException e) { - Logger.warning("Invalid placementAttributes for kit: " + provider.getName() + " JSON: " + e.getMessage()); - } - } - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject obj = jsonArray.optJSONObject(i); - if (obj == null) continue; - String mapFrom = obj.optString("map"); - String mapTo = obj.optString("value"); - if (finalAttributes.containsKey(mapFrom)) { - String value = finalAttributes.remove(mapFrom); - finalAttributes.put(mapTo, value); - } - } - Map objectAttributes = new HashMap<>(); - for (Map.Entry entry : finalAttributes.entrySet()) { - if (!entry.getKey().equals(Constants.MessageKey.SANDBOX_MODE_ROKT)) { - objectAttributes.put(entry.getKey(), entry.getValue()); - } - } - if (user != null) { - user.setUserAttributes(objectAttributes); - } - - if (!finalAttributes.containsKey(Constants.MessageKey.SANDBOX_MODE_ROKT)) { - finalAttributes.put(Constants.MessageKey.SANDBOX_MODE_ROKT, Objects.toString(MPUtility.isDevEnv(), "false")); // Default value is "false" if null - } + Map finalAttributes = prepareAttributes(provider, tempAttributes, user); ((KitIntegration.RoktListener) provider).execute(viewName, finalAttributes, @@ -1426,6 +1391,43 @@ private String getValueIgnoreCase(Map map, String searchKey) { return null; } + private Map prepareAttributes(KitIntegration provider, Map finalAttributes, MParticleUser user){ + JSONArray jsonArray = new JSONArray(); + + KitConfiguration kitConfig = provider.getConfiguration(); + if (kitConfig != null) { + try { + jsonArray = kitConfig.getPlacementAttributesMapping(); + } catch (JSONException e) { + Logger.warning("Invalid placementAttributes for kit: " + provider.getName() + " JSON: " + e.getMessage()); + } + } + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject obj = jsonArray.optJSONObject(i); + if (obj == null) continue; + String mapFrom = obj.optString("map"); + String mapTo = obj.optString("value"); + if (finalAttributes.containsKey(mapFrom)) { + String value = finalAttributes.remove(mapFrom); + finalAttributes.put(mapTo, value); + } + } + Map objectAttributes = new HashMap<>(); + for (Map.Entry entry : finalAttributes.entrySet()) { + if(!entry.getKey().equals(Constants.MessageKey.SANDBOX_MODE_ROKT)) { + objectAttributes.put(entry.getKey(), entry.getValue()); + } + } + if (user != null) { + user.setUserAttributes(objectAttributes); + } + + if (!finalAttributes.containsKey(Constants.MessageKey.SANDBOX_MODE_ROKT)) { + finalAttributes.put(Constants.MessageKey.SANDBOX_MODE_ROKT, String.valueOf(Objects.toString(MPUtility.isDevEnv(), "false"))); // Default value is "false" if null + } + return finalAttributes; + } + @Override public Flow events(@NonNull String identifier) { for (KitIntegration provider : providers.values()) { @@ -1481,6 +1483,32 @@ public void close() { } } + @Override + public void prepareAttributesAsync(@NonNull Map attributes) { + + for (KitIntegration provider : providers.values()) { + try { + if (provider instanceof KitIntegration.RoktListener && !provider.isDisabled()) { + if (attributes == null) { + attributes = new HashMap<>(); + } + MParticle instance = MParticle.getInstance(); + MParticleUser user = instance.Identity().getCurrentUser(); + String email = attributes.get("email"); + String hashedEmail = getValueIgnoreCase(attributes, "emailsha256"); + Map tempAttributes = attributes; + confirmEmail(email, hashedEmail, user, instance.Identity(), () -> { + Map finalAttributes = prepareAttributes(provider, tempAttributes, user); + ((KitIntegration.RoktListener) provider).enrichAttributes( + finalAttributes, FilteredMParticleUser.getInstance(user.getId(), provider)); + }); + } + } catch (Exception e) { + Logger.warning("Failed to call prepareRoktListener for kit: " + provider.getName() + ": " + e.getMessage()); + } + } + } + private void confirmEmail( @Nullable String email, @Nullable String hashedEmail, 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 1f65980de..bde3571a2 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 @@ -1940,6 +1940,10 @@ class KitManagerImplTest { return flowOf() } + override fun enrichAttributes(attributes: MutableMap, user: FilteredMParticleUser?) { + println("callRoktComposable with $attributes") + } + override fun setWrapperSdkVersion(wrapperSdkVersion: WrapperSdkVersion) { println("setWrapperSdkVersion with $wrapperSdkVersion") }