add sync status
This commit is contained in:
+60
@@ -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),
|
||||||
|
)
|
||||||
|
}
|
||||||
+3
@@ -52,6 +52,7 @@ import com.vaultdrop.mobile.data.local.entity.FolderEntity
|
|||||||
import com.vaultdrop.mobile.features.connection.ConnectionStatusViewModel
|
import com.vaultdrop.mobile.features.connection.ConnectionStatusViewModel
|
||||||
import com.vaultdrop.mobile.features.sync.SyncViewModel
|
import com.vaultdrop.mobile.features.sync.SyncViewModel
|
||||||
import com.vaultdrop.mobile.ui.components.FileCategoryIcon
|
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.FolderNameDialog
|
||||||
import com.vaultdrop.mobile.ui.components.MoveFolderPickerDialog
|
import com.vaultdrop.mobile.ui.components.MoveFolderPickerDialog
|
||||||
import com.vaultdrop.mobile.ui.components.SelectionState
|
import com.vaultdrop.mobile.ui.components.SelectionState
|
||||||
@@ -359,6 +360,8 @@ private fun FileRow(
|
|||||||
}
|
}
|
||||||
if (selection.active) {
|
if (selection.active) {
|
||||||
SelectionStatusIcon(selected = selected)
|
SelectionStatusIcon(selected = selected)
|
||||||
|
} else {
|
||||||
|
FileSyncStatusIcon(file = file, size = 20.dp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-1
@@ -73,6 +73,7 @@ import com.vaultdrop.mobile.features.connection.ConnectionStatusViewModel
|
|||||||
import com.vaultdrop.mobile.features.saf.safDisplayName
|
import com.vaultdrop.mobile.features.saf.safDisplayName
|
||||||
import com.vaultdrop.mobile.features.sync.SyncViewModel
|
import com.vaultdrop.mobile.features.sync.SyncViewModel
|
||||||
import com.vaultdrop.mobile.ui.components.FileCategoryIcon
|
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.FolderNameDialog
|
||||||
import com.vaultdrop.mobile.ui.components.SelectionState
|
import com.vaultdrop.mobile.ui.components.SelectionState
|
||||||
import com.vaultdrop.mobile.ui.components.SelectionStatusIcon
|
import com.vaultdrop.mobile.ui.components.SelectionStatusIcon
|
||||||
@@ -749,9 +750,11 @@ private fun FileCard(
|
|||||||
Column(modifier = Modifier.padding(12.dp)) {
|
Column(modifier = Modifier.padding(12.dp)) {
|
||||||
Row(verticalAlignment = androidx.compose.ui.Alignment.CenterVertically) {
|
Row(verticalAlignment = androidx.compose.ui.Alignment.CenterVertically) {
|
||||||
FileCategoryIcon(file = file, size = 36.dp)
|
FileCategoryIcon(file = file, size = 36.dp)
|
||||||
|
Spacer(Modifier.weight(1f))
|
||||||
if (selection.active) {
|
if (selection.active) {
|
||||||
Spacer(Modifier.weight(1f))
|
|
||||||
SelectionStatusIcon(selected = selected)
|
SelectionStatusIcon(selected = selected)
|
||||||
|
} else {
|
||||||
|
FileSyncStatusIcon(file = file, size = 20.dp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Spacer(Modifier.height(8.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.connection.ConnectionStatusViewModel
|
||||||
import com.vaultdrop.mobile.features.sync.SyncViewModel
|
import com.vaultdrop.mobile.features.sync.SyncViewModel
|
||||||
import com.vaultdrop.mobile.ui.components.FileCategoryIcon
|
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.MoveFolderPickerDialog
|
||||||
import com.vaultdrop.mobile.ui.components.SelectionState
|
import com.vaultdrop.mobile.ui.components.SelectionState
|
||||||
import com.vaultdrop.mobile.ui.components.SelectionStatusIcon
|
import com.vaultdrop.mobile.ui.components.SelectionStatusIcon
|
||||||
@@ -385,11 +386,17 @@ private fun SearchResultCard(
|
|||||||
if (selection.active) {
|
if (selection.active) {
|
||||||
SelectionStatusIcon(selected = selected)
|
SelectionStatusIcon(selected = selected)
|
||||||
} else {
|
} else {
|
||||||
Text(
|
Row(
|
||||||
text = formatSize(file.size),
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
style = MaterialTheme.typography.labelMedium,
|
horizontalArrangement = Arrangement.spacedBy(8.dp),
|
||||||
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
) {
|
||||||
)
|
Text(
|
||||||
|
text = formatSize(file.size),
|
||||||
|
style = MaterialTheme.typography.labelMedium,
|
||||||
|
color = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
|
)
|
||||||
|
FileSyncStatusIcon(file = file, size = 18.dp)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user