Update SpaceRoom visibility related UI

This commit is contained in:
ganfra
2026-02-06 09:36:42 +01:00
parent e4b9f97cba
commit 0118b47a38
4 changed files with 27 additions and 68 deletions
@@ -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
} }
@@ -117,7 +117,7 @@ internal fun SpaceInfoRowPreview() = ElementPreview {
visibility = SpaceRoomVisibility.Public visibility = SpaceRoomVisibility.Public
) )
SpaceInfoRow( SpaceInfoRow(
visibility = SpaceRoomVisibility.Restricted visibility = SpaceRoomVisibility.SpaceMembers
) )
} }
} }
@@ -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 {
@@ -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)
} }
} }