Animate transition from/to space manage rooms mode.

This commit is contained in:
ganfra
2026-01-14 16:39:57 +01:00
parent f50165807d
commit 15c7cbade6
@@ -10,9 +10,17 @@ package io.element.android.features.space.impl.root
import androidx.activity.compose.BackHandler import androidx.activity.compose.BackHandler
import androidx.annotation.StringRes import androidx.annotation.StringRes
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.expandVertically
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.shrinkVertically
import androidx.compose.animation.slideIn
import androidx.compose.animation.veilOut
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
@@ -103,14 +111,24 @@ fun SpaceView(
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,
topBar = { topBar = {
if (state.isManageMode) { Box {
AnimatedVisibility(
visible = state.isManageMode,
enter = fadeIn(),
exit = fadeOut()
) {
ManageModeTopBar( ManageModeTopBar(
selectedCount = state.selectedCount, selectedCount = state.selectedCount,
isRemoveButtonEnabled = state.isRemoveButtonEnabled, isRemoveButtonEnabled = state.isRemoveButtonEnabled,
onCancelClick = { state.eventSink(SpaceEvents.ExitManageMode) }, onCancelClick = { state.eventSink(SpaceEvents.ExitManageMode) },
onRemoveClick = { state.eventSink(SpaceEvents.RemoveSelectedRooms) }, onRemoveClick = { state.eventSink(SpaceEvents.RemoveSelectedRooms) },
) )
} else { }
AnimatedVisibility(
visible = !state.isManageMode,
enter = fadeIn(),
exit = fadeOut()
) {
SpaceViewTopBar( SpaceViewTopBar(
currentSpace = state.currentSpace, currentSpace = state.currentSpace,
canAccessSpaceSettings = state.canAccessSpaceSettings, canAccessSpaceSettings = state.canAccessSpaceSettings,
@@ -123,6 +141,7 @@ fun SpaceView(
onManageRoomsClick = { state.eventSink(SpaceEvents.EnterManageMode) }, onManageRoomsClick = { state.eventSink(SpaceEvents.EnterManageMode) },
) )
} }
}
}, },
content = { padding -> content = { padding ->
Box( Box(
@@ -218,7 +237,13 @@ private fun SpaceViewContent(
LazyColumn(modifier.fillMaxSize()) { LazyColumn(modifier.fillMaxSize()) {
val currentSpace = state.currentSpace val currentSpace = state.currentSpace
if (currentSpace != null) { if (currentSpace != null) {
item { item(key = "space_header") {
AnimatedVisibility(
!state.isManageMode,
enter = fadeIn() + expandVertically(),
exit = fadeOut() + shrinkVertically()
) {
Column {
SpaceHeaderView( SpaceHeaderView(
avatarData = currentSpace.getAvatarData(AvatarSize.SpaceHeader), avatarData = currentSpace.getAvatarData(AvatarSize.SpaceHeader),
name = currentSpace.displayName, name = currentSpace.displayName,
@@ -229,11 +254,11 @@ private fun SpaceViewContent(
numberOfMembers = currentSpace.numJoinedMembers, numberOfMembers = currentSpace.numJoinedMembers,
onTopicClick = onTopicClick onTopicClick = onTopicClick
) )
}
item {
HorizontalDivider() HorizontalDivider()
} }
} }
}
}
itemsIndexed( itemsIndexed(
items = state.children, items = state.children,
key = { _, spaceRoom -> spaceRoom.roomId } key = { _, spaceRoom -> spaceRoom.roomId }