Skip to content

Commit 817b5f3

Browse files
authored
Merge pull request #544 from namehillsoftware/bugfix/connection-status-not-updating
[Bugfix] Connection Status Not Updating
2 parents 44f4a63 + 92ea397 commit 817b5f3

File tree

17 files changed

+266
-19
lines changed

17 files changed

+266
-19
lines changed

.github/workflows/build.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,10 @@ jobs:
1515
- uses: actions/checkout@v1
1616
- name: Build and test project blue
1717
run: sh build-github-pr.sh
18+
- name: Upload artifact
19+
if: always()
20+
uses: actions/upload-artifact@v4
21+
with:
22+
# Artifact name
23+
name: project-blue.build
24+
path: projectBlueWater/build/test-results

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/HandheldApplication.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,7 @@ fun HandheldApplication(
343343
DramaticConnectionInitializationController(
344344
connectionSessions,
345345
),
346+
registerForApplicationMessages,
346347
)
347348
}
348349
}

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/ReusedViewModelRegistry.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class ReusedViewModelRegistry(
101101
DramaticConnectionInitializationController(
102102
connectionSessions,
103103
),
104+
registerForApplicationMessages,
104105
)
105106
}
106107

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/files/details/FileDetailsActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import java.io.IOException
7777
DramaticConnectionInitializationController(
7878
localApplicationDependencies.connectionSessions,
7979
),
80+
localApplicationDependencies.registerForApplicationMessages,
8081
)
8182
}
8283

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/connection/session/initialization/ConnectionStatusViewModel.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ import com.lasthopesoftware.bluewater.client.connection.BuildingConnectionStatus
1111
import com.lasthopesoftware.bluewater.client.connection.BuildingConnectionStatus.SendingWakeSignal
1212
import com.lasthopesoftware.bluewater.client.connection.libraries.ProvideProgressingLibraryConnections
1313
import com.lasthopesoftware.bluewater.client.connection.live.LiveServerConnection
14+
import com.lasthopesoftware.bluewater.client.connection.settings.changes.ObservableConnectionSettingsLibraryStorage
15+
import com.lasthopesoftware.bluewater.shared.messages.application.RegisterForApplicationMessages
16+
import com.lasthopesoftware.bluewater.shared.messages.registerReceiver
1417
import com.lasthopesoftware.bluewater.shared.observables.MutableInteractionState
1518
import com.lasthopesoftware.promises.extensions.ProgressingPromise
1619
import com.lasthopesoftware.promises.extensions.ProgressingPromiseProxy
@@ -22,13 +25,13 @@ import com.namehillsoftware.handoff.promises.response.ImmediateResponse
2225

