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
39 changes: 8 additions & 31 deletions src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,11 @@ class AppsFlyerKit :
MParticle.getInstance()?.environment == MParticle.Environment.Development,
)
settings[DEV_KEY]?.let { AppsFlyerLib.getInstance().init(it, this, context) }
setting?.get(SHARING_FILTER_FOR_PARTNERS)?.let {
applySharingFilterForPartners(it)
}
val userConsentState = currentUser?.consentState
setConsent(userConsentState)
AppsFlyerLib.getInstance().start(context.applicationContext)
if (!isManualStart()) {
AppsFlyerLib.getInstance().start(context.applicationContext)
}
AppsFlyerLib.getInstance().setCollectAndroidID(MParticle.isAndroidIdEnabled())
val integrationAttributes = HashMap<String, String?>(1)
integrationAttributes[APPSFLYERID_INTEGRATION_KEY] =
Expand Down Expand Up @@ -559,7 +558,9 @@ class AppsFlyerKit :
activity: Activity,
bundle: Bundle?,
): List<ReportingMessage> {
instance.start(activity)
if (!isManualStart()) {
instance.start(activity)
}
return emptyList()
}

Expand All @@ -578,31 +579,7 @@ class AppsFlyerKit :

override fun onActivityDestroyed(activity: Activity): List<ReportingMessage> = emptyList()

override fun onSettingsUpdated(settings: Map<String, String>) {
settings[SHARING_FILTER_FOR_PARTNERS]?.let { applySharingFilterForPartners(it) }
}

private fun applySharingFilterForPartners(jsonValue: String) {
val partners = parseSharingFilterForPartners(jsonValue)
if (!partners.isNullOrEmpty()) {
instance.setSharingFilterForPartners(*partners.toTypedArray())
}
}

private fun parseSharingFilterForPartners(json: String?): List<String>? {
if (json.isNullOrEmpty()) return null
return try {
val jsonWithFormat = json.replace("\\", "")
val array = JSONArray(jsonWithFormat)
List(array.length()) { i -> array.getString(i) }
} catch (e: JSONException) {
Logger.warning(
"AppsFlyer kit: failed to parse sharingFilterForPartners, " +
"consent filter for partners will not be applied. Error: ${e.message}",
)
null
}
}
private fun isManualStart(): Boolean = settings[MANUAL_START]?.lowercase() == "true"

companion object {
const val DEV_KEY = "devKey"
Expand Down Expand Up @@ -630,7 +607,7 @@ class AppsFlyerKit :
}
}

private const val SHARING_FILTER_FOR_PARTNERS = "sharingFilterForPartners"
const val MANUAL_START = "manualStart"
private const val CONSENT_MAPPING = "consentMapping"

