Skip to content

Commit d418ccb

Browse files
authored
Merge pull request #143 from arkivanov/fix-LifecycleRegistry-callback-order-when-shutting-down
Fix LifecycleRegistry callback order when shutting down
2 parents 40cfe83 + bba7477 commit d418ccb

File tree

3 files changed

+52
-10
lines changed

3 files changed

+52
-10
lines changed

mvikotlin/src/commonMain/kotlin/com/arkivanov/mvikotlin/core/lifecycle/LifecycleRegistry.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,16 @@ class LifecycleRegistry : Lifecycle, Lifecycle.Callbacks {
5555

5656
override fun onPause() {
5757
setState(required = Lifecycle.State.RESUMED, newState = Lifecycle.State.STARTED)
58-
set.forEach(Lifecycle.Callbacks::onPause)
58+
set.reversed().forEach(Lifecycle.Callbacks::onPause)
5959
}
6060

6161
override fun onStop() {
62-
set.forEach(Lifecycle.Callbacks::onStop)
62+
set.reversed().forEach(Lifecycle.Callbacks::onStop)
6363
setState(required = Lifecycle.State.STARTED, newState = Lifecycle.State.CREATED)
6464
}
6565

6666
override fun onDestroy() {
67-
set.forEach(Lifecycle.Callbacks::onDestroy)
67+
set.reversed().forEach(Lifecycle.Callbacks::onDestroy)
6868
set = emptySet()
6969
setState(required = Lifecycle.State.CREATED, newState = Lifecycle.State.DESTROYED)
7070
}

mvikotlin/src/commonTest/kotlin/com/arkivanov/mvikotlin/core/lifecycle/LifecycleRegistryTest.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.arkivanov.mvikotlin.core.lifecycle.TestLifecycleCallbacks.Event.ON_RE
77
import com.arkivanov.mvikotlin.core.lifecycle.TestLifecycleCallbacks.Event.ON_START
88
import com.arkivanov.mvikotlin.core.lifecycle.TestLifecycleCallbacks.Event.ON_STOP
99
import kotlin.test.Test
10+
import kotlin.test.assertEquals
1011

1112
class LifecycleRegistryTest {
1213

@@ -34,6 +35,40 @@ class LifecycleRegistryTest {
3435
callbacks2.assertEvents(events)
3536
}
3637

38+
@Test
39+
fun calls_all_callbacks_in_proper_order() {
40+
val events = ArrayList<String>()
41+
val callbacks1 = TestLifecycleCallbacks { events += "first-$it" }
42+
val callbacks2 = TestLifecycleCallbacks { events += "second-$it" }
43+
44+
lifecycle.subscribe(callbacks1)
45+
lifecycle.subscribe(callbacks2)
46+
lifecycle.onCreate()
47+
lifecycle.onStart()
48+
lifecycle.onResume()
49+
lifecycle.onPause()
50+
lifecycle.onStop()
51+
lifecycle.onDestroy()
52+
53+
assertEquals(
54+
listOf(
55+
"first-$ON_CREATE",
56+
"second-$ON_CREATE",
57+
"first-$ON_START",
58+
"second-$ON_START",
59+
"first-$ON_RESUME",
60+
"second-$ON_RESUME",
61+
"second-$ON_PAUSE",
62+
"first-$ON_PAUSE",
63+
"second-$ON_STOP",
64+
"first-$ON_STOP",
65+
"second-$ON_DESTROY",
66+
"first-$ON_DESTROY"
67+
),
68+
events
69+
)
70+
}
71+
3772
@Test
3873
fun drives_callback_to_created_state_WHEN_created_and_subscribed() {
3974
lifecycle.onCreate()

mvikotlin/src/commonTest/kotlin/com/arkivanov/mvikotlin/core/lifecycle/TestCallbacks.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,39 @@ package com.arkivanov.mvikotlin.core.lifecycle
22

33
import kotlin.test.assertEquals
44

5-
class TestLifecycleCallbacks : Lifecycle.Callbacks {
5+
class TestLifecycleCallbacks(
6+
private val onEvent: (Event) -> Unit = {}
7+
) : Lifecycle.Callbacks {
68

79
private val events = ArrayList<Event>()
810

911
override fun onCreate() {
10-
events += Event.ON_CREATE
12+
onEvent(Event.ON_CREATE)
1113
}
1214

1315
override fun onStart() {
14-
events += Event.ON_START
16+
onEvent(Event.ON_START)
1517
}
1618

1719
override fun onResume() {
18-
events += Event.ON_RESUME
20+
onEvent(Event.ON_RESUME)
1921
}
2022

2123
override fun onPause() {
22-
events += Event.ON_PAUSE
24+
onEvent(Event.ON_PAUSE)
2325
}
2426

2527
override fun onStop() {
26-
events += Event.ON_STOP
28+
onEvent(Event.ON_STOP)
2729
}
2830

2931
override fun onDestroy() {
30-
events += Event.ON_DESTROY
32+
onEvent(Event.ON_DESTROY)
33+
}
34+
35+
private fun onEvent(event: Event) {
36+
events += event
37+
onEvent.invoke(event)
3138
}
3239

3340
fun assertEvents(events: List<Event>) {

0 commit comments

Comments
 (0)