2326
class ConnectionStatusViewModel(
2427
private val stringResources: GetStringResources,
25-
private val libraryConnectionProvider: ProvideProgressingLibraryConnections
28+
private val libraryConnectionProvider: ProvideProgressingLibraryConnections,
29+
messages: RegisterForApplicationMessages,
2630
) :
2731
ViewModel(),
2832
TrackConnectionStatus,
2933
ProvideProgressingLibraryConnections
3034
{
31-
3235
@Volatile
3336
private var promisedConnectionCheck = ProgressingPromise<BuildingConnectionStatus, LiveServerConnection?>(null as LiveServerConnection?)
3437

@@ -38,6 +41,11 @@ class ConnectionStatusViewModel(
3841
@Volatile
3942
private var testedLibraryId: LibraryId? = null
4043

44+
private val connectionSettingsChangedSubscription = messages.registerReceiver { c: ObservableConnectionSettingsLibraryStorage.ConnectionSettingsUpdated ->
45+
if (c.libraryId == testedLibraryId)
46+
testedLibraryId = null
47+
}
48+
4149
private val mutableIsGettingConnection = MutableInteractionState(false)
4250
private val mutableConnectionStatus = MutableInteractionState("")
4351

@@ -46,6 +54,10 @@ class ConnectionStatusViewModel(
4654
var isCancelled = false
4755
private set
4856

57+
override fun onCleared() {
58+
connectionSettingsChangedSubscription.close()
59+
}
60+
4961
override fun initializeConnection(libraryId: LibraryId): Promise<Boolean> = Promise.Proxy { cp ->
5062
promiseLibraryConnection(libraryId)
5163
.also(cp::doCancel)
@@ -80,8 +92,8 @@ class ConnectionStatusViewModel(
8092
override fun respond(connections: LiveServerConnection?) {
8193
if (initializingLibraryId != libraryId) return
8294

83-
testedLibraryId = libraryId
8495
val isConnected = connections != null
96+
testedLibraryId = libraryId.takeIf { isConnected }
8597
mutableConnectionStatus.value =
8698
if (isConnected) stringResources.connected else stringResources.gettingLibraryFailed
8799
}

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/playback/nowplaying/view/NowPlayingTvApplication.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,7 @@ fun NowPlayingTvApplication(
722722
DramaticConnectionInitializationController(
723723
connectionSessions,
724724
),
725+
registerForApplicationMessages,
725726
)
726727
}
727728
}

projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/session/GivenALibrary/AndItsConnectionIsStillAlive/when ensuring a different connection is working.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import com.lasthopesoftware.bluewater.client.connection.session.initialization.C
77
import com.lasthopesoftware.bluewater.shared.promises.extensions.DeferredProgressingPromise
88
import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture
99
import com.lasthopesoftware.promises.extensions.ProgressingPromise
10+
import com.lasthopesoftware.resources.RecordingApplicationMessageBus
1011
import com.lasthopesoftware.resources.strings.FakeStringResources
1112
import io.mockk.every
1213
import io.mockk.mockk
@@ -29,7 +30,8 @@ class `when ensuring a different connection is working` {
2930
mockk {
3031
every { promiseLibraryConnection(LibraryId(originalLibraryId)) } returns ProgressingPromise(mockk<LiveServerConnection>())
3132
every { promiseLibraryConnection(LibraryId(libraryId)) } returns deferredProgressingPromise
32-
}
33+
},
34+
RecordingApplicationMessageBus(),
3335
)
3436
)
3537
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
package com.lasthopesoftware.bluewater.client.connection.session.GivenALibrary.AndItsConnectionSettingsChange
2+
3+
import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId
4+
import com.lasthopesoftware.bluewater.client.connection.BuildingConnectionStatus
5+
import com.lasthopesoftware.bluewater.client.connection.live.LiveServerConnection
6+
import com.lasthopesoftware.bluewater.client.connection.session.initialization.ConnectionStatusViewModel
7+
import com.lasthopesoftware.bluewater.client.connection.settings.changes.ObservableConnectionSettingsLibraryStorage
8+
import com.lasthopesoftware.bluewater.shared.observables.toCloseable
9+
import com.lasthopesoftware.bluewater.shared.promises.extensions.DeferredProgressingPromise
10+
import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture
11+
import com.lasthopesoftware.promises.extensions.ProgressingPromise
12+
import com.lasthopesoftware.resources.RecordingApplicationMessageBus
13+
import com.lasthopesoftware.resources.strings.FakeStringResources
14+
import io.mockk.every
15+
import io.mockk.mockk
16+
import org.assertj.core.api.Assertions.assertThat
17+
import org.junit.jupiter.api.BeforeAll
18+
import org.junit.jupiter.api.Test
19+
20+
class `when calling the status check again` {
21+
companion object {
22+
private const val libraryId = 355
23+
}
24+
25+
private val mut by lazy {
26+
val deferredProgressingPromise =
27+
DeferredProgressingPromise<BuildingConnectionStatus, LiveServerConnection?>()
28+
29+
val messageBus = RecordingApplicationMessageBus()
30+
31+
Triple(
32+
messageBus,
33+
deferredProgressingPromise,
34+
ConnectionStatusViewModel(
35+
FakeStringResources(
36+
gettingLibrary = "VgssfPlPnn1",
37+
connectingToServerLibrary = "9M8CP4o3",
38+
connected = "3DJCi8HY8",
39+
),
40+
mockk {
41+
every { promiseLibraryConnection(LibraryId(libraryId)) } returns
42+
ProgressingPromise(mockk<LiveServerConnection>()) andThen
43+
deferredProgressingPromise
44+
},
45+
messageBus,
46+
)
47+
)
48+
}
49+
50+
private val isConnectingHistory = mutableListOf<Boolean>()
51+
private val connectionStatuses = mutableListOf<String>()
52+
53+
private var firstPromisedLibraryConnection: ProgressingPromise<BuildingConnectionStatus, LiveServerConnection?>? = null
54+
private var secondPromisedLibraryConnection: ProgressingPromise<BuildingConnectionStatus, LiveServerConnection?>? = null
55+
56+
private var firstLibraryConnection: LiveServerConnection? = null
57+
private var secondLibraryConnection: LiveServerConnection? = null
58+
59+
@BeforeAll
60+
fun act() {
61+
val (messageBus, secondDeferredPromise, viewModel) = mut
62+
63+
viewModel.connectionStatus.subscribe { status -> connectionStatuses.add(status.value) }.toCloseable().use {
64+
viewModel.isGettingConnection.subscribe { isConnecting -> isConnectingHistory.add(isConnecting.value) }.toCloseable().use {
65+
firstPromisedLibraryConnection = viewModel.promiseLibraryConnection(LibraryId(libraryId))
66+
67+
messageBus.sendMessage(
68+
ObservableConnectionSettingsLibraryStorage.ConnectionSettingsUpdated(LibraryId(libraryId))
69+
)
70+
71+
secondPromisedLibraryConnection = viewModel.promiseLibraryConnection(LibraryId(libraryId))
72+
73+
secondDeferredPromise.sendProgressUpdate(BuildingConnectionStatus.BuildingConnection)
74+
secondDeferredPromise.sendProgressUpdate(BuildingConnectionStatus.SendingWakeSignal)
75+
secondDeferredPromise.sendResolution(mockk())
76+
77+
firstLibraryConnection = firstPromisedLibraryConnection?.toExpiringFuture()?.get()
78+
secondLibraryConnection = secondPromisedLibraryConnection?.toExpiringFuture()?.get()
79+
}
80+
}
81+
}
82+
83+
@Test
84+
fun `then is connecting status history is correct`() {
85+
assertThat(isConnectingHistory).containsExactly(false, true, false, true, false)
86+
}
87+
88+
@Test
89+
fun `then the connecting statuses are correct`() {
90+
assertThat(connectionStatuses).containsExactly("", "3DJCi8HY8", "", "9M8CP4o3", "", "3DJCi8HY8")
91+
}
92+
93+
@Test
94+
fun `then the correct connection is returned`() {
95+
assertThat(firstLibraryConnection).isNotNull
96+
}
97+
98+
@Test
99+
fun `then the correct second connection is returned`() {
100+
assertThat(secondLibraryConnection).isNotNull
101+
}
102+
}

projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/session/GivenALibrary/AndTheConnectionIsBeingInitialized/when calling the status check again with another library.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.lasthopesoftware.bluewater.shared.observables.toCloseable
99
import com.lasthopesoftware.bluewater.shared.promises.extensions.DeferredProgressingPromise
1010
import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture
1111
import com.lasthopesoftware.promises.extensions.ProgressingPromise
12+
import com.lasthopesoftware.resources.RecordingApplicationMessageBus
1213
import com.lasthopesoftware.resources.strings.FakeStringResources
1314
import io.mockk.every
1415
import io.mockk.mockk
@@ -40,6 +41,7 @@ class `when calling the status check again with another library` {
4041
}
4142
every { promiseLibraryConnection(LibraryId(libraryId)) } returns resolvingConnection
4243
},
44+
RecordingApplicationMessageBus(),
4345
)
4446
)
4547
}

projectBlueWater/src/test/java/com/lasthopesoftware/bluewater/client/connection/session/GivenALibrary/AndTheConnectionIsBeingInitialized/when calling the status check again.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import com.lasthopesoftware.bluewater.shared.observables.toCloseable
88
import com.lasthopesoftware.bluewater.shared.promises.extensions.DeferredProgressingPromise
99
import com.lasthopesoftware.bluewater.shared.promises.extensions.toExpiringFuture
1010
import com.lasthopesoftware.promises.extensions.ProgressingPromise
11+
import com.lasthopesoftware.resources.RecordingApplicationMessageBus
1112
import com.lasthopesoftware.resources.strings.FakeStringResources
1213
import io.mockk.every
1314
import io.mockk.mockk
@@ -29,6 +30,7 @@ class `when calling the status check again` {
2930
mockk {
3031
every { promiseLibraryConnection(LibraryId(libraryId)) } returns deferredProgressingPromise
3132
},
33+
RecordingApplicationMessageBus(),
3234
)
3335
)
3436
}

0 commit comments

Comments
 (0)