Merge pull request #2809 from frebib/frebib/filter-in-front

Bring selected filter to front
This commit is contained in:
Benoit Marty 2024-05-23 16:26:55 +02:00 committed by GitHub
commit 180c300a28
2 changed files with 36 additions and 16 deletions

1
changelog.d/2809.bugfix Normal file
View file

@ -0,0 +1 @@
Render selected/deselected room list filters on top

View file

@ -16,6 +16,9 @@
package io.element.android.features.roomlist.impl.filters package io.element.android.features.roomlist.impl.filters
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.Spring
import androidx.compose.animation.core.spring
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
@ -31,13 +34,15 @@ import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.FilterChip import androidx.compose.material3.FilterChip
import androidx.compose.material3.FilterChipDefaults import androidx.compose.material3.FilterChipDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import io.element.android.compound.theme.ElementTheme import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.ElementPreview
@ -62,6 +67,7 @@ fun RoomListFiltersView(
} }
val lazyListState = rememberLazyListState() val lazyListState = rememberLazyListState()
val previousFilters = remember { mutableStateOf(listOf<RoomListFilter>()) }
LazyRow( LazyRow(
contentPadding = PaddingValues(start = 8.dp, end = 16.dp), contentPadding = PaddingValues(start = 8.dp, end = 16.dp),
modifier = modifier.fillMaxWidth(), modifier = modifier.fillMaxWidth(),
@ -75,28 +81,30 @@ fun RoomListFiltersView(
modifier = Modifier modifier = Modifier
.padding(start = 8.dp) .padding(start = 8.dp)
.testTag(TestTags.homeScreenClearFilters), .testTag(TestTags.homeScreenClearFilters),
onClick = ::onClearFiltersClicked onClick = {
previousFilters.value = state.selectedFilters()
onClearFiltersClicked()
}
) )
} }
} }
for (filterWithSelection in state.filterSelectionStates) { state.filterSelectionStates.forEachIndexed { i, filterWithSelection ->
item(filterWithSelection.filter) { item(filterWithSelection.filter) {
val zIndex = (if (previousFilters.value.contains(filterWithSelection.filter)) state.filterSelectionStates.size else 0) - i.toFloat()
RoomListFilterView( RoomListFilterView(
modifier = Modifier.animateItemPlacement(), modifier = Modifier
.animateItemPlacement()
.zIndex(zIndex),
roomListFilter = filterWithSelection.filter, roomListFilter = filterWithSelection.filter,
selected = filterWithSelection.isSelected, selected = filterWithSelection.isSelected,
onClick = ::onToggleFilter, onClick = {
previousFilters.value = state.selectedFilters()
onToggleFilter(it)
},
) )
} }
} }
} }
LaunchedEffect(state.filterSelectionStates) {
// Checking for canScrollBackward is necessary for the itemPlacementAnimation to work correctly.
// We don't want the itemPlacementAnimation to be triggered when clearing the filters.
if (!state.hasAnyFilterSelected || lazyListState.canScrollBackward) {
lazyListState.animateScrollToItem(0)
}
}
} }
@Composable @Composable
@ -126,16 +134,27 @@ private fun RoomListFilterView(
onClick: (RoomListFilter) -> Unit, onClick: (RoomListFilter) -> Unit,
modifier: Modifier = Modifier modifier: Modifier = Modifier
) { ) {
val background = animateColorAsState(
targetValue = if (selected) ElementTheme.colors.bgActionPrimaryRest else ElementTheme.colors.bgCanvasDefault,
animationSpec = spring(stiffness = Spring.StiffnessMediumLow),
label = "chip background colour",
)
val textColour = animateColorAsState(
targetValue = if (selected) ElementTheme.colors.textOnSolidPrimary else ElementTheme.colors.textPrimary,
animationSpec = spring(stiffness = Spring.StiffnessMediumLow),
label = "chip text colour",
)
FilterChip( FilterChip(
selected = selected, selected = selected,
onClick = { onClick(roomListFilter) }, onClick = { onClick(roomListFilter) },
modifier = modifier.height(36.dp), modifier = modifier.height(36.dp),
shape = CircleShape, shape = CircleShape,
colors = FilterChipDefaults.filterChipColors( colors = FilterChipDefaults.filterChipColors(
containerColor = ElementTheme.colors.bgCanvasDefault, containerColor = background.value,
selectedContainerColor = ElementTheme.colors.bgActionPrimaryRest, selectedContainerColor = background.value,
labelColor = ElementTheme.colors.textPrimary, labelColor = textColour.value,
selectedLabelColor = ElementTheme.colors.textOnSolidPrimary, selectedLabelColor = textColour.value
), ),
label = { label = {
Text(text = stringResource(id = roomListFilter.stringResource)) Text(text = stringResource(id = roomListFilter.stringResource))