Animate transition from/to space manage rooms mode.

This commit is contained in:
ganfra 2026-01-14 16:39:57 +01:00
parent bed35807d2
commit 6d3dfe7687

View file

@ -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,25 +111,36 @@ fun SpaceView(
Scaffold( Scaffold(
modifier = modifier, modifier = modifier,
topBar = { topBar = {
if (state.isManageMode) { Box {
ManageModeTopBar( AnimatedVisibility(
selectedCount = state.selectedCount, visible = state.isManageMode,
isRemoveButtonEnabled = state.isRemoveButtonEnabled, enter = fadeIn(),
onCancelClick = { state.eventSink(SpaceEvents.ExitManageMode) }, exit = fadeOut()
onRemoveClick = { state.eventSink(SpaceEvents.RemoveSelectedRooms) }, ) {
) ManageModeTopBar(
} else { selectedCount = state.selectedCount,
SpaceViewTopBar( isRemoveButtonEnabled = state.isRemoveButtonEnabled,
currentSpace = state.currentSpace, onCancelClick = { state.eventSink(SpaceEvents.ExitManageMode) },
canAccessSpaceSettings = state.canAccessSpaceSettings, onRemoveClick = { state.eventSink(SpaceEvents.RemoveSelectedRooms) },
showManageRoomsAction = state.showManageRoomsAction, )
onBackClick = onBackClick, }
onLeaveSpaceClick = onLeaveSpaceClick, AnimatedVisibility(
onShareSpace = onShareSpace, visible = !state.isManageMode,
onSettingsClick = onSettingsClick, enter = fadeIn(),
onViewMembersClick = onViewMembersClick, exit = fadeOut()
onManageRoomsClick = { state.eventSink(SpaceEvents.EnterManageMode) }, ) {
) SpaceViewTopBar(
currentSpace = state.currentSpace,
canAccessSpaceSettings = state.canAccessSpaceSettings,
showManageRoomsAction = state.showManageRoomsAction,
onBackClick = onBackClick,
onLeaveSpaceClick = onLeaveSpaceClick,
onShareSpace = onShareSpace,
onSettingsClick = onSettingsClick,
onViewMembersClick = onViewMembersClick,
onManageRoomsClick = { state.eventSink(SpaceEvents.EnterManageMode) },
)
}
} }
}, },
content = { padding -> content = { padding ->
@ -218,20 +237,26 @@ 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") {
SpaceHeaderView( AnimatedVisibility(
avatarData = currentSpace.getAvatarData(AvatarSize.SpaceHeader), !state.isManageMode,
name = currentSpace.displayName, enter = fadeIn() + expandVertically(),
topic = currentSpace.topic, exit = fadeOut() + shrinkVertically()
topicMaxLines = 2, ) {
visibility = currentSpace.visibility, Column {
heroes = currentSpace.heroes.toImmutableList(), SpaceHeaderView(
numberOfMembers = currentSpace.numJoinedMembers, avatarData = currentSpace.getAvatarData(AvatarSize.SpaceHeader),
onTopicClick = onTopicClick name = currentSpace.displayName,
) topic = currentSpace.topic,
} topicMaxLines = 2,
item { visibility = currentSpace.visibility,
HorizontalDivider() heroes = currentSpace.heroes.toImmutableList(),
numberOfMembers = currentSpace.numJoinedMembers,
onTopicClick = onTopicClick
)
HorizontalDivider()
}
}
} }
} }
itemsIndexed( itemsIndexed(