@Suppress("ktlint:standard:property-naming")
Expand Down
28 changes: 28 additions & 0 deletions src/test/kotlin/com/appsflyer/AppsFlyerLib.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,40 @@ import android.content.Context
class AppsFlyerLib {
private var consentData: AppsFlyerConsent? = null

var startCallCount = 0
private set

var customerUserId: String? = null
private set

fun setConsentData(consent: AppsFlyerConsent) {
consentData = consent
}

fun getConsentData(): AppsFlyerConsent? = consentData

fun start(context: Context) {
startCallCount++
}

fun setCustomerUserId(id: String?) {
customerUserId = id
}

fun init(
devKey: String,
conversionListener: Any?,
context: Context,
) {}

fun setCollectAndroidID(collect: Boolean) {}

fun getAppsFlyerUID(context: Context): String = "test-appsflyer-uid"

fun subscribeForDeepLink(listener: Any?) {}

fun setDebugLog(debug: Boolean) {}

fun getConsentState(): MutableMap<Any, Any> {
val stateMap = mutableMapOf<Any, Any>()
consentData?.let { consent ->
Expand Down
114 changes: 63 additions & 51 deletions src/test/kotlin/com/mparticle/kits/AppsflyerKitTests.kt
Original file line number Diff line number Diff line change
Expand Up @@ -76,57 +76,6 @@ class AppsflyerKitTests {
Assert.assertTrue(name.isNotEmpty())
}

@Test
@Throws(Exception::class)
fun testParseSharingFilterForPartners_returnsListForValidJson() {
val method =
AppsFlyerKit::class.java.getDeclaredMethod(
"parseSharingFilterForPartners",
String::class.java,
)
method.isAccessible = true
val result = method.invoke(kit, """["partner_1", "partner_2"]""")
Assert.assertEquals(listOf("partner_1", "partner_2"), result)
}

@Test
@Throws(Exception::class)
fun testParseSharingFilterForPartners_returnsNullForEmptyInput() {
val method =
AppsFlyerKit::class.java.getDeclaredMethod(
"parseSharingFilterForPartners",
String::class.java,
)
method.isAccessible = true
Assert.assertNull(method.invoke(kit, ""))
Assert.assertNull(method.invoke(kit, null))
}

@Test
@Throws(Exception::class)
fun testParseSharingFilterForPartners_returnsNullForInvalidJson() {
val method =
AppsFlyerKit::class.java.getDeclaredMethod(
"parseSharingFilterForPartners",
String::class.java,
)
method.isAccessible = true
Assert.assertNull(method.invoke(kit, "not a json array"))
}

@Test
@Throws(Exception::class)
fun testParseSharingFilterForPartners_stripsBackslashes() {
val method =
AppsFlyerKit::class.java.getDeclaredMethod(
"parseSharingFilterForPartners",
String::class.java,
)
method.isAccessible = true
val result = method.invoke(kit, """[\"test_1\", \"test_2\"]""")
Assert.assertEquals(listOf("test_1", "test_2"), result)
}

/**
* Kit *should* throw an exception when they're initialized with the wrong settings.
*
Expand Down Expand Up @@ -776,6 +725,69 @@ class AppsflyerKitTests {
Assert.assertEquals(emptyMap<String, String>(), result)
}

// region manualStart tests

@Test
@Throws(Exception::class)
fun testIsManualStart_returnsTrueWhenSettingIsTrue() {
setKitSettings(mapOf(AppsFlyerKit.MANUAL_START to "true"))
val method = AppsFlyerKit::class.java.getDeclaredMethod("isManualStart")
method.isAccessible = true
Assert.assertTrue(method.invoke(kit) as Boolean)
}

@Test
@Throws(Exception::class)
fun testIsManualStart_returnsFalseWhenSettingIsFalse() {
setKitSettings(mapOf(AppsFlyerKit.MANUAL_START to "false"))
val method = AppsFlyerKit::class.java.getDeclaredMethod("isManualStart")
method.isAccessible = true
Assert.assertFalse(method.invoke(kit) as Boolean)
}

@Test
@Throws(Exception::class)
fun testIsManualStart_returnsFalseWhenSettingIsAbsent() {
setKitSettings(emptyMap())
val method = AppsFlyerKit::class.java.getDeclaredMethod("isManualStart")
method.isAccessible = true
Assert.assertFalse(method.invoke(kit) as Boolean)
}

@Test
@Throws(Exception::class)
fun testOnActivityCreated_withManualStartTrue_doesNotCallStart() {
setKitSettings(
mapOf(
AppsFlyerKit.MANUAL_START to "true",
),
)
kit.onActivityCreated(mock(Activity::class.java), null)
Assert.assertEquals(0, appsflyer.startCallCount)
}

@Test
@Throws(Exception::class)
fun testOnActivityCreated_withManualStartFalse_callsStart() {
setKitSettings(
mapOf(
AppsFlyerKit.MANUAL_START to "false",
),
)
kit.onActivityCreated(mock(Activity::class.java), null)
Assert.assertEquals(1, appsflyer.startCallCount)
}

@Throws(Exception::class)
private fun setKitSettings(settings: Map<String, String>) {
val configJson = JSONObject()
configJson.put("id", "-1")
configJson.put("as", settings.toMutableMap())
kit.configuration = KitConfiguration.createKitConfiguration(configJson)
}

// endregion

private var emptyCoreCallbacks: CoreCallbacks =
object : CoreCallbacks {
var activity = Activity()
Expand Down
Loading