Skip to content

Commit ea3d6e7

Browse files
authored
Fix initial network available state not set in network & lifecycle monitor (#38)
1 parent b28d084 commit ea3d6e7

File tree

2 files changed

+50
-19
lines changed

2 files changed

+50
-19
lines changed

stream-android-core/src/main/java/io/getstream/android/core/internal/observers/StreamNetworkAndLifecycleMonitorImpl.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,20 @@ internal class StreamNetworkAndLifecycleMonitorImpl(
9090
}
9191

9292
override fun start(): Result<Unit> {
93-
val networkStart =
94-
networkMonitor
95-
.start()
96-
.flatMap { networkMonitor.subscribe(networkMonitorListener) }
97-
.also { result -> networkHandle = result.getOrNull() }
9893
val lifecycleStart =
9994
lifecycleMonitor
10095
.start()
10196
.flatMap { lifecycleMonitor.subscribe(lifecycleListener) }
10297
.also { result -> lifecycleHandle = result.getOrNull() }
103-
10498
mutableLifecycleState.update(lifecycleMonitor.getCurrentState())
99+
100+
val networkStart =
101+
networkMonitor
102+
// Subscribe before start so we get notified about the initial state
103+
.subscribe(networkMonitorListener)
104+
.flatMap { subscription -> networkMonitor.start().map { subscription } }
105+
.also { result -> networkHandle = result.getOrNull() }
106+
105107
return (networkStart * lifecycleStart).flatMap { Result.success(Unit) }
106108
}
107109

stream-android-core/src/test/java/io/getstream/android/core/internal/observers/StreamNetworkAndLifecycleMonitorImplTest.kt

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,7 @@ class StreamNetworkAndLifecycleMonitorImplTest {
4646
StreamSubscriptionManager<StreamNetworkAndLifecycleMonitorListener>(TestLogger)
4747
private val fakeLifecycleMonitor = FakeLifecycleMonitor()
4848
private val fakeNetworkMonitor = FakeNetworkMonitor()
49-
private val monitor: StreamNetworkAndLifeCycleMonitor =
50-
StreamNetworkAndLifeCycleMonitor(
51-
logger = TestLogger,
52-
lifecycleMonitor = fakeLifecycleMonitor,
53-
networkMonitor = fakeNetworkMonitor,
54-
mutableLifecycleState = lifecycleState,
55-
mutableNetworkState = networkState,
56-
subscriptionManager = downstreamSubscriptionManager,
57-
)
49+
private val monitor: StreamNetworkAndLifeCycleMonitor = createMonitor()
5850
private val options = Options(retention = Retention.KEEP_UNTIL_CANCELLED)
5951

6052
@Test
@@ -96,6 +88,23 @@ class StreamNetworkAndLifecycleMonitorImplTest {
9688
)
9789
}
9890

91+
@Test
92+
fun `network and lifecycle states are updated on start`() {
93+
val initialNetworkState =
94+
StreamNetworkState.Available(StreamNetworkInfo.Snapshot(internet = true))
95+
val initialLifecycleState = StreamLifecycleState.Foreground
96+
97+
val monitor =
98+
createMonitor(
99+
networkMonitor = FakeNetworkMonitor(initialNetworkState.snapshot),
100+
lifecycleMonitor = FakeLifecycleMonitor(initialLifecycleState),
101+
)
102+
monitor.start()
103+
104+
assertEquals(initialNetworkState, networkState.value)
105+
assertEquals(initialLifecycleState, lifecycleState.value)
106+
}
107+
99108
@Test
100109
fun `lifecycle callbacks update state and notify listeners`() {
101110
val events = mutableListOf<Pair<StreamNetworkState, StreamLifecycleState>>()
@@ -166,7 +175,9 @@ class StreamNetworkAndLifecycleMonitorImplTest {
166175
assertEquals(previousEventCount, events.size)
167176
}
168177

169-
private class FakeLifecycleMonitor : StreamLifecycleMonitor {
178+
private class FakeLifecycleMonitor(
179+
private val initialState: StreamLifecycleState = StreamLifecycleState.Unknown
180+
) : StreamLifecycleMonitor {
170181
private val listeners = mutableSetOf<StreamLifecycleListener>()
171182
var stopCalls: Int = 0
172183
private set
@@ -193,7 +204,7 @@ class StreamNetworkAndLifecycleMonitorImplTest {
193204
)
194205
}
195206

196-
override fun getCurrentState(): StreamLifecycleState = StreamLifecycleState.Unknown
207+
override fun getCurrentState(): StreamLifecycleState = initialState
197208

198209
fun emitForeground() {
199210
listeners.forEach { it.onForeground() }
@@ -206,12 +217,17 @@ class StreamNetworkAndLifecycleMonitorImplTest {
206217
fun hasListeners(): Boolean = listeners.isNotEmpty()
207218
}
208219

209-
private class FakeNetworkMonitor : StreamNetworkMonitor {
220+
private class FakeNetworkMonitor(
221+
private val initialSnapshot: StreamNetworkInfo.Snapshot? = null
222+
) : StreamNetworkMonitor {
210223
private var listener: StreamNetworkMonitorListener? = null
211224
var stopCalls: Int = 0
212225
private set
213226

214-
override fun start(): Result<Unit> = Result.success(Unit)
227+
override fun start(): Result<Unit> {
228+
initialSnapshot?.let(::emitConnected)
229+
return Result.success(Unit)
230+
}
215231

216232
override fun stop(): Result<Unit> =
217233
Result.success(Unit).also {
@@ -245,4 +261,17 @@ class StreamNetworkAndLifecycleMonitorImplTest {
245261

246262
fun hasListener(): Boolean = listener != null
247263
}
264+
265+
private fun createMonitor(
266+
networkMonitor: StreamNetworkMonitor = fakeNetworkMonitor,
267+
lifecycleMonitor: StreamLifecycleMonitor = fakeLifecycleMonitor,
268+
) =
269+
StreamNetworkAndLifeCycleMonitor(
270+
logger = TestLogger,
271+
lifecycleMonitor = lifecycleMonitor,
272+
networkMonitor = networkMonitor,
273+
mutableLifecycleState = lifecycleState,
274+
mutableNetworkState = networkState,
275+
subscriptionManager = downstreamSubscriptionManager,
276+
)
248277
}

0 commit comments

Comments
 (0)