Update SpaceRoom visibility related UI

This commit is contained in:
ganfra 2026-02-06 09:36:42 +01:00
parent 7b3ceeb19b
commit 8625c9d5ae
4 changed files with 27 additions and 68 deletions

View file

@ -14,12 +14,12 @@ import io.element.android.libraries.matrix.api.room.join.JoinRule
sealed interface SpaceRoomVisibility { sealed interface SpaceRoomVisibility {
data object Private : SpaceRoomVisibility data object Private : SpaceRoomVisibility
data object Public : SpaceRoomVisibility data object Public : SpaceRoomVisibility
data object Restricted : SpaceRoomVisibility data object SpaceMembers : SpaceRoomVisibility
companion object { companion object {
fun fromJoinRule(joinRule: JoinRule?): SpaceRoomVisibility = when (joinRule) { fun fromJoinRule(joinRule: JoinRule?): SpaceRoomVisibility = when (joinRule) {
JoinRule.Public -> Public JoinRule.Public -> Public
is JoinRule.Restricted, is JoinRule.KnockRestricted -> Restricted is JoinRule.Restricted, is JoinRule.KnockRestricted -> SpaceMembers
// Else fallback to Private // Else fallback to Private
else -> Private else -> Private
} }

View file

@ -117,7 +117,7 @@ internal fun SpaceInfoRowPreview() = ElementPreview {
visibility = SpaceRoomVisibility.Public visibility = SpaceRoomVisibility.Public
) )
SpaceInfoRow( SpaceInfoRow(
visibility = SpaceRoomVisibility.Restricted visibility = SpaceRoomVisibility.SpaceMembers
) )
} }
} }

View file

@ -24,11 +24,9 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.material3.ripple import androidx.compose.material3.ripple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.runtime.remember 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.graphics.vector.ImageVector
import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
@ -100,22 +98,16 @@ fun SpaceRoomItemView(
showIndicator = showUnreadIndicator showIndicator = showUnreadIndicator
) )
Spacer(modifier = Modifier.height(1.dp)) Spacer(modifier = Modifier.height(1.dp))
SubtitleRow( VisibilityRow(visibility = spaceRoom.visibility)
visibilityIcon = spaceRoom.visibilityIcon(),
subtitle = spaceRoom.subtitle()
)
Spacer(modifier = Modifier.height(1.dp)) Spacer(modifier = Modifier.height(1.dp))
val info = spaceRoom.info() Text(
if (info.isNotBlank()) { modifier = Modifier.weight(1f),
Text( style = ElementTheme.typography.fontBodyMdRegular,
modifier = Modifier.weight(1f), text = pluralStringResource(CommonPlurals.common_member_count, spaceRoom.numJoinedMembers, spaceRoom.numJoinedMembers),
style = ElementTheme.typography.fontBodyMdRegular, color = ElementTheme.colors.textSecondary,
text = info, maxLines = 1,
color = ElementTheme.colors.textSecondary, overflow = TextOverflow.Ellipsis
maxLines = 1, )
overflow = TextOverflow.Ellipsis
)
}
} }
if (bottomAction != null) { if (bottomAction != null) {
Spacer(modifier = Modifier.height(12.dp)) Spacer(modifier = Modifier.height(12.dp))
@ -129,29 +121,26 @@ fun SpaceRoomItemView(
} }
@Composable @Composable
private fun SubtitleRow( private fun VisibilityRow(
visibilityIcon: ImageVector?, visibility: SpaceRoomVisibility,
subtitle: String,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
) { ) {
Row( Row(
modifier = modifier.fillMaxWidth(), modifier = modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
if (visibilityIcon != null) { Icon(
Icon( modifier = Modifier
modifier = Modifier .size(16.dp)
.size(16.dp) .padding(end = 4.dp),
.padding(end = 4.dp), imageVector = visibility.icon,
imageVector = visibilityIcon, contentDescription = null,
contentDescription = null, tint = ElementTheme.colors.iconTertiary,
tint = ElementTheme.colors.iconTertiary, )
)
}
Text( Text(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
style = ElementTheme.typography.fontBodyMdRegular, style = ElementTheme.typography.fontBodyMdRegular,
text = subtitle, text = visibility.label,
color = ElementTheme.colors.textSecondary, color = ElementTheme.colors.textSecondary,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
@ -219,36 +208,6 @@ private fun SpaceRoomItemScaffold(
} }
} }
@Composable
@ReadOnlyComposable
private fun SpaceRoom.subtitle(): String {
return if (isSpace) {
visibility.label
} else {
pluralStringResource(CommonPlurals.common_member_count, numJoinedMembers, numJoinedMembers)
}
}
@Composable
@ReadOnlyComposable
private fun SpaceRoom.info(): String {
return if (isSpace) {
pluralStringResource(CommonPlurals.common_member_count, numJoinedMembers, numJoinedMembers)
} else {
topic.orEmpty()
}
}
@Composable
private fun SpaceRoom.visibilityIcon(): ImageVector? {
// Don't show any icon for restricted rooms as it's the default and would add noise
return if (visibility == SpaceRoomVisibility.Restricted) {
null
} else {
visibility.icon
}
}
@Composable @Composable
@PreviewsDayNight @PreviewsDayNight
internal fun SpaceRoomItemViewPreview(@PreviewParameter(SpaceRoomProvider::class) spaceRoom: SpaceRoom) = ElementPreview { internal fun SpaceRoomItemViewPreview(@PreviewParameter(SpaceRoomProvider::class) spaceRoom: SpaceRoom) = ElementPreview {

View file

@ -32,7 +32,7 @@ val SpaceRoomVisibility.icon: ImageVector
return when (this) { return when (this) {
SpaceRoomVisibility.Private -> CompoundIcons.LockSolid() SpaceRoomVisibility.Private -> CompoundIcons.LockSolid()
SpaceRoomVisibility.Public -> CompoundIcons.Public() SpaceRoomVisibility.Public -> CompoundIcons.Public()
SpaceRoomVisibility.Restricted -> CompoundIcons.Space() SpaceRoomVisibility.SpaceMembers -> CompoundIcons.Space()
} }
} }
@ -41,8 +41,8 @@ val SpaceRoomVisibility.label: String
@ReadOnlyComposable @ReadOnlyComposable
get() { get() {
return when (this) { return when (this) {
SpaceRoomVisibility.Private -> stringResource(CommonStrings.common_private_space) SpaceRoomVisibility.Private -> stringResource(CommonStrings.common_private)
SpaceRoomVisibility.Public -> stringResource(CommonStrings.common_public_space) SpaceRoomVisibility.Public -> stringResource(CommonStrings.common_public)
SpaceRoomVisibility.Restricted -> stringResource(CommonStrings.common_shared_space) SpaceRoomVisibility.SpaceMembers -> stringResource(CommonStrings.common_space_members)
} }
} }