Skip to content

Commit 67ab03a

Browse files
committed
add operationRepoLoadedListener and implement it to RecoverFromDroppedLoginBug
1 parent fda7c3e commit 67ab03a

File tree

5 files changed

+51
-2
lines changed

5 files changed

+51
-2
lines changed

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/operations/IOperationRepo.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ interface IOperationRepo {
3838
* Check if the queue contains a specific operation type
3939
*/
4040
fun <T : Operation> containsInstanceOf(type: KClass<T>): Boolean
41+
42+
fun addOperationLoadedListener(handler: IOperationRepoLoadedListener)
4143
}
4244

4345
// Extension function so the syntax containsInstanceOf<Operation>() can be used over
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.onesignal.core.internal.operations
2+
3+
interface IOperationRepoLoadedListener {
4+
fun onOperationRepoLoaded()
5+
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/core/internal/operations/impl/OperationRepo.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.onesignal.core.internal.operations.impl
22

3+
import com.onesignal.common.events.EventProducer
4+
import com.onesignal.common.events.IEventNotifier
35
import com.onesignal.common.threading.WaiterWithValue
46
import com.onesignal.core.internal.config.ConfigModelStore
57
import com.onesignal.core.internal.operations.ExecutionResult
68
import com.onesignal.core.internal.operations.GroupComparisonType
79
import com.onesignal.core.internal.operations.IOperationExecutor
810
import com.onesignal.core.internal.operations.IOperationRepo
11+
import com.onesignal.core.internal.operations.IOperationRepoLoadedListener
912
import com.onesignal.core.internal.operations.Operation
1013
import com.onesignal.core.internal.startup.IStartableService
1114
import com.onesignal.core.internal.time.ITime
@@ -27,7 +30,7 @@ internal class OperationRepo(
2730
private val _configModelStore: ConfigModelStore,
2831
private val _time: ITime,
2932
private val _newRecordState: NewRecordsState,
30-
) : IOperationRepo, IStartableService {
33+
) : IOperationRepo, IStartableService, IEventNotifier<IOperationRepoLoadedListener> {
3134
internal class OperationQueueItem(
3235
val operation: Operation,
3336
val waiter: WaiterWithValue<Boolean>? = null,
@@ -49,6 +52,18 @@ internal class OperationRepo(
4952
private val waiter = WaiterWithValue<LoopWaiterMessage>()
5053
private var paused = false
5154
private var coroutineScope = CoroutineScope(newSingleThreadContext(name = "OpRepo"))
55+
private val loadedSubscription: EventProducer<IOperationRepoLoadedListener> = EventProducer()
56+
57+
override val hasSubscribers: Boolean
58+
get() = loadedSubscription.hasSubscribers
59+
60+
override fun unsubscribe(handler: IOperationRepoLoadedListener) {
61+
loadedSubscription.subscribe(handler)
62+
}
63+
64+
override fun subscribe(handler: IOperationRepoLoadedListener) {
65+
loadedSubscription.unsubscribe(handler)
66+
}
5267

5368
/** *** Buckets ***
5469
* Purpose: Bucketing is a pattern we are using to help save network
@@ -86,6 +101,10 @@ internal class OperationRepo(
86101
}
87102
}
88103

104+
override fun addOperationLoadedListener(handler: IOperationRepoLoadedListener) {
105+
subscribe(handler)
106+
}
107+
89108
override fun start() {
90109
paused = false
91110
coroutineScope.launch {
@@ -393,5 +412,6 @@ internal class OperationRepo(
393412
operation.index,
394413
)
395414
}
415+
loadedSubscription.fire { it.onOperationRepoLoaded() }
396416
}
397417
}

OneSignalSDK/onesignal/core/src/main/java/com/onesignal/user/internal/migrations/RecoverFromDroppedLoginBug.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.onesignal.user.internal.migrations
33
import com.onesignal.common.IDManager
44
import com.onesignal.core.internal.config.ConfigModelStore
55
import com.onesignal.core.internal.operations.IOperationRepo
6+
import com.onesignal.core.internal.operations.IOperationRepoLoadedListener
67
import com.onesignal.core.internal.operations.containsInstanceOf
78
import com.onesignal.core.internal.startup.IStartableService
89
import com.onesignal.debug.internal.logging.Logging
@@ -30,8 +31,12 @@ class RecoverFromDroppedLoginBug(
3031
private val _operationRepo: IOperationRepo,
3132
private val _identityModelStore: IdentityModelStore,
3233
private val _configModelStore: ConfigModelStore,
33-
) : IStartableService {
34+
) : IStartableService, IOperationRepoLoadedListener {
3435
override fun start() {
36+
_operationRepo.addOperationLoadedListener(this)
37+
}
38+
39+
override fun onOperationRepoLoaded() {
3540
if (isInBadState()) {
3641
Logging.warn(
3742
"User with externalId:" +

OneSignalSDK/onesignal/core/src/test/java/com/onesignal/core/internal/operations/OperationRepoTests.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import com.onesignal.core.internal.time.impl.Time
99
import com.onesignal.debug.LogLevel
1010
import com.onesignal.debug.internal.logging.Logging
1111
import com.onesignal.mocks.MockHelper
12+
import com.onesignal.user.internal.identity.IdentityModel
13+
import com.onesignal.user.internal.identity.IdentityModelStore
14+
import com.onesignal.user.internal.migrations.RecoverFromDroppedLoginBug
1215
import com.onesignal.user.internal.operations.ExecutorMocks.Companion.getNewRecordState
1316
import io.kotest.core.spec.style.FunSpec
1417
import io.kotest.matchers.shouldBe
@@ -590,6 +593,20 @@ class OperationRepoTests : FunSpec({
590593
// Then
591594
result shouldBe null
592595
}
596+
597+
test("IOperationRepoLoadedListener") {
598+
val mocks = Mocks()
599+
val mockIdentityModel = mockk<IdentityModel>()
600+
val mockIdentityModelStore = mockk<IdentityModelStore>()
601+
val recovery = RecoverFromDroppedLoginBug(mocks.operationRepo, mockIdentityModelStore, mocks.configModelStore)
602+
603+
mocks.operationRepo.start()
604+
recovery.start()
605+
606+
verify {
607+
mocks.operationRepo.subscribe(recovery)
608+
}
609+
}
593610
}) {
594611
companion object {
595612
private fun mockOperation(

0 commit comments

Comments
 (0)