Skip to content

Commit 234dd1c

Browse files
sentinelwebsentinelweb
authored andcommitted
#496 - fix updating transfer service
1 parent 4da9bec commit 234dd1c

File tree

13 files changed

+131
-119
lines changed

13 files changed

+131
-119
lines changed

app/src/main/java/uk/co/sentinelweb/cuer/app/ui/filebrowser/dialog/FilesDialogFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import uk.co.sentinelweb.cuer.app.ui.common.viewmodel.ViewModelEffects
1717
import uk.co.sentinelweb.cuer.app.ui.filebrowser.FilesContract
1818
import uk.co.sentinelweb.cuer.app.ui.filebrowser.FilesContract.Effect
1919
import uk.co.sentinelweb.cuer.app.ui.filebrowser.FilesViewModel
20-
import uk.co.sentinelweb.cuer.app.ui.filebrowser.ext.mapFilePath
2120
import uk.co.sentinelweb.cuer.app.ui.play_control.CompactPlayerScroll
2221
import uk.co.sentinelweb.cuer.app.ui.player.PlayerContract
2322
import uk.co.sentinelweb.cuer.app.util.extension.fragmentScopeWithSource
@@ -26,6 +25,7 @@ import uk.co.sentinelweb.cuer.core.wrapper.LogWrapper
2625
import uk.co.sentinelweb.cuer.domain.Domain
2726
import uk.co.sentinelweb.cuer.domain.NodeDomain
2827
import uk.co.sentinelweb.cuer.domain.PlaylistItemDomain
28+
import uk.co.sentinelweb.cuer.domain.ext.mapFilePath
2929
import uk.co.sentinelweb.cuer.remote.interact.PlayerLaunchHost
3030
import uk.co.sentinelweb.cuer.remote.server.player.PlayerSessionContract
3131

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package uk.co.sentinelweb.cuer.domain
2+
3+
import kotlinx.serialization.Serializable
4+
import uk.co.sentinelweb.cuer.app.orchestrator.OrchestratorContract
5+
6+
@Serializable
7+
data class TransferDomain(
8+
val id: OrchestratorContract.Identifier<GUID>? = null,
9+
val source: Address? = null,
10+
val target: Address? = null,
11+
val deleteSourceAfter: Boolean = false,
12+
val status: Status = Status.Pending,
13+
) {
14+
enum class Status { Pending, Error, Complete }
15+
16+
@Serializable
17+
data class Address(
18+
val node: NodeDomain,
19+
val path: Domain? = null,
20+
)
21+
22+
companion object {
23+
val Default = TransferDomain()
24+
}
25+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package uk.co.sentinelweb.cuer.domain.ext
2+
3+
import uk.co.sentinelweb.cuer.domain.*
4+
5+
fun Domain.mapFilePath(): String = when (this) {
6+
is PlaylistAndChildrenDomain -> playlist.platformId ?: ""
7+
is PlaylistDomain -> platformId ?: ""
8+
is PlaylistItemDomain -> media.platformId
9+
is MediaDomain -> platformId
10+
else -> error("Not a path object : ${this::class.simpleName}")
11+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package uk.co.sentinelweb.cuer.domain.ext
2+
3+
import uk.co.sentinelweb.cuer.domain.TransferDomain
4+
5+
fun TransferDomain.Address.displayAddress(): String =
6+
"${this.node.nameAndPort()} / ${this.path?.mapFilePath()?.ellipsizePath()}"
7+
8+
fun String.ellipsizePath(margin: Int = 50, ellipsis: String = "..."): String {
9+
if (length <= 2 * margin) {
10+
return this
11+
}
12+
13+
return substring(0, margin) + ellipsis + substring(length - margin)
14+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package uk.co.sentinelweb.cuer.hub.service.service
2+
3+
import kotlinx.coroutines.flow.Flow
4+
import kotlinx.coroutines.flow.flowOf
5+
import uk.co.sentinelweb.cuer.app.orchestrator.OrchestratorContract
6+
import uk.co.sentinelweb.cuer.app.ui.filebrowser.transfers.TransfersContract
7+
import uk.co.sentinelweb.cuer.domain.GUID
8+
import uk.co.sentinelweb.cuer.domain.TransferDomain
9+
import uk.co.sentinelweb.cuer.domain.TransferDomain.Companion.Default
10+
11+
class EmptyTransferService : TransfersContract.Service {
12+
override val queue: List<TransferDomain>
13+
get() = listOf()
14+
override val queueFlow: Flow<List<TransferDomain>>
15+
get() = flowOf()
16+
17+
override fun addTransfer(domain: TransferDomain): TransferDomain =
18+
Default
19+
20+
override fun removeTransfer(domain: TransferDomain): Boolean = false
21+
22+
override fun removeTransfer(id: OrchestratorContract.Identifier<GUID>): Boolean = false
23+
override fun replaceTransfer(transfer: TransferDomain): Boolean = false
24+
25+
}

hub/src/main/kotlin/uk/co/sentinelweb/cuer/hub/ui/filebrowser/FilesUiCoordinator.kt

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,13 @@ import androidx.compose.runtime.Composable
44
import kotlinx.coroutines.CoroutineScope
55
import kotlinx.coroutines.Dispatchers
66
import kotlinx.coroutines.SupervisorJob
7-
import kotlinx.coroutines.flow.Flow
87
import kotlinx.coroutines.flow.MutableStateFlow
98
import kotlinx.coroutines.flow.collectLatest
10-
import kotlinx.coroutines.flow.flowOf
119
import kotlinx.coroutines.launch
1210
import org.koin.core.component.KoinComponent
1311
import org.koin.core.qualifier.named
1412
import org.koin.core.scope.Scope
1513
import org.koin.dsl.module
16-
import uk.co.sentinelweb.cuer.app.orchestrator.OrchestratorContract
1714
import uk.co.sentinelweb.cuer.app.ui.cast.CastController
1815
import uk.co.sentinelweb.cuer.app.ui.common.viewmodel.ViewModelEffects
1916
import uk.co.sentinelweb.cuer.app.ui.filebrowser.FilesComposeables.FileBrowserDesktopUi
@@ -22,12 +19,10 @@ import uk.co.sentinelweb.cuer.app.ui.filebrowser.FilesContract.Effect.ErrorMessa
2219
import uk.co.sentinelweb.cuer.app.ui.filebrowser.FilesContract.Model.Companion.Initial
2320
import uk.co.sentinelweb.cuer.app.ui.filebrowser.FilesContract.State
2421
import uk.co.sentinelweb.cuer.app.ui.filebrowser.FilesViewModel
25-
import uk.co.sentinelweb.cuer.app.ui.filebrowser.transfers.TransfersContract
26-
import uk.co.sentinelweb.cuer.app.ui.filebrowser.transfers.TransfersContract.TransferDomain.Companion.Default
2722
import uk.co.sentinelweb.cuer.app.ui.remotes.selector.NodesDialogContract
2823
import uk.co.sentinelweb.cuer.core.wrapper.LogWrapper
29-
import uk.co.sentinelweb.cuer.domain.GUID
3024
import uk.co.sentinelweb.cuer.domain.NodeDomain
25+
import uk.co.sentinelweb.cuer.hub.service.service.EmptyTransferService
3126
import uk.co.sentinelweb.cuer.hub.ui.home.HomeUiCoordinator
3227
import uk.co.sentinelweb.cuer.hub.ui.remotes.selector.RemotesDialogLauncher
3328
import uk.co.sentinelweb.cuer.hub.ui.remotes.selector.RemotesDialogLauncherComposeables.ShowRemotesDialogIfNecessary
@@ -105,20 +100,7 @@ class FilesUiCoordinator(
105100
localRepository = get(),
106101
localPlayerLaunchHost = get(),
107102
localPlayerStatus = get(),
108-
transfersService = object : TransfersContract.Service {
109-
override val queue: List<TransfersContract.TransferDomain>
110-
get() = listOf()
111-
override val queueFlow: Flow<List<TransfersContract.TransferDomain>>
112-
get() = flowOf()
113-
114-
override fun addTransfer(domain: TransfersContract.TransferDomain): TransfersContract.TransferDomain =
115-
Default
116-
117-
override fun removeTransfer(domain: TransfersContract.TransferDomain): Boolean = false
118-
119-
override fun removeTransfer(id: OrchestratorContract.Identifier<GUID>): Boolean = false
120-
121-
},
103+
transfersService = EmptyTransferService(),
122104
_effects = ViewModelEffects<FilesContract.Effect>()
123105
)
124106
}
@@ -138,5 +120,7 @@ class FilesUiCoordinator(
138120
}
139121
}
140122
}
123+
124+
141125
}
142126
}

