Animate user status state change

This commit is contained in:
Benoit Marty
2026-09-21 09:50:03 +02:00
parent ae36cc3b1e
commit cc3b788b3e
@@ -7,12 +7,12 @@
package io.element.android.features.preferences.impl.userstatus package io.element.android.features.preferences.impl.userstatus
import androidx.compose.animation.AnimatedContent
import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.sizeIn import androidx.compose.foundation.layout.sizeIn
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
@@ -72,8 +72,19 @@ fun UserStatusView(
emojiPickerRenderer: EmojiPickerRenderer, emojiPickerRenderer: EmojiPickerRenderer,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
when (val pickerState = state.pickerState) { AnimatedContent(
UserStatusPickerState.Hidden, UserStatusPickerState.ShowingPicker -> { targetState = state,
contentKey = {
when (it.pickerState) {
UserStatusPickerState.Hidden,
UserStatusPickerState.ShowingPicker -> if (state.displayedStatus != null) 0 else 1
is UserStatusPickerState.CustomInput -> 2
}
},
) { userStatusState ->
when (val pickerState = userStatusState.pickerState) {
UserStatusPickerState.Hidden,
UserStatusPickerState.ShowingPicker -> {
val displayedStatus = state.displayedStatus val displayedStatus = state.displayedStatus
if (displayedStatus != null) { if (displayedStatus != null) {
CurrentStatusRow( CurrentStatusRow(
@@ -88,14 +99,6 @@ fun UserStatusView(
modifier = modifier, modifier = modifier,
) )
} }
if (pickerState == UserStatusPickerState.ShowingPicker) {
UserStatusPickerBottomSheet(
currentRawStatus = state.rawStatus,
onDismiss = { state.eventSink(UserStatusEvent.DismissPicker) },
onSelectPredefinedStatus = { status -> state.eventSink(UserStatusEvent.SetStatus(status)) },
onSelectCustomStatus = { state.eventSink(UserStatusEvent.OpenCustomInput) },
)
}
} }
is UserStatusPickerState.CustomInput -> { is UserStatusPickerState.CustomInput -> {
CustomStatusInputRow( CustomStatusInputRow(
@@ -111,8 +114,23 @@ fun UserStatusView(
onEmojiClick = { state.eventSink(UserStatusEvent.OpenEmojiPicker) }, onEmojiClick = { state.eventSink(UserStatusEvent.OpenEmojiPicker) },
modifier = modifier, modifier = modifier,
) )
}
}
}
when (val pickerState = state.pickerState) {
UserStatusPickerState.Hidden -> Unit
UserStatusPickerState.ShowingPicker -> {
UserStatusPickerBottomSheet(
currentRawStatus = state.rawStatus,
onDismiss = { state.eventSink(UserStatusEvent.DismissPicker) },
onSelectPredefinedStatus = { status -> state.eventSink(UserStatusEvent.SetStatus(status)) },
onSelectCustomStatus = { state.eventSink(UserStatusEvent.OpenCustomInput) },
)
}
is UserStatusPickerState.CustomInput -> {
when (val sheet = pickerState.emojiPickerSheetState) { when (val sheet = pickerState.emojiPickerSheetState) {
EmojiPickerSheetState.Hidden, EmojiPickerSheetState.Loading -> Unit EmojiPickerSheetState.Hidden,
EmojiPickerSheetState.Loading -> Unit
is EmojiPickerSheetState.Shown -> EmojiPickerBottomSheet( is EmojiPickerSheetState.Shown -> EmojiPickerBottomSheet(
pickerState = sheet.state, pickerState = sheet.state,
emojiPickerRenderer = emojiPickerRenderer, emojiPickerRenderer = emojiPickerRenderer,
@@ -133,7 +151,6 @@ private fun EmptyStatusRow(
content = { content = {
Text( Text(
text = stringResource(R.string.screen_settings_user_status_placeholder), text = stringResource(R.string.screen_settings_user_status_placeholder),
modifier = Modifier.padding(vertical = 16.dp),
) )
}, },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Reaction())), leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Reaction())),
@@ -153,7 +170,7 @@ private fun CurrentStatusRow(
is DisplayedStatus.InCall -> "🎧" to stringResource(CommonStrings.common_on_a_call) is DisplayedStatus.InCall -> "🎧" to stringResource(CommonStrings.common_on_a_call)
} }
ListItem( ListItem(
content = { Text(text = text, modifier = Modifier.padding(vertical = 16.dp)) }, content = { Text(text = text) },
leadingContent = ListItemContent.Custom { EmojiText(emoji) }, leadingContent = ListItemContent.Custom { EmojiText(emoji) },
trailingContent = ListItemContent.Custom({ trailingContent = ListItemContent.Custom({
IconButton( IconButton(