diff --git a/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt b/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt index f0b6d0c..0226a0b 100644 --- a/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt +++ b/src/main/kotlin/com/mparticle/kits/AppsFlyerKit.kt @@ -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(1) integrationAttributes[APPSFLYERID_INTEGRATION_KEY] = @@ -559,7 +558,9 @@ class AppsFlyerKit : activity: Activity, bundle: Bundle?, ): List { - instance.start(activity) + if (!isManualStart()) { + instance.start(activity) + } return emptyList() } @@ -578,31 +579,7 @@ class AppsFlyerKit : override fun onActivityDestroyed(activity: Activity): List = emptyList() - override fun onSettingsUpdated(settings: Map) { - 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? { - 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" @@ -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") diff --git a/src/test/kotlin/com/appsflyer/AppsFlyerLib.kt b/src/test/kotlin/com/appsflyer/AppsFlyerLib.kt index 0ce8e82..c5443c2 100644 --- a/src/test/kotlin/com/appsflyer/AppsFlyerLib.kt +++ b/src/test/kotlin/com/appsflyer/AppsFlyerLib.kt @@ -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 { val stateMap = mutableMapOf() consentData?.let { consent -> diff --git a/src/test/kotlin/com/mparticle/kits/AppsflyerKitTests.kt b/src/test/kotlin/com/mparticle/kits/AppsflyerKitTests.kt index f83866d..c79c7a6 100644 --- a/src/test/kotlin/com/mparticle/kits/AppsflyerKitTests.kt +++ b/src/test/kotlin/com/mparticle/kits/AppsflyerKitTests.kt @@ -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. * @@ -776,6 +725,69 @@ class AppsflyerKitTests { Assert.assertEquals(emptyMap(), 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) { + 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()