Skip to content

Commit 6e55191

Browse files
authored
Allow multiple CT instance callbacks (#529)
1 parent d1da6f0 commit 6e55191

File tree

6 files changed

+61
-28
lines changed

6 files changed

+61
-28
lines changed

AndroidSDKCore/src/main/java/com/leanplum/Leanplum.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
import androidx.annotation.NonNull;
2929
import androidx.annotation.Nullable;
30-
import com.clevertap.android.sdk.CleverTapAPI;
3130
import com.leanplum.ActionContext.ContextualValues;
3231
import com.leanplum.actions.internal.ActionDefinition;
3332
import com.leanplum.actions.internal.ActionManagerDefinitionKt;
@@ -2401,12 +2400,23 @@ public static boolean isPushDeliveryTrackingEnabled() {
24012400
}
24022401

24032402
/**
2404-
* Sets callback object to be notified when CleverTapAPI instance is created.
2403+
* Adds a callback object to be notified when CleverTapAPI instance is created.
24052404
* Use this callback to initialise any CleverTap state.
24062405
*
2407-
* @param callback Null value will remove the callback.
2406+
* Remove callback with {@link #removeCleverTapInstanceCallback(CleverTapInstanceCallback)}.
2407+
*
2408+
* @param callback Your callback instance.
2409+
*/
2410+
public static void addCleverTapInstanceCallback(@NonNull CleverTapInstanceCallback callback) {
2411+
MigrationManager.addCleverTapInstanceCallback(callback);
2412+
}
2413+
2414+
/**
2415+
* Removes the callback for the CleverTap instance.
2416+
*
2417+
* @param callback Callback to remove.
24082418
*/
2409-
public static void onCleverTapInstanceInitialized(@Nullable CleverTapInstanceCallback callback) {
2410-
MigrationManager.setCleverTapInstanceCallback(callback);
2419+
public static void removeCleverTapInstanceCallback(@NonNull CleverTapInstanceCallback callback) {
2420+
MigrationManager.removeCleverTapInstanceCallback(callback);
24112421
}
24122422
}

AndroidSDKCore/src/main/java/com/leanplum/actions/internal/ActionManagerDefinition.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,9 @@ private fun areActionDefinitionsEqual(a: Map<String, Any?>?, b: Map<String, Any?
107107
if (value == null || b[key] == null) {
108108
return false
109109
}
110-
val aItem = value as Map<String, Any>
111-
val bItem = b[key] as Map<String, Any>
110+
111+
val aItem = value as Map<*, *>
112+
val bItem = b[key] as Map<*, *>
112113

113114
val aKind = aItem["kind"]
114115
val aValues = aItem["values"]

AndroidSDKCore/src/main/java/com/leanplum/migration/MigrationManager.kt

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,25 @@ object MigrationManager {
4242
@Synchronized get
4343
private set
4444

45+
/**
46+
* List is kept the same as the one in IWrapper instance, because if wrapper state is changed it
47+
* would still continue to work.
48+
*/
49+
private val instanceCallbackList: MutableList<CleverTapInstanceCallback> = mutableListOf()
50+
4551
@JvmStatic
46-
var cleverTapInstanceCallback: CleverTapInstanceCallback? = null
47-
set(value) {
48-
field = value
49-
wrapper.setInstanceCallback(value)
50-
}
52+
@Synchronized
53+
fun addCleverTapInstanceCallback(callback: CleverTapInstanceCallback) {
54+
instanceCallbackList.add(callback)
55+
wrapper.addInstanceCallback(callback)
56+
}
57+
58+
@JvmStatic
59+
@Synchronized
60+
fun removeCleverTapInstanceCallback(callback: CleverTapInstanceCallback) {
61+
instanceCallbackList.remove(callback)
62+
wrapper.removeInstanceCallback(callback)
63+
}
5164

5265
@JvmStatic
5366
@Synchronized
@@ -60,7 +73,7 @@ object MigrationManager {
6073
if (getState().useCleverTap()
6174
&& (wrapper == NullWrapper || wrapper == StaticMethodsWrapper)
6275
) {
63-
wrapper = WrapperFactory.createWrapper(cleverTapInstanceCallback)
76+
wrapper = WrapperFactory.createWrapper(instanceCallbackList)
6477
} else if (wrapper != NullWrapper && !getState().useCleverTap()) {
6578
wrapper = NullWrapper
6679
}

AndroidSDKCore/src/main/java/com/leanplum/migration/wrapper/CTWrapper.kt

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,13 @@ internal class CTWrapper(
5353
override val miPushHandler: MiPushMigrationHandler = MiPushMigrationHandler()
5454

5555
private var cleverTapInstance: CleverTapAPI? = null
56-
private var instanceCallback: CleverTapInstanceCallback? = null
56+
private var instanceCallbackList: MutableList<CleverTapInstanceCallback> = mutableListOf()
5757

5858
private var identityManager = IdentityManager(deviceId, userId ?: deviceId)
5959
private var firstTimeStart = identityManager.isFirstTimeStart()
6060

61-
override fun launch(context: Context, callback: CleverTapInstanceCallback?) {
62-
instanceCallback = callback
61+
override fun launch(context: Context, callbacks: List<CleverTapInstanceCallback>) {
62+
instanceCallbackList.addAll(callbacks)
6363

6464
val lpLevel = Log.getLogLevel()
6565
val ctLevel = MigrationConstants.mapLogLevel(lpLevel).intValue()
@@ -97,21 +97,28 @@ internal class CTWrapper(
9797
// Send tokens in same session, because often a restart is needed for CT SDK to get them
9898
sendPushTokens(context)
9999
}
100-
triggerInstanceCallback()
100+
triggerInstanceCallbacks()
101101
}
102102

103-
private fun triggerInstanceCallback() {
103+
private fun triggerInstanceCallbacks() {
104104
cleverTapInstance?.also { instance ->
105-
instanceCallback?.apply {
106-
Log.d("Wrapper: instance callback will be called")
107-
onInstance(instance)
105+
Log.d("Wrapper: notifying ${instanceCallbackList.size} instance callbacks")
106+
instanceCallbackList.forEach {
107+
it.onInstance(instance)
108108
}
109109
}
110110
}
111111

112-
override fun setInstanceCallback(callback: CleverTapInstanceCallback?) {
113-
instanceCallback = callback
114-
triggerInstanceCallback()
112+
override fun addInstanceCallback(callback: CleverTapInstanceCallback) {
113+
instanceCallbackList.add(callback)
114+
cleverTapInstance?.also { instance ->
115+
Log.d("Wrapper: notifying new instance callback")
116+
callback.onInstance(instance)
117+
}
118+
}
119+
120+
override fun removeInstanceCallback(callback: CleverTapInstanceCallback) {
121+
instanceCallbackList.remove(callback)
115122
}
116123

117124
private fun sendPushTokens(context: Context) {

AndroidSDKCore/src/main/java/com/leanplum/migration/wrapper/IWrapper.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ interface IWrapper {
3636

3737
val miPushHandler: MiPushMigrationHandler? get() = null
3838

39-
fun launch(context: Context, callback: CleverTapInstanceCallback?) = Unit
39+
fun launch(context: Context, callbacks: List<CleverTapInstanceCallback>) = Unit
4040

41-
fun setInstanceCallback(callback: CleverTapInstanceCallback?) = Unit
41+
fun addInstanceCallback(callback: CleverTapInstanceCallback) = Unit
42+
43+
fun removeInstanceCallback(callback: CleverTapInstanceCallback) = Unit
4244

4345
fun setUserId(userId: String?) = Unit
4446

AndroidSDKCore/src/main/java/com/leanplum/migration/wrapper/WrapperFactory.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import kotlin.system.measureTimeMillis
3434

3535
internal object WrapperFactory {
3636

37-
fun createWrapper(callback: CleverTapInstanceCallback?): IWrapper {
37+
fun createWrapper(callbacks: List<CleverTapInstanceCallback>): IWrapper {
3838
val account = MigrationConfig.accountId
3939
val token = MigrationConfig.accountToken
4040
val region = MigrationConfig.accountRegion
@@ -61,7 +61,7 @@ internal object WrapperFactory {
6161

6262
return CTWrapper(account, token, region, deviceId, userId).apply {
6363
val timeToLaunch = measureTimeMillis {
64-
launch(context, callback)
64+
launch(context, callbacks)
6565
}
6666
Log.d("Wrapper: launch took $timeToLaunch millis")
6767
}

0 commit comments

Comments
 (0)