diff --git a/src/main/kotlin/com/mparticle/kits/AppboyKit.kt b/src/main/kotlin/com/mparticle/kits/AppboyKit.kt index f170d98..3002ded 100644 --- a/src/main/kotlin/com/mparticle/kits/AppboyKit.kt +++ b/src/main/kotlin/com/mparticle/kits/AppboyKit.kt @@ -47,6 +47,7 @@ open class AppboyKit : KitIntegration(), AttributeListener, CommerceListener, var bundleCommerceEvents = false var isMpidIdentityType = false var identityType: IdentityType? = null + var subscriptionGroupIds: MutableMap? = mutableMapOf() private val dataFlushHandler = Handler() private var dataFlushRunnable: Runnable? = null private var forwardScreenViews = false @@ -85,6 +86,9 @@ open class AppboyKit : KitIntegration(), AttributeListener, CommerceListener, } } forwardScreenViews = settings[FORWARD_SCREEN_VIEWS].toBoolean() + subscriptionGroupIds = settings[SUBSCRIPTION_GROUP_MAPPING]?.let { + getSubscriptionGroupIds(it) + } if (key != null) { val config = BrazeConfig.Builder().setApiKey(key) .setSdkFlavor(SdkFlavor.MPARTICLE) @@ -318,10 +322,29 @@ open class AppboyKit : KitIntegration(), AttributeListener, CommerceListener, else value.setGender(Gender.MALE) } else -> { - if (key.startsWith("$")) { - key = key.substring(1) + if (subscriptionGroupIds?.containsKey(key) == true) { + val groupId = subscriptionGroupIds?.get(key) + when (attributeValue.lowercase()) { + "true" -> { + groupId?.let { value.addToSubscriptionGroup(it) } + } + + "false" -> { + groupId?.let { value.removeFromSubscriptionGroup(it) } + } + + else -> { + Logger.warning( + "Unable to set Subscription Group ID for user attribute: $key due to invalid value data type. Expected Boolean." + ) + } + } + } else { + if (key.startsWith("$")) { + key = key.substring(1) + } + userAttributeSetter?.parseValue(key, attributeValue) } - userAttributeSetter?.parseValue(key, attributeValue) } } queueDataFlush() @@ -966,6 +989,29 @@ open class AppboyKit : KitIntegration(), AttributeListener, CommerceListener, return promotionArray } + private fun getSubscriptionGroupIds(subscriptionGroupMap: String): MutableMap { + val subscriptionGroupIds = mutableMapOf() + + if (subscriptionGroupMap.isEmpty()) { + return subscriptionGroupIds + } + + val subscriptionGroupsArray = JSONArray(subscriptionGroupMap) + + return try { + for (i in 0 until subscriptionGroupsArray.length()) { + val subscriptionGroup = subscriptionGroupsArray.getJSONObject(i) + val key = subscriptionGroup.getString("map") + val value = subscriptionGroup.getString("value") + subscriptionGroupIds[key] = value + } + subscriptionGroupIds + } catch (e: JSONException) { + Logger.warning("Braze, unable to parse \"subscriptionGroup\"") + mutableMapOf() + } + } + fun getImpressionListParameters(impressionList: List): JSONArray { val impressionArray = JSONArray() for ((i, impression) in impressionList.withIndex()) { @@ -1083,6 +1129,7 @@ open class AppboyKit : KitIntegration(), AttributeListener, CommerceListener, const val USER_IDENTIFICATION_TYPE = "userIdentificationType" const val ENABLE_TYPE_DETECTION = "enableTypeDetection" const val BUNDLE_COMMERCE_EVENTS = "bundleCommerceEventData" + const val SUBSCRIPTION_GROUP_MAPPING = "subscriptionGroupMapping" const val HOST = "host" const val PUSH_ENABLED = "push_enabled" const val NAME = "Appboy" diff --git a/src/test/kotlin/com/braze/BrazeUser.kt b/src/test/kotlin/com/braze/BrazeUser.kt index 71fdd40..97be7cf 100644 --- a/src/test/kotlin/com/braze/BrazeUser.kt +++ b/src/test/kotlin/com/braze/BrazeUser.kt @@ -58,6 +58,16 @@ class BrazeUser { return true } + fun addToSubscriptionGroup(key: String): Boolean { + customUserAttributes[key] = true + return true + } + + fun removeFromSubscriptionGroup(key: String): Boolean { + customUserAttributes[key] = false + return true + } + fun getCustomAttribute(): HashMap> { return customAttributeArray } diff --git a/src/test/kotlin/com/mparticle/kits/AppboyKitTest.kt b/src/test/kotlin/com/mparticle/kits/AppboyKitTest.kt index e409aad..b3ade6b 100644 --- a/src/test/kotlin/com/mparticle/kits/AppboyKitTest.kt +++ b/src/test/kotlin/com/mparticle/kits/AppboyKitTest.kt @@ -238,6 +238,25 @@ class AppboyKitTests { Assert.assertNull(kit.getCalendarMinusYears(-1)) } + @Test + fun testSetSubscriptionGroupIds() { + val settings = HashMap() + settings[AppboyKit.APPBOY_KEY] = "key" + settings[AppboyKit.HOST] = hostName + settings["subscriptionGroupMapping"] = "" + + "[{\"jsmap\":null,\"map\":\"test1\",\"maptype\":\"UserAttributeClass.Name\",\"value\":\"00000000-0000-0000-0000-000000000000\"}," + + "{\"jsmap\":null,\"map\":\"test2\",\"maptype\":\"UserAttributeClass.Name\",\"value\":\"00000000-0000-0000-0000-000000000001\"}," + + "{\"jsmap\":null,\"map\":\"test3\",\"maptype\":\"UserAttributeClass.Name\",\"value\":\"00000000-0000-0000-0000-000000000002\"}]" + val kit = MockAppboyKit() + val currentUser = braze.currentUser + + kit.onKitCreate(settings, MockContextApplication()) + kit.setUserAttribute("test1", "true"); + kit.setUserAttribute("test2", "false"); + kit.setUserAttribute("test3", "notABoolean"); + Assert.assertEquals(2, currentUser.getCustomUserAttribute().size.toLong()) + } + // @Test // fun testSetUserAttributeAge() { // val currentYear = Calendar.getInstance()[Calendar.YEAR]