From 18f200eb06e36ca8bb32cd38f53be880dd9e230b Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 5 Feb 2026 10:35:27 +0100 Subject: [PATCH] SpaceFiltersView : try to fix the BottomSheet hide animation --- .../impl/spacefilters/SpaceFiltersView.kt | 68 ++++++++++++------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spacefilters/SpaceFiltersView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spacefilters/SpaceFiltersView.kt index 5a8c583e57..a753e78a87 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spacefilters/SpaceFiltersView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/spacefilters/SpaceFiltersView.kt @@ -49,6 +49,7 @@ import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.spaces.SpaceServiceFilter import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.ui.strings.CommonStrings +import timber.log.Timber @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -57,34 +58,50 @@ fun SpaceFiltersView( modifier: Modifier = Modifier ) { val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + val isSelecting = state is SpaceFiltersState.Selecting var showSheet by remember { mutableStateOf(false) } - LaunchedEffect(state) { - when (state) { - is SpaceFiltersState.Selecting -> showSheet = true - else -> { - sheetState.hide() - showSheet = false - } + LaunchedEffect(isSelecting) { + if (isSelecting) { + showSheet = true + } else { + sheetState.hide() } } - Box(modifier = modifier) { - if (showSheet && state is SpaceFiltersState.Selecting) { - ModalBottomSheet( + // This is necessary because the animation can get cancelled + // then the sheetState is hidden but the showSheet is still true. + LaunchedEffect(sheetState.isVisible, sheetState.isAnimationRunning) { + if (!sheetState.isVisible && !sheetState.isAnimationRunning) { + showSheet = false + } + } + if (showSheet) { + ModalBottomSheet( + modifier = modifier + .systemBarsPadding() + .navigationBarsPadding(), + sheetState = sheetState, + onDismissRequest = { + if (isSelecting) { + state.eventSink(SpaceFiltersEvent.Selecting.Cancel) + } + } + ) { + Box( modifier = Modifier - .systemBarsPadding() - .navigationBarsPadding(), - sheetState = sheetState, - onDismissRequest = { state.eventSink(SpaceFiltersEvent.Selecting.Cancel) }, + .fillMaxWidth() + .fillMaxHeight(0.9f) ) { - SpaceFiltersBottomSheetContent( - filters = state.visibleFilters, - searchQuery = state.searchQuery, - onFilterSelected = { filter -> - state.eventSink(SpaceFiltersEvent.Selecting.SelectFilter(filter)) - } - ) + if (isSelecting) { + SpaceFiltersBottomSheetContent( + filters = state.visibleFilters, + searchQuery = state.searchQuery, + onFilterSelected = { filter -> + state.eventSink(SpaceFiltersEvent.Selecting.SelectFilter(filter)) + } + ) + } } } } @@ -98,10 +115,7 @@ private fun SpaceFiltersBottomSheetContent( modifier: Modifier = Modifier ) { Column( - modifier = modifier - .fillMaxWidth() - .fillMaxHeight(0.9f) - .padding(vertical = 16.dp) + modifier = modifier.padding(vertical = 16.dp) ) { Text( text = stringResource(R.string.screen_roomlist_your_spaces), @@ -113,7 +127,9 @@ private fun SpaceFiltersBottomSheetContent( Spacer(modifier = Modifier.height(12.dp)) SearchField( state = searchQuery, - modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), placeholder = stringResource(CommonStrings.action_search), ) Spacer(modifier = Modifier.height(16.dp))