Skip to content

Commit 57ee4e6

Browse files
committed
[UI] Iterate on selected user rendering.
1 parent c6ca70b commit 57ee4e6

File tree

2 files changed

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

2 files changed

+55
-3
lines changed

libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarSize.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ enum class AvatarSize(val dp: Dp) {
2424
UserHeader(96.dp),
2525
UserListItem(36.dp),
2626

27-
SelectedUser(56.dp),
27+
SelectedUser(52.dp),
2828
SelectedRoom(56.dp),
2929

3030
DmCluster(75.dp),

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

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,29 @@ import androidx.compose.foundation.layout.padding
1515
import androidx.compose.foundation.layout.size
1616
import androidx.compose.foundation.layout.width
1717
import androidx.compose.foundation.shape.CircleShape
18+
import androidx.compose.material3.MaterialTheme
1819
import androidx.compose.material3.ripple
1920
import androidx.compose.runtime.Composable
21+
import androidx.compose.runtime.CompositionLocalProvider
2022
import androidx.compose.runtime.remember
2123
import androidx.compose.ui.Alignment
2224
import androidx.compose.ui.Modifier
2325
import androidx.compose.ui.draw.clip
2426
import androidx.compose.ui.draw.clipToBounds
27+
import androidx.compose.ui.draw.drawWithContent
28+
import androidx.compose.ui.geometry.Offset
29+
import androidx.compose.ui.graphics.BlendMode
30+
import androidx.compose.ui.graphics.Color
31+
import androidx.compose.ui.graphics.CompositingStrategy
32+
import androidx.compose.ui.graphics.graphicsLayer
33+
import androidx.compose.ui.platform.LocalLayoutDirection
2534
import androidx.compose.ui.res.stringResource
2635
import androidx.compose.ui.semantics.clearAndSetSemantics
2736
import androidx.compose.ui.semantics.contentDescription
2837
import androidx.compose.ui.semantics.onClick
2938
import androidx.compose.ui.text.style.TextAlign
3039
import androidx.compose.ui.text.style.TextOverflow
40+
import androidx.compose.ui.unit.LayoutDirection
3141
import androidx.compose.ui.unit.dp
3242
import io.element.android.compound.theme.ElementTheme
3343
import io.element.android.compound.tokens.generated.CompoundIcons
@@ -36,6 +46,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize
3646
import io.element.android.libraries.designsystem.components.avatar.AvatarType
3747
import io.element.android.libraries.designsystem.preview.ElementPreview
3848
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
49+
import io.element.android.libraries.designsystem.text.toPx
3950
import io.element.android.libraries.designsystem.theme.components.Icon
4051
import io.element.android.libraries.designsystem.theme.components.Surface
4152
import io.element.android.libraries.designsystem.theme.components.Text
@@ -73,22 +84,49 @@ fun SelectedUser(
7384
Column(
7485
horizontalAlignment = Alignment.CenterHorizontally,
7586
) {
87+
val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
88+
val closeRadius = 12.dp.toPx()
89+
val closeOffset = 10.dp.toPx()
7690
Avatar(
7791
avatarData = matrixUser.getAvatarData(size = AvatarSize.SelectedUser),
7892
avatarType = AvatarType.User,
93+
modifier = Modifier
94+
.graphicsLayer {
95+
compositingStrategy = CompositingStrategy.Offscreen
96+
}
97+
.drawWithContent {
98+
drawContent()
99+
if (canRemove) {
100+
val xOffset = if (isRtl) {
101+
closeOffset
102+
} else {
103+
size.width - closeOffset
104+
}
105+
drawCircle(
106+
color = Color.Black,
107+
center = Offset(
108+
x = xOffset,
109+
y = closeOffset,
110+
),
111+
radius = closeRadius,
112+
blendMode = BlendMode.Clear,
113+
)
114+
}
115+
}
79116
)
80117
Text(
81118
modifier = Modifier.clipToBounds(),
82119
text = matrixUser.getBestName(),
83120
overflow = TextOverflow.Ellipsis,
84121
maxLines = 2,
85-
style = ElementTheme.typography.fontBodyMdRegular,
122+
style = MaterialTheme.typography.bodyMedium,
123+
color = ElementTheme.colors.textSecondary,
86124
textAlign = TextAlign.Center,
87125
)
88126
}
89127
if (canRemove) {
90128
Surface(
91-
color = ElementTheme.colors.textPrimary,
129+
color = ElementTheme.colors.bgActionPrimaryRest,
92130
modifier = Modifier
93131
.clip(CircleShape)
94132
.size(20.dp)
@@ -121,6 +159,20 @@ internal fun SelectedUserPreview() = ElementPreview {
121159
)
122160
}
123161

162+
@PreviewsDayNight
163+
@Composable
164+
internal fun SelectedUserRtlPreview() = CompositionLocalProvider(
165+
LocalLayoutDirection provides LayoutDirection.Rtl,
166+
) {
167+
ElementPreview {
168+
SelectedUser(
169+
aMatrixUser(displayName = "John Doe"),
170+
canRemove = true,
171+
onUserRemove = {},
172+
)
173+
}
174+
}
175+
124176
@PreviewsDayNight
125177
@Composable
126178
internal fun SelectedUserCannotRemovePreview() = ElementPreview {

0 commit comments

Comments
 (0)