diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/FileItem.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/FileItem.kt index 017a20452..f36ce4b38 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/FileItem.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/FileItem.kt @@ -133,7 +133,7 @@ private fun FileItemContent( .align(Alignment.TopEnd), contentPadding = PaddingValues(0.dp), shape = CircleShape, - colors = ButtonDefaults.buttonColors(containerColor = SwissTransferTheme.colors.fileTileRemoveButtonBackground), + colors = ButtonDefaults.buttonColors(containerColor = SwissTransferTheme.colors.fileItemRemoveButtonBackground), onClick = onRemove ?: {}, ) { Icon( @@ -210,7 +210,6 @@ private fun FileItemPreview() { { var isChecked by remember { mutableStateOf(true) } - val iconFile = object : FileUiItem { override val fileName: String = "How to not get fired.pdf" override val uid: String = fileName diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/components/FileItemList.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/FileItemList.kt new file mode 100644 index 000000000..8a7dbbbfd --- /dev/null +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/components/FileItemList.kt @@ -0,0 +1,95 @@ +/* + * Infomaniak SwissTransfer - Android + * Copyright (C) 2024 Infomaniak Network SA + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.infomaniak.swisstransfer.ui.components + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.infomaniak.swisstransfer.ui.theme.Margin +import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme +import com.infomaniak.swisstransfer.ui.utils.PreviewLargeWindow +import com.infomaniak.swisstransfer.ui.utils.PreviewSmallWindow + +@Composable +fun FileItemList( + modifier: Modifier = Modifier, + files: List, + isRemoveButtonVisible: Boolean, + isCheckboxVisible: Boolean, + isUidChecked: (String) -> Boolean, + setUidCheckStatus: (String, Boolean) -> Unit, + onRemoveUid: (String) -> Unit, +) { + LazyVerticalGrid( + modifier = modifier, + columns = GridCells.Adaptive(150.dp), + verticalArrangement = Arrangement.spacedBy(Margin.Medium), + horizontalArrangement = Arrangement.spacedBy(Margin.Medium), + ) { + items(files, key = { it.uid }) { file -> + FileItem( + file = file, + isRemoveButtonVisible = isRemoveButtonVisible, + isCheckboxVisible = isCheckboxVisible, + isChecked = { isUidChecked(file.uid) }, + onClick = { if (isCheckboxVisible) setUidCheckStatus(file.uid, !isUidChecked(file.uid)) }, + onRemove = { onRemoveUid(file.uid) }, + ) + } + } +} + +@PreviewSmallWindow +@PreviewLargeWindow +@Composable +private fun FileItemListPreview() { + val files = listOf(object : FileUiItem { + override val fileName: String = "The 5-Step Guide to Not Breaking Your Code.txt" + override val uid: String = fileName + override val fileSizeInBytes: Long = 57689032 + override val mimeType: String? = null + override val uri: String = "" + }, object : FileUiItem { + override val fileName: String = "Introduction to Turning It Off and On Again.pptx" + override val uid: String = fileName + override val fileSizeInBytes: Long = 89723143 + override val mimeType: String? = null + override val uri: String = "" + }, object : FileUiItem { + override val fileName: String = "Learning to Copy and Paste: A Complete Guide.docx" + override val uid: String = fileName + override val fileSizeInBytes: Long = 237866728 + override val mimeType: String? = null + override val uri: String = "" + }) + + SwissTransferTheme { + FileItemList( + files = files, + isRemoveButtonVisible = false, + isCheckboxVisible = true, + isUidChecked = { false }, + setUidCheckStatus = { _, _ -> }, + onRemoveUid = {}, + ) + } +} diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt index 5a6be0f45..be1b27453 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt @@ -28,11 +28,14 @@ import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.infomaniak.swisstransfer.R import com.infomaniak.swisstransfer.ui.components.EmptyState +import com.infomaniak.swisstransfer.ui.components.FileUiItem +import com.infomaniak.swisstransfer.ui.components.FileItemList import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus import com.infomaniak.swisstransfer.ui.images.illus.MascotSearching import com.infomaniak.swisstransfer.ui.screen.main.components.BrandTopAppBarScaffold import com.infomaniak.swisstransfer.ui.screen.main.received.components.ReceivedEmptyFab import com.infomaniak.swisstransfer.ui.screen.main.sent.SentViewModel +import com.infomaniak.swisstransfer.ui.theme.Margin import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewLargeWindow import com.infomaniak.swisstransfer.ui.utils.PreviewSmallWindow @@ -43,21 +46,61 @@ fun ReceivedScreen( sentViewModel: SentViewModel = hiltViewModel(), ) { val transfers by sentViewModel.transfers.collectAsStateWithLifecycle() + val isTransferChecked = sentViewModel.selectedTransferIds val areTransfersEmpty by remember { derivedStateOf { transfers?.isEmpty() == true } } - ReceivedScreen { areTransfersEmpty } + ReceivedScreen( + isFileChecked = { uid -> isTransferChecked[uid] == true }, + setFileCheckStatus = { uid, isChecked -> isTransferChecked[uid] = isChecked }, + areTransfersEmpty = { areTransfersEmpty } + ) } @Composable -private fun ReceivedScreen(areTransfersEmpty: () -> Boolean) { +private fun ReceivedScreen( + isFileChecked: (String) -> Boolean, + setFileCheckStatus: (String, Boolean) -> Unit, + areTransfersEmpty: () -> Boolean +) { BrandTopAppBarScaffold( floatingActionButton = { ReceivedEmptyFab(areTransfersEmpty) }, ) { - EmptyState( - icon = AppIllus.MascotSearching, - title = R.string.noTransferReceivedTitle, - description = R.string.noTransferReceivedDescription, - ) + if (areTransfersEmpty()) { + EmptyState( + icon = AppIllus.MascotSearching, + title = R.string.noTransferReceivedTitle, + description = R.string.noTransferReceivedDescription, + ) + } else { + val files = listOf(object : FileUiItem { + override val fileName: String = "The 5-Step Guide to Not Breaking Your Code.txt" + override val uid: String = fileName + override val fileSizeInBytes: Long = 57689032 + override val mimeType: String? = null + override val uri: String = "" + }, object : FileUiItem { + override val fileName: String = "Introduction to Turning It Off and On Again.pptx" + override val uid: String = fileName + override val fileSizeInBytes: Long = 89723143 + override val mimeType: String? = null + override val uri: String = "" + }, object : FileUiItem { + override val fileName: String = "Learning to Copy and Paste: A Complete Guide.docx" + override val uid: String = fileName + override val fileSizeInBytes: Long = 237866728 + override val mimeType: String? = null + override val uri: String = "" + }) + FileItemList( + modifier = Modifier.padding(Margin.Medium), + files = files, + isRemoveButtonVisible = false, + isCheckboxVisible = true, + isUidChecked = isFileChecked, + setUidCheckStatus = setFileCheckStatus, + onRemoveUid = {}, + ) + } } } @@ -67,7 +110,7 @@ private fun ReceivedScreen(areTransfersEmpty: () -> Boolean) { private fun ReceivedScreenPreview() { SwissTransferTheme { Surface { - ReceivedScreen(areTransfersEmpty = { true }) + ReceivedScreen(areTransfersEmpty = { true }, isFileChecked = { false }, setFileCheckStatus = { _, _ -> }) } } } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentListScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentListScreen.kt index 4fca7eb5f..d5f44b572 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentListScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentListScreen.kt @@ -17,16 +17,12 @@ */ package com.infomaniak.swisstransfer.ui.screen.main.sent -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp import com.infomaniak.swisstransfer.ui.components.FileUiItem -import com.infomaniak.swisstransfer.ui.components.FileItem +import com.infomaniak.swisstransfer.ui.components.FileItemList import com.infomaniak.swisstransfer.ui.theme.Margin import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme import com.infomaniak.swisstransfer.ui.utils.PreviewLargeWindow @@ -34,30 +30,34 @@ import com.infomaniak.swisstransfer.ui.utils.PreviewSmallWindow @Composable fun SentListScreen(transfers: List) { - LazyVerticalGrid( + val transfers = listOf(object : FileUiItem { + override val fileName: String = "The 5-Step Guide to Not Breaking Your Code.txt" + override val uid: String = fileName + override val fileSizeInBytes: Long = 57689032 + override val mimeType: String? = null + override val uri: String = "" + }, object : FileUiItem { + override val fileName: String = "Introduction to Turning It Off and On Again.pptx" + override val uid: String = fileName + override val fileSizeInBytes: Long = 89723143 + override val mimeType: String? = null + override val uri: String = "" + }, object : FileUiItem { + override val fileName: String = "Learning to Copy and Paste: A Complete Guide.docx" + override val uid: String = fileName + override val fileSizeInBytes: Long = 237866728 + override val mimeType: String? = null + override val uri: String = "" + }) + FileItemList( modifier = Modifier.padding(Margin.Medium), - columns = GridCells.Adaptive(150.dp), - verticalArrangement = Arrangement.spacedBy(Margin.Medium), - horizontalArrangement = Arrangement.spacedBy(Margin.Medium), - ) { - val imageFile = object : FileUiItem { - override val fileName: String = "Time-Clock-Circle--Streamline-Ultimate.svg (1).png" - override val uid: String = fileName - override val fileSizeInBytes: Long = 456782 - override val mimeType: String? = null - override val uri: String = "https://picsum.photos/200/300" - } - - items(3) { - FileItem( - file = imageFile, - isRemoveButtonVisible = true, - isCheckboxVisible = true, - isChecked = { true }, - onClick = {}, - onRemove = {}) - } - } + files = transfers, + isRemoveButtonVisible = true, + isCheckboxVisible = false, + isUidChecked = { false }, + setUidCheckStatus = { _, _ -> }, + onRemoveUid = {}, + ) } @PreviewSmallWindow diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt index 716aa01ba..84a9f7b88 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt @@ -59,7 +59,6 @@ private fun SentScreen(transfers: List?) { SentListScreen(transfers) } } - } @PreviewSmallWindow diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt index 10f39925e..d0e270aac 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentViewModel.kt @@ -17,6 +17,8 @@ */ package com.infomaniak.swisstransfer.ui.screen.main.sent +import androidx.compose.runtime.mutableStateMapOf +import androidx.compose.runtime.snapshots.SnapshotStateMap import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -28,4 +30,5 @@ import javax.inject.Inject @HiltViewModel class SentViewModel @Inject constructor() : ViewModel() { val transfers = flow> { emit(listOf(1)) }.stateIn(viewModelScope, SharingStarted.Eagerly, null) + val selectedTransferIds: SnapshotStateMap = mutableStateMapOf() } diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/ColorDark.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/ColorDark.kt index 67a87f4c9..915997981 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/ColorDark.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/ColorDark.kt @@ -75,7 +75,7 @@ val CustomDarkColorScheme = CustomColorScheme( navigationItemBackground = Color(dark2), tertiaryButtonBackground = Color(dark2), selectedSettingItem = Color(dark2), - fileTileRemoveButtonBackground = Color(black_translucent), + fileItemRemoveButtonBackground = Color(black_translucent), transferTypeLinkContainer = Color(specific1), transferTypeLinkOnContainer = Color(green_main), transferTypeEmailContainer = Color(green_dark), diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/ColorLight.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/ColorLight.kt index 1a888a5a3..0834bb1cd 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/ColorLight.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/ColorLight.kt @@ -76,7 +76,7 @@ val CustomLightColorScheme = CustomColorScheme( navigationItemBackground = LightColorScheme.background, tertiaryButtonBackground = Color(rabbit), selectedSettingItem = Color(rabbit), - fileTileRemoveButtonBackground = Color(black_translucent), + fileItemRemoveButtonBackground = Color(black_translucent), transferTypeLinkContainer = Color(specific1), transferTypeLinkOnContainer = Color(green_main), transferTypeEmailContainer = Color(specific2), diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/Theme.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/Theme.kt index 27fce6db1..6e252c599 100644 --- a/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/Theme.kt +++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/theme/Theme.kt @@ -75,7 +75,7 @@ data class CustomColorScheme( val navigationItemBackground: Color = Color.Unspecified, val tertiaryButtonBackground: Color = Color.Unspecified, val selectedSettingItem: Color = Color.Unspecified, - val fileTileRemoveButtonBackground: Color = Color.Unspecified, + val fileItemRemoveButtonBackground: Color = Color.Unspecified, val transferTypeLinkContainer: Color = Color.Unspecified, val transferTypeLinkOnContainer: Color = Color.Unspecified, val transferTypeEmailContainer: Color = Color.Unspecified,