Skip to content

Commit 5f9ffed

Browse files
committed
[UI] Iterate on selected room rendering.
1 parent a5f12f7 commit 5f9ffed

File tree

1 file changed

+69
-3
lines changed
  • libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components

1 file changed

+69
-3
lines changed

libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/SelectedRoom.kt

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,25 @@ import androidx.compose.foundation.shape.CircleShape
1818
import androidx.compose.material3.MaterialTheme
1919
import androidx.compose.material3.ripple
2020
import androidx.compose.runtime.Composable
21+
import androidx.compose.runtime.CompositionLocalProvider
2122
import androidx.compose.runtime.remember
2223
import androidx.compose.ui.Alignment
2324
import androidx.compose.ui.Modifier
2425
import androidx.compose.ui.draw.clip
26+
import androidx.compose.ui.draw.drawWithContent
27+
import androidx.compose.ui.geometry.Offset
28+
import androidx.compose.ui.graphics.BlendMode
29+
import androidx.compose.ui.graphics.Color
30+
import androidx.compose.ui.graphics.CompositingStrategy
31+
import androidx.compose.ui.graphics.graphicsLayer
32+
import androidx.compose.ui.platform.LocalLayoutDirection
2533
import androidx.compose.ui.res.stringResource
34+
import androidx.compose.ui.semantics.clearAndSetSemantics
35+
import androidx.compose.ui.semantics.contentDescription
36+
import androidx.compose.ui.semantics.onClick
2637
import androidx.compose.ui.text.style.TextOverflow
2738
import androidx.compose.ui.tooling.preview.PreviewParameter
39+
import androidx.compose.ui.unit.LayoutDirection
2840
import androidx.compose.ui.unit.dp
2941
import io.element.android.compound.theme.ElementTheme
3042
import io.element.android.compound.tokens.generated.CompoundIcons
@@ -33,6 +45,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
3345
import io.element.android.libraries.designsystem.components.avatar.AvatarType
3446
import io.element.android.libraries.designsystem.preview.ElementPreview
3547
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
48+
import io.element.android.libraries.designsystem.text.toPx
3649
import io.element.android.libraries.designsystem.theme.components.Icon
3750
import io.element.android.libraries.designsystem.theme.components.Surface
3851
import io.element.android.libraries.designsystem.theme.components.Text
@@ -47,14 +60,51 @@ fun SelectedRoom(
4760
onRemoveRoom: (SelectRoomInfo) -> Unit,
4861
modifier: Modifier = Modifier,
4962
) {
63+
val actionRemove = stringResource(id = CommonStrings.action_remove)
5064
Box(
5165
modifier = modifier
52-
.width(56.dp)
66+
.width(AvatarSize.SelectedRoom.dp)
67+
.clearAndSetSemantics {
68+
contentDescription = roomInfo.name ?: "#"
69+
// Note: this does not set the click effect to the whole Box
70+
// when talkback is not enabled
71+
onClick(
72+
label = actionRemove,
73+
action = {
74+
onRemoveRoom(roomInfo)
75+
true
76+
}
77+
)
78+
}
5379
) {
5480
Column(
5581
horizontalAlignment = Alignment.CenterHorizontally,
5682
) {
83+
val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
84+
val closeRadius = 12.dp.toPx()
85+
val closeOffset = 10.dp.toPx()
5786
Avatar(
87+
modifier = Modifier
88+
.graphicsLayer {
89+
compositingStrategy = CompositingStrategy.Offscreen
90+
}
91+
.drawWithContent {
92+
drawContent()
93+
val xOffset = if (isRtl) {
94+
closeOffset
95+
} else {
96+
size.width - closeOffset
97+
}
98+
drawCircle(
99+
color = Color.Black,
100+
center = Offset(
101+
x = xOffset,
102+
y = closeOffset,
103+
),
104+
radius = closeRadius,
105+
blendMode = BlendMode.Clear,
106+
)
107+
},
58108
avatarData = roomInfo.getAvatarData(AvatarSize.SelectedRoom),
59109
avatarType = AvatarType.Room(
60110
heroes = roomInfo.heroes.map { it.getAvatarData(AvatarSize.SelectedRoom) }.toImmutableList(),
@@ -66,11 +116,12 @@ fun SelectedRoom(
66116
text = roomInfo.name ?: "#",
67117
overflow = TextOverflow.Ellipsis,
68118
maxLines = 1,
69-
style = MaterialTheme.typography.bodyLarge,
119+
style = MaterialTheme.typography.bodyMedium,
120+
color = ElementTheme.colors.textSecondary,
70121
)
71122
}
72123
Surface(
73-
color = ElementTheme.colors.iconPrimary,
124+
color = ElementTheme.colors.bgActionPrimaryRest,
74125
modifier = Modifier
75126
.clip(CircleShape)
76127
.size(20.dp)
@@ -101,3 +152,18 @@ internal fun SelectedRoomPreview(
101152
onRemoveRoom = {},
102153
)
103154
}
155+
156+
@PreviewsDayNight
157+
@Composable
158+
internal fun SelectedRoomRtlPreview(
159+
@PreviewParameter(SelectRoomInfoProvider::class) roomInfo: SelectRoomInfo
160+
) = CompositionLocalProvider(
161+
LocalLayoutDirection provides LayoutDirection.Rtl,
162+
) {
163+
ElementPreview {
164+
SelectedRoom(
165+
roomInfo = roomInfo,
166+
onRemoveRoom = {},
167+
)
168+
}
169+
}

0 commit comments

Comments
 (0)