From 30b919bc03b88e70554f354c54ddcd5a92ba65c4 Mon Sep 17 00:00:00 2001 From: Mathieu Moran Date: Wed, 12 Aug 2026 18:08:26 -0400 Subject: [PATCH] feat: block re-upload of files already on server + visible upload progress - Hide upload button when file is in uploadedNames (already on server) - UploadWorker still guards via /status already_uploaded check - Indeterminate progress bar during Hashing/Checking phases - Upload label always shows percentage --- .../java/com/yarisobd/app/DownloadsScreen.kt | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/android/app/src/main/java/com/yarisobd/app/DownloadsScreen.kt b/android/app/src/main/java/com/yarisobd/app/DownloadsScreen.kt index 45f5e38..bd98b91 100644 --- a/android/app/src/main/java/com/yarisobd/app/DownloadsScreen.kt +++ b/android/app/src/main/java/com/yarisobd/app/DownloadsScreen.kt @@ -120,12 +120,21 @@ fun DownloadsScreen( } if (!dl.done) { Spacer(Modifier.height(8.dp)) - LinearProgressIndicator( - progress = { dl.progress / 100f }, - modifier = Modifier.fillMaxWidth().height(6.dp).clip(RoundedCornerShape(3.dp)), - color = MaterialTheme.colorScheme.tertiary, - trackColor = MaterialTheme.colorScheme.surfaceVariant, - ) + if (dl.progress > 0) { + LinearProgressIndicator( + progress = { dl.progress / 100f }, + modifier = Modifier.fillMaxWidth().height(6.dp).clip(RoundedCornerShape(3.dp)), + color = MaterialTheme.colorScheme.tertiary, + trackColor = MaterialTheme.colorScheme.surfaceVariant, + ) + } else { + // Indeterminate bar so hashing/checking phases show visible activity + LinearProgressIndicator( + modifier = Modifier.fillMaxWidth().height(6.dp).clip(RoundedCornerShape(3.dp)), + color = MaterialTheme.colorScheme.tertiary, + trackColor = MaterialTheme.colorScheme.surfaceVariant, + ) + } } } } @@ -228,7 +237,7 @@ fun DownloadsScreen( if (isDeleting) { CircularProgressIndicator(modifier = Modifier.size(20.dp), strokeWidth = 2.dp, color = MaterialTheme.colorScheme.error) } else { - if (credentialsConfigured) { + if (credentialsConfigured && file.name !in uploadedNames) { IconButton(onClick = { onUpload(file) }) { Icon(Icons.Filled.CloudUpload, "Upload", tint = MaterialTheme.colorScheme.tertiary) } @@ -248,7 +257,7 @@ fun DownloadsScreen( private fun uploadLabel(dl: ActiveDownload): String { val pct = "${dl.progress}%" val status = dl.status ?: return pct - return if (dl.progress > 0) "$status · $pct" else status + return "$status · $pct" } private fun formatSize(bytes: Long): String = when {