shared/src/commonMain/kotlin/uk/co/sentinelweb/cuer/app/ui/filebrowser/FilesViewModel.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,8 @@ class FilesViewModel(
170170
domain: Domain,
171171
node: NodeDomain?,
172172
) {
173-
val transfer = TransfersContract.TransferDomain(
174-
source = node?.let { TransfersContract.TransferDomain.Address(it, domain) },
173+
val transfer = TransferDomain(
174+
source = node?.let { TransferDomain.Address(it, domain) },
175175
target = null,
176176
)
177177
transfersService.addTransfer(transfer)
@@ -183,8 +183,8 @@ class FilesViewModel(
183183
domain: Domain,
184184
node: NodeDomain?,
185185
) {
186-
val transfer = TransfersContract.TransferDomain(
187-
source = node?.let { TransfersContract.TransferDomain.Address(it, domain) },
186+
val transfer = TransferDomain(
187+
source = node?.let { TransferDomain.Address(it, domain) },
188188
target = null,
189189
)
190190
transfersService.addTransfer(transfer)

shared/src/commonMain/kotlin/uk/co/sentinelweb/cuer/app/ui/filebrowser/ext/FilesExt.kt

Lines changed: 0 additions & 13 deletions
This file was deleted.

shared/src/commonMain/kotlin/uk/co/sentinelweb/cuer/app/ui/filebrowser/transfers/MemoryTransfersService.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import kotlinx.coroutines.flow.update
77
import uk.co.sentinelweb.cuer.app.orchestrator.OrchestratorContract.Identifier
88
import uk.co.sentinelweb.cuer.app.orchestrator.OrchestratorContract.Source.MEMORY
99
import uk.co.sentinelweb.cuer.domain.GUID
10+
import uk.co.sentinelweb.cuer.domain.TransferDomain
1011
import uk.co.sentinelweb.cuer.domain.creator.GuidCreator
1112

1213
class MemoryTransfersService(
@@ -16,12 +17,12 @@ class MemoryTransfersService(
1617

1718
private val _stateObservable = MutableStateFlow(initialState)
1819

19-
override val queueFlow: Flow<List<TransfersContract.TransferDomain>>
20+
override val queueFlow: Flow<List<TransferDomain>>
2021
get() = _stateObservable.map { it.queue }
21-
override val queue: List<TransfersContract.TransferDomain>
22+
override val queue: List<TransferDomain>
2223
get() = _stateObservable.value.queue
2324

24-
override fun addTransfer(domain: TransfersContract.TransferDomain): TransfersContract.TransferDomain {
25+
override fun addTransfer(domain: TransferDomain): TransferDomain {
2526
val updated =
2627
_stateObservable.value.queue.let { queue ->
2728
if (domain.id == null) {
@@ -38,7 +39,7 @@ class MemoryTransfersService(
3839
return updated.first
3940
}
4041

41-
override fun removeTransfer(domain: TransfersContract.TransferDomain): Boolean {
42+
override fun removeTransfer(domain: TransferDomain): Boolean {
4243
return removeTransfer(domain.id ?: return false)
4344
}
4445

@@ -53,7 +54,18 @@ class MemoryTransfersService(
5354
return result
5455
}
5556

56-
private fun createId(domain: TransfersContract.TransferDomain): TransfersContract.TransferDomain =
57+
override fun replaceTransfer(transfer: TransferDomain): Boolean {
58+
return queue.indexOfFirst { it.id == transfer.id }
59+
.takeIf { it >= 0 }
60+
?.let { index ->
61+
_stateObservable.update { last ->
62+
last.copy(queue = last.queue.toMutableList().apply { set(index, transfer) })
63+
}
64+
true
65+
} ?: false
66+
}
67+
68+
private fun createId(domain: TransferDomain): TransferDomain =
5769
domain.copy(
5870
id = Identifier(
5971
guidCreator.create(),

shared/src/commonMain/kotlin/uk/co/sentinelweb/cuer/app/ui/filebrowser/transfers/TransfersComposeables.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import uk.co.sentinelweb.cuer.app.ui.common.compose.CustomSnackbar
3030
import uk.co.sentinelweb.cuer.app.ui.common.compose.colorTransparentBlue
3131
import uk.co.sentinelweb.cuer.app.ui.common.compose.views.deleteSwipeResources
3232
import uk.co.sentinelweb.cuer.app.ui.common.compose.views.swipeToDismiss
33+
import uk.co.sentinelweb.cuer.app.ui.filebrowser.transfers.TransfersContract.Effect.ErrorMessage
3334
import uk.co.sentinelweb.cuer.app.ui.filebrowser.transfers.TransfersContract.Model.Companion.Initial
3435
import uk.co.sentinelweb.cuer.app.ui.local.LocalComposables.getKoin
3536
import uk.co.sentinelweb.cuer.core.wrapper.LogWrapper
@@ -52,8 +53,8 @@ object TransfersComposeables {
5253

5354
LaunchedEffect(effects.value) {
5455
when (effects.value) {
55-
is TransfersContract.Effect.ErrorMessage -> snackbarHostState.showSnackbar(
56-
message = (effects.value as TransfersContract.Effect.ErrorMessage).message,
56+
is ErrorMessage -> snackbarHostState.showSnackbar(
57+
message = (effects.value as ErrorMessage).message,
5758
)
5859

5960
else -> Unit
@@ -227,7 +228,7 @@ object TransfersComposeables {
227228
private fun LabelRow(
228229
label: String,
229230
data: String,
230-
labelStayle: TextStyle = MaterialTheme.typography.titleSmall,
231+
labelStyle: TextStyle = MaterialTheme.typography.titleSmall,
231232
textStyle: TextStyle = MaterialTheme.typography.bodySmall,
232233
onClick: (() -> Unit)? = null
233234
) {
@@ -239,7 +240,7 @@ object TransfersComposeables {
239240
) {
240241
Text(
241242
text = label,
242-
style = labelStayle,
243+
style = labelStyle,
243244
modifier = Modifier
244245
.padding(2.dp)
245246
.width(80.dp),
@@ -248,13 +249,11 @@ object TransfersComposeables {
248249
Text(
249250
text = data,
250251
style = textStyle,
251-
maxLines = 2,
252+
maxLines = 3,
252253
modifier = Modifier
253254
.weight(1f)
254255
.padding(4.dp)
255256
)
256257
}
257258
}
258-
259-
260259
}

0 commit comments

Comments
 (0)