@@ -18,13 +18,25 @@ import androidx.compose.foundation.shape.CircleShape
18
18
import androidx.compose.material3.MaterialTheme
19
19
import androidx.compose.material3.ripple
20
20
import androidx.compose.runtime.Composable
21
+ import androidx.compose.runtime.CompositionLocalProvider
21
22
import androidx.compose.runtime.remember
22
23
import androidx.compose.ui.Alignment
23
24
import androidx.compose.ui.Modifier
24
25
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
25
33
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
26
37
import androidx.compose.ui.text.style.TextOverflow
27
38
import androidx.compose.ui.tooling.preview.PreviewParameter
39
+ import androidx.compose.ui.unit.LayoutDirection
28
40
import androidx.compose.ui.unit.dp
29
41
import io.element.android.compound.theme.ElementTheme
30
42
import io.element.android.compound.tokens.generated.CompoundIcons
@@ -33,6 +45,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
33
45
import io.element.android.libraries.designsystem.components.avatar.AvatarType
34
46
import io.element.android.libraries.designsystem.preview.ElementPreview
35
47
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
48
+ import io.element.android.libraries.designsystem.text.toPx
36
49
import io.element.android.libraries.designsystem.theme.components.Icon
37
50
import io.element.android.libraries.designsystem.theme.components.Surface
38
51
import io.element.android.libraries.designsystem.theme.components.Text
@@ -47,14 +60,51 @@ fun SelectedRoom(
47
60
onRemoveRoom : (SelectRoomInfo ) -> Unit ,
48
61
modifier : Modifier = Modifier ,
49
62
) {
63
+ val actionRemove = stringResource(id = CommonStrings .action_remove)
50
64
Box (
51
65
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
+ }
53
79
) {
54
80
Column (
55
81
horizontalAlignment = Alignment .CenterHorizontally ,
56
82
) {
83
+ val isRtl = LocalLayoutDirection .current == LayoutDirection .Rtl
84
+ val closeRadius = 12 .dp.toPx()
85
+ val closeOffset = 10 .dp.toPx()
57
86
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
+ },
58
108
avatarData = roomInfo.getAvatarData(AvatarSize .SelectedRoom ),
59
109
avatarType = AvatarType .Room (
60
110
heroes = roomInfo.heroes.map { it.getAvatarData(AvatarSize .SelectedRoom ) }.toImmutableList(),
@@ -66,11 +116,12 @@ fun SelectedRoom(
66
116
text = roomInfo.name ? : " #" ,
67
117
overflow = TextOverflow .Ellipsis ,
68
118
maxLines = 1 ,
69
- style = MaterialTheme .typography.bodyLarge,
119
+ style = MaterialTheme .typography.bodyMedium,
120
+ color = ElementTheme .colors.textSecondary,
70
121
)
71
122
}
72
123
Surface (
73
- color = ElementTheme .colors.iconPrimary ,
124
+ color = ElementTheme .colors.bgActionPrimaryRest ,
74
125
modifier = Modifier
75
126
.clip(CircleShape )
76
127
.size(20 .dp)
@@ -101,3 +152,18 @@ internal fun SelectedRoomPreview(
101
152
onRemoveRoom = {},
102
153
)
103
154
}
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