add sync status

This commit is contained in:
m
2026-09-13 09:25:18 +02:00
parent b494db9cf0
commit 201d6a03f2
4 changed files with 79 additions and 6 deletions
@@ -0,0 +1,60 @@
package com.vaultdrop.mobile.ui.components
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Cloud
import androidx.compose.material.icons.filled.CloudDone
import androidx.compose.material.icons.filled.CloudOff
import androidx.compose.material3.Icon
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.unit.Dp
import com.vaultdrop.mobile.data.local.entity.FileEntity
import com.vaultdrop.mobile.data.local.entity.FileStatus
/** Placement d'un fichier entre le device et le serveur distant. */
private enum class FileSyncPlacement {
LOCAL,
CLOUD,
LOCAL_CLOUD,
}
private fun FileEntity.syncPlacement(): FileSyncPlacement = when (syncStatus) {
FileStatus.CLOUD -> FileSyncPlacement.CLOUD
FileStatus.LOCAL_CLOUD -> FileSyncPlacement.LOCAL_CLOUD
else -> FileSyncPlacement.LOCAL
}
/** Icône dédiée à chaque placement. */
private val FileSyncPlacement.icon: ImageVector
get() = when (this) {
FileSyncPlacement.LOCAL -> Icons.Filled.CloudOff
FileSyncPlacement.CLOUD -> Icons.Filled.Cloud
FileSyncPlacement.LOCAL_CLOUD -> Icons.Filled.CloudDone
}
/** Teinte dédiée à chaque placement. */
private val FileSyncPlacement.color: Color
get() = when (this) {
FileSyncPlacement.LOCAL -> Color(0xFFF57F17)
FileSyncPlacement.CLOUD -> Color(0xFF1565C0)
FileSyncPlacement.LOCAL_CLOUD -> Color(0xFF2E7D32)
}
/** Statut de sync d'un fichier — présence device / serveur distant. */
@Composable
fun FileSyncStatusIcon(
file: FileEntity,
size: Dp,
modifier: Modifier = Modifier,
) {
val placement = file.syncPlacement()
Icon(
imageVector = placement.icon,
contentDescription = null,
tint = placement.color,
modifier = modifier.size(size),
)
}
@@ -52,6 +52,7 @@ import com.vaultdrop.mobile.data.local.entity.FolderEntity
import com.vaultdrop.mobile.features.connection.ConnectionStatusViewModel
import com.vaultdrop.mobile.features.sync.SyncViewModel
import com.vaultdrop.mobile.ui.components.FileCategoryIcon
import com.vaultdrop.mobile.ui.components.FileSyncStatusIcon
import com.vaultdrop.mobile.ui.components.FolderNameDialog
import com.vaultdrop.mobile.ui.components.MoveFolderPickerDialog
import com.vaultdrop.mobile.ui.components.SelectionState
@@ -359,6 +360,8 @@ private fun FileRow(
}
if (selection.active) {
SelectionStatusIcon(selected = selected)
} else {
FileSyncStatusIcon(file = file, size = 20.dp)
}
}
}
@@ -73,6 +73,7 @@ import com.vaultdrop.mobile.features.connection.ConnectionStatusViewModel
import com.vaultdrop.mobile.features.saf.safDisplayName
import com.vaultdrop.mobile.features.sync.SyncViewModel
import com.vaultdrop.mobile.ui.components.FileCategoryIcon
import com.vaultdrop.mobile.ui.components.FileSyncStatusIcon
import com.vaultdrop.mobile.ui.components.FolderNameDialog
import com.vaultdrop.mobile.ui.components.SelectionState
import com.vaultdrop.mobile.ui.components.SelectionStatusIcon
@@ -749,9 +750,11 @@ private fun FileCard(
Column(modifier = Modifier.padding(12.dp)) {
Row(verticalAlignment = androidx.compose.ui.Alignment.CenterVertically) {
FileCategoryIcon(file = file, size = 36.dp)
if (selection.active) {
Spacer(Modifier.weight(1f))
if (selection.active) {
SelectionStatusIcon(selected = selected)
} else {
FileSyncStatusIcon(file = file, size = 20.dp)
}
}
Spacer(Modifier.height(8.dp))
@@ -58,6 +58,7 @@ import com.vaultdrop.mobile.domain.FileCategory
import com.vaultdrop.mobile.features.connection.ConnectionStatusViewModel
import com.vaultdrop.mobile.features.sync.SyncViewModel
import com.vaultdrop.mobile.ui.components.FileCategoryIcon
import com.vaultdrop.mobile.ui.components.FileSyncStatusIcon
import com.vaultdrop.mobile.ui.components.MoveFolderPickerDialog
import com.vaultdrop.mobile.ui.components.SelectionState
import com.vaultdrop.mobile.ui.components.SelectionStatusIcon
@@ -385,11 +386,17 @@ private fun SearchResultCard(
if (selection.active) {
SelectionStatusIcon(selected = selected)
} else {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(8.dp),
) {
Text(
text = formatSize(file.size),
style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
FileSyncStatusIcon(file = file, size = 18.dp)
}
}
}
}