Skip to content

Commit 9b824ad

Browse files
sentinelwebsentinelweb
authored andcommitted
#496 - transfers ui tweaks, progress bar, mark dl complete if RequestedRangeNotSatisfiable http error
1 parent c6a34b3 commit 9b824ad

File tree

4 files changed

+73
-40
lines changed

4 files changed

+73
-40
lines changed

net/src/commonMain/kotlin/uk/co/sentinelweb/cuer/net/client/ServiceExecutor.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,10 @@ internal class ServiceExecutor(
229229
fileChannel?.close(null)
230230
}
231231
}
232-
232+
response.status == HttpStatusCode.RequestedRangeNotSatisfiable && fileSize > 0 -> {
233+
progressCallback?.invoke(TransferProgress(100f, fileSize))
234+
false
235+
}
233236
else -> {
234237
// Handle unsuccessful response
235238
log.e("Failed to download file. Status: ${response.status.value} ${response.status.description}")
@@ -265,6 +268,11 @@ internal class ServiceExecutor(
265268
val updateIntervalMs = 1000L
266269
var lastUpdateTime = 0L
267270

271+
if (initialSize > 0 && initialSize >= totalSize) {
272+
progressCallback?.invoke(TransferProgress(100f, totalSize))
273+
return
274+
}
275+
268276
while (true) {
269277
bytesRead = responseChannel.readAvailable(buffer, 0, buffer.size)
270278
if (bytesRead < 0) break

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

Lines changed: 59 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -194,56 +194,77 @@ object TransfersComposeables {
194194
.padding(4.dp)
195195
.background(MaterialTheme.colorScheme.surface)
196196
) {
197+
197198
TransferHeader(transfer)
199+
200+
TransferNodeTags(transfer)
201+
198202
transfer.sourceFile?.let { item ->
199203
Row {
200204
FileRowContent(item)
201205
}
202206
}
203-
TransferNodeTags(transfer)
207+
204208
LabelRow(Res.drawable.ic_target, transfer.target, iconSize = 32.dp)
205209
}
206210
}
207211

208212
@Composable
209213
private fun TransferHeader(transfer: Transfer) {
210-
Row(
211-
verticalAlignment = CenterVertically,
212-
modifier = Modifier
213-
.padding(4.dp)
214-
) {
215-
216-
Image(
217-
painter = painterResource(transfer.statusIcon),
218-
contentDescription = null,
219-
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurface),
214+
Box {
215+
Box(
220216
modifier = Modifier
221-
.size(36.dp)
222-
.padding(horizontal = 4.dp)
217+
.align(Alignment.BottomStart)
218+
.background(Color.Red)
219+
.fillMaxWidth(transfer.progressPercent / 100f)
220+
.height(4.dp)
223221
)
224-
225-
Image(
226-
painter = painterResource(transfer.directionIcon),
227-
contentDescription = null,
228-
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurface),
222+
Row(
223+
verticalAlignment = CenterVertically,
229224
modifier = Modifier
230-
.size(36.dp)
231225
.padding(4.dp)
232-
)
226+
) {
233227

234-
Text(
235-
text = transfer.directionText,
236-
style = MaterialTheme.typography.titleMedium,
237-
modifier = Modifier
238-
.padding(4.dp)
239-
)
228+
Image(
229+
painter = painterResource(transfer.statusIcon),
230+
contentDescription = null,
231+
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurface),
232+
modifier = Modifier
233+
.size(36.dp)
234+
.padding(horizontal = 4.dp)
235+
)
240236

241-
Text(
242-
text = transfer.progress,
243-
modifier = Modifier
244-
.weight(1f)
245-
.padding(horizontal = 8.dp)
246-
)
237+
Image(
238+
painter = painterResource(transfer.directionIcon),
239+
contentDescription = null,
240+
colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.onSurface),
241+
modifier = Modifier
242+
.size(36.dp)
243+
.padding(4.dp)
244+
)
245+
246+
Text(
247+
text = transfer.directionText,
248+
style = MaterialTheme.typography.titleMedium,
249+
modifier = Modifier
250+
.padding(4.dp)
251+
)
252+
253+
Text(
254+
text = transfer.statusText,
255+
style = MaterialTheme.typography.titleMedium,
256+
modifier = Modifier
257+
.padding(4.dp)
258+
)
259+
260+
Text(
261+
text = transfer.progress,
262+
style = MaterialTheme.typography.titleMedium,
263+
modifier = Modifier
264+
.weight(1f)
265+
.padding(horizontal = 8.dp)
266+
)
267+
}
247268
}
248269
}
249270

@@ -261,18 +282,18 @@ object TransfersComposeables {
261282
model.current?.let { transfer ->
262283
TransferHeader(transfer)
263284

264-
transfer.sourceFile?.let { item ->
265-
Row(modifier = Modifier.clickable(onClick = viewModel::onSetSource)) {
266-
FileRowContent(item)
267-
}
268-
}
269-
270285
TransferNodeTags(
271286
transfer,
272287
onSetSource = viewModel::onSetSource,
273288
onSetTarget = viewModel::onSetTarget
274289
)
275290

291+
transfer.sourceFile?.let { item ->
292+
Row(modifier = Modifier.clickable(onClick = viewModel::onSetSource)) {
293+
FileRowContent(item)
294+
}
295+
}
296+
276297
StatusLabelRow(transfer)
277298

278299
LabelRowSmall(

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ interface TransfersContract {
7070
val sourceErrors: List<ValidatorResult.ValidatorFieldModel>?,
7171
val targetErrors: List<ValidatorResult.ValidatorFieldModel>?,
7272
val isValid: Boolean,
73+
val progressPercent: Float = 0f,
7374
)
7475

7576
companion object {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@ class TransfersModelMapper(
3636
targetFile = transfer.target?.path?.let { filesModelMapper.mapItem(it).first },
3737
directionText = mapDirectionText(state, transfer),
3838
directionIcon = mapDirectionIcon(state, transfer),
39-
progress = ((transfer.progress * 100.0).toInt() / 100.0).toString() + "%",
39+
progress = ((transfer.progress
40+
/** 100.0*/
41+
).toInt()/* / 100.0*/).toString() + "%",
42+
progressPercent = transfer.progress,
4043
transferErrors = state.validation?.fieldValidations?.filter { it.field == Transfer },
4144
sourceErrors = state.validation?.fieldValidations?.filter { it.field == Source },
4245
targetErrors = state.validation?.fieldValidations?.filter { it.field == Target },

0 commit comments

Comments
 (0)