diff --git a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt index 1b91c1f7c22..7dbd59ca41a 100644 --- a/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt +++ b/app/src/main/kotlin/com/wire/android/ui/home/conversations/details/GroupConversationDetailsScreen.kt @@ -162,7 +162,14 @@ fun GroupConversationDetailsScreen( val onConversationMediaClick: () -> Unit = { if (groupOptions.isWireCellEnabled && groupOptions.isWireCellFeatureEnabled) { - navigator.navigate(NavigationCommand(ConversationFilesScreenDestination(viewModel.conversationId.toString()))) + navigator.navigate( + NavigationCommand( + ConversationFilesScreenDestination( + conversationId = viewModel.conversationId.toString(), + breadcrumbs = arrayOf(groupOptions.groupName) + ) + ) + ) } else { navigator.navigate(NavigationCommand(ConversationMediaScreenDestination(viewModel.conversationId))) } diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesScreen.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesScreen.kt index 993b890db50..c5a8934f87e 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesScreen.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesScreen.kt @@ -164,7 +164,8 @@ fun ConversationFilesScreenContent( NavigationCommand( RecycleBinScreenDestination( conversationId = currentNodeUuid?.substringBefore("/"), - isRecycleBin = true + isRecycleBin = true, + breadcrumbs = arrayOf(breadcrumbs?.first() ?: ""), ) ) ) @@ -196,6 +197,7 @@ fun ConversationFilesScreenContent( modifier = Modifier .height(dimensions().spacing40x) .fillMaxWidth(), + isRecycleBin = isRecycleBin, pathSegments = it, onBreadcrumbsFolderClick = onBreadcrumbsFolderClick ) @@ -250,9 +252,7 @@ fun ConversationFilesScreenContent( screenTitle = title, isRecycleBin = isRecycleBin, parentFolderUuid = parentFolderUuid, - breadcrumbs = if (!isRecycleBin) { - (breadcrumbs ?: emptyArray()) + title - } else { null } + breadcrumbs = (breadcrumbs ?: emptyArray()) + title ), BackStackMode.NONE, launchSingleTop = false diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesWithSlideInTransitionScreen.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesWithSlideInTransitionScreen.kt index 03c387cbca1..17326f942e7 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesWithSlideInTransitionScreen.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/ConversationFilesWithSlideInTransitionScreen.kt @@ -20,8 +20,10 @@ package com.wire.android.feature.cells.ui import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState +import androidx.compose.ui.res.stringResource import androidx.hilt.navigation.compose.hiltViewModel import androidx.paging.compose.collectAsLazyPagingItems +import com.wire.android.feature.cells.R import com.wire.android.feature.cells.ui.destinations.ConversationFilesWithSlideInTransitionScreenDestination import com.wire.android.feature.cells.ui.destinations.RecycleBinScreenDestination import com.wire.android.navigation.BackStackMode @@ -58,7 +60,7 @@ fun ConversationFilesWithSlideInTransitionScreen( ConversationFilesScreenContent( navigator = navigator, currentNodeUuid = viewModel.currentNodeUuid(), - screenTitle = cellFilesNavArgs.screenTitle, + screenTitle = stringResource(R.string.conversation_files_title), isRecycleBin = viewModel.isRecycleBin(), actions = viewModel.actions, pagingListItems = viewModel.nodesFlow.collectAsLazyPagingItems(), diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/common/Breadcrumbs.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/common/Breadcrumbs.kt index 00f9758e8ad..221bca03e9c 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/common/Breadcrumbs.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/common/Breadcrumbs.kt @@ -19,13 +19,20 @@ package com.wire.android.feature.cells.ui.common import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.painterResource +import com.wire.android.feature.cells.R import com.wire.android.ui.common.colorsScheme import com.wire.android.ui.common.dimensions import com.wire.android.ui.common.preview.MultipleThemePreviews @@ -35,6 +42,7 @@ import com.wire.android.ui.theme.wireTypography fun Breadcrumbs( pathSegments: Array, modifier: Modifier = Modifier, + isRecycleBin: Boolean = false, onBreadcrumbsFolderClick: (index: Int) -> Unit ) { val listState = rememberLazyListState() @@ -55,36 +63,83 @@ fun Breadcrumbs( ) { pathSegments.forEachIndexed { index, item -> item { - if (index != pathSegments.lastIndex) { + Row(verticalAlignment = Alignment.CenterVertically) { + if (index != 0) { + Icon( + modifier = Modifier.padding( + start = dimensions().spacing8x, + end = dimensions().spacing8x + ), + painter = painterResource(id = R.drawable.ic_chevron_right), + contentDescription = null + ) + } + Text( - modifier = Modifier - .clickable { onBreadcrumbsFolderClick(index) }, + modifier = Modifier.clickable { onBreadcrumbsFolderClick(index) }, text = item, - style = MaterialTheme.wireTypography.button02.copy( - color = colorsScheme().secondaryText - ), + style = MaterialTheme.wireTypography.button02.run { + if (index == pathSegments.lastIndex && index != 0) { + copy(color = colorsScheme().primary) + } else { + this + } + } ) - Text( - text = " > ", - style = MaterialTheme.wireTypography.button02.copy( - color = colorsScheme().onBackground - ), - ) - } else { - Text( - modifier = Modifier - .clickable { onBreadcrumbsFolderClick(index) }, - text = item, - style = MaterialTheme.wireTypography.button02.copy( - color = colorsScheme().onBackground + + if (isRecycleBin && index == 0) { + val isRecycleBinLast = pathSegments.size == 1 + RecycleBinItem( + color = if (isRecycleBinLast) { + colorsScheme().primary + } else { + colorsScheme().onSurfaceVariant + }, + onBreadcrumbsFolderClick = { onBreadcrumbsFolderClick(0) } ) - ) + } } } } } } +@Composable +private fun RecycleBinItem( + color: Color? = null, + onBreadcrumbsFolderClick: () -> Unit = { } +) { + Row( + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + modifier = Modifier.padding( + start = dimensions().spacing8x, + end = dimensions().spacing8x + ), + painter = painterResource(id = R.drawable.ic_chevron_right), + contentDescription = null + ) + Icon( + modifier = Modifier.padding(end = dimensions().spacing8x), + painter = painterResource(id = R.drawable.ic_trash), + contentDescription = null, + tint = color ?: colorsScheme().onSurfaceVariant + ) + Text( + modifier = Modifier.clickable { onBreadcrumbsFolderClick() }, + text = "Recycle Bin", + style = MaterialTheme.wireTypography.button02.run { + if (color != null) { + copy(color = color) + } else { + this + } + } + ) + } +} + @MultipleThemePreviews @Composable fun PreviewBreadcrumbs() { diff --git a/features/cells/src/main/java/com/wire/android/feature/cells/ui/recyclebin/RecycleBinScreen.kt b/features/cells/src/main/java/com/wire/android/feature/cells/ui/recyclebin/RecycleBinScreen.kt index bb23261c2d9..824f707bd59 100644 --- a/features/cells/src/main/java/com/wire/android/feature/cells/ui/recyclebin/RecycleBinScreen.kt +++ b/features/cells/src/main/java/com/wire/android/feature/cells/ui/recyclebin/RecycleBinScreen.kt @@ -18,6 +18,9 @@ package com.wire.android.feature.cells.ui.recyclebin import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -30,6 +33,7 @@ import com.wire.android.feature.cells.R import com.wire.android.feature.cells.ui.CellFilesNavArgs import com.wire.android.feature.cells.ui.CellScreenContent import com.wire.android.feature.cells.ui.CellViewModel +import com.wire.android.feature.cells.ui.common.Breadcrumbs import com.wire.android.feature.cells.ui.destinations.ConversationFilesWithSlideInTransitionScreenDestination import com.wire.android.feature.cells.ui.destinations.MoveToFolderScreenDestination import com.wire.android.feature.cells.ui.destinations.PublicLinkScreenDestination @@ -57,20 +61,33 @@ fun RecycleBinScreen( Box(modifier = modifier) { WireScaffold( topBar = { - WireCenterAlignedTopAppBar( - elevation = dimensions().spacing0x, - titleContent = { - WireTopAppBarTitle( - title = stringResource(R.string.recycle_bin), - style = MaterialTheme.wireTypography.title01, - maxLines = 2 + Column { + WireCenterAlignedTopAppBar( + elevation = dimensions().spacing0x, + titleContent = { + WireTopAppBarTitle( + title = stringResource(R.string.recycle_bin), + style = MaterialTheme.wireTypography.title01, + maxLines = 2 + ) + }, + navigationIconType = NavigationIconType.Back(com.wire.android.ui.common.R.string.content_description_back_button), + onNavigationPressed = { + navigator.navigateBack() + } + ) + + cellViewModel.breadcrumbs()?.let { + Breadcrumbs( + modifier = Modifier + .height(dimensions().spacing40x) + .fillMaxWidth(), + pathSegments = it, + isRecycleBin = cellViewModel.isRecycleBin(), + onBreadcrumbsFolderClick = {} ) - }, - navigationIconType = NavigationIconType.Back(com.wire.android.ui.common.R.string.content_description_back_button), - onNavigationPressed = { - navigator.navigateBack() } - ) + } } ) { innerPadding -> Box(modifier = Modifier.padding(innerPadding)) { @@ -91,6 +108,7 @@ fun RecycleBinScreen( conversationId = path, screenTitle = title, isRecycleBin = true, + breadcrumbs = (cellViewModel.breadcrumbs() ?: emptyArray()) + title, parentFolderUuid = parentFolderUuid, ), BackStackMode.NONE, diff --git a/features/cells/src/main/res/drawable/ic_chevron_right.xml b/features/cells/src/main/res/drawable/ic_chevron_right.xml new file mode 100644 index 00000000000..673ce85c55e --- /dev/null +++ b/features/cells/src/main/res/drawable/ic_chevron_right.xml @@ -0,0 +1,27 @@ + + + + diff --git a/features/cells/src/main/res/drawable/ic_trash.xml b/features/cells/src/main/res/drawable/ic_trash.xml new file mode 100644 index 00000000000..43977a4028c --- /dev/null +++ b/features/cells/src/main/res/drawable/ic_trash.xml @@ -0,0 +1,27 @@ + + + +