Skip to content

Commit 8914c5a

Browse files
authored
Merge pull request #4014 from element-hq/feature/bma/knockAvatars
UI: knock avatars
2 parents 7c9fc75 + 177b57f commit 8914c5a

18 files changed

+78
-46
lines changed

features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerStateProvider.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,13 @@ class KnockRequestsBannerStateProvider : PreviewParameterProvider<KnockRequestsB
4949
aKnockRequestsBannerState(
5050
acceptAction = AsyncAction.Failure(Throwable("Failed to accept knock"))
5151
),
52+
aKnockRequestsBannerState(
53+
knockRequests = listOf(
54+
aKnockRequest(
55+
displayName = "A_very_long_display_name_so_that_the_text_can_be_displayed_on_multiple_lines"
56+
)
57+
)
58+
),
5259
)
5360
}
5461

features/knockrequests/impl/src/main/kotlin/io/element/android/features/knockrequests/impl/banner/KnockRequestsBannerView.kt

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ package io.element.android.features.knockrequests.impl.banner
1010
import androidx.compose.animation.AnimatedVisibility
1111
import androidx.compose.animation.expandVertically
1212
import androidx.compose.animation.shrinkVertically
13-
import androidx.compose.foundation.background
1413
import androidx.compose.foundation.clickable
1514
import androidx.compose.foundation.layout.Arrangement
1615
import androidx.compose.foundation.layout.Box
@@ -22,18 +21,20 @@ import androidx.compose.foundation.layout.height
2221
import androidx.compose.foundation.layout.padding
2322
import androidx.compose.foundation.layout.size
2423
import androidx.compose.foundation.layout.width
25-
import androidx.compose.foundation.shape.CircleShape
2624
import androidx.compose.material3.MaterialTheme
2725
import androidx.compose.runtime.Composable
28-
import androidx.compose.ui.Alignment
2926
import androidx.compose.ui.Modifier
30-
import androidx.compose.ui.draw.clip
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
3133
import androidx.compose.ui.res.stringResource
3234
import androidx.compose.ui.text.style.TextAlign
3335
import androidx.compose.ui.text.style.TextOverflow
3436
import androidx.compose.ui.tooling.preview.PreviewParameter
3537
import androidx.compose.ui.unit.dp
36-
import androidx.compose.ui.zIndex
3738
import io.element.android.compound.theme.ElementTheme
3839
import io.element.android.compound.tokens.generated.CompoundIcons
3940
import io.element.android.features.knockrequests.impl.KnockRequest
@@ -100,7 +101,10 @@ private fun KnockRequestsBannerContent(
100101
.padding(all = 16.dp)
101102
) {
102103
Row {
103-
KnockRequestAvatarView(state.knockRequests)
104+
KnockRequestAvatarView(
105+
state.knockRequests,
106+
modifier = Modifier.padding(top = 2.dp),
107+
)
104108
Spacer(modifier = Modifier.width(10.dp))
105109
Column(modifier = Modifier.weight(1f)) {
106110
Text(
@@ -183,23 +187,38 @@ private fun KnockRequestAvatarListView(
183187
modifier: Modifier = Modifier,
184188
) {
185189
val avatarSize = AvatarSize.KnockRequestBanner.dp
186-
Row(
190+
Box(
187191
modifier = modifier,
188-
horizontalArrangement = Arrangement.spacedBy(-avatarSize / 2),
189192
) {
190193
knockRequests
191194
.take(MAX_AVATAR_COUNT)
192-
.forEachIndexed { index, knockRequest ->
193-
Box(
194-
contentAlignment = Alignment.Center,
195-
modifier = Modifier
196-
.size(size = avatarSize)
197-
.clip(CircleShape)
198-
.background(color = ElementTheme.colors.bgCanvasDefaultLevel1)
199-
.zIndex(-index.toFloat()),
200-
) {
195+
.reversed()
196+
.let { smallReversedList ->
197+
val lastItemIndex = smallReversedList.size - 1
198+
smallReversedList.forEachIndexed { index, knockRequest ->
201199
Avatar(
202-
modifier = Modifier.padding(2.dp),
200+
modifier = Modifier
201+
.padding(start = avatarSize / 2 * (lastItemIndex - index))
202+
.graphicsLayer {
203+
compositingStrategy = CompositingStrategy.Offscreen
204+
}
205+
.drawWithContent {
206+
// Draw content and clear the pixels for the avatar on the left.
207+
drawContent()
208+
if (index < lastItemIndex) {
209+
drawCircle(
210+
color = Color.Black,
211+
center = Offset(
212+
x = 0f,
213+
y = size.height / 2,
214+
),
215+
radius = avatarSize.toPx() / 2,
216+
blendMode = BlendMode.Clear,
217+
)
218+
}
219+
}
220+
.size(size = avatarSize)
221+
.padding(2.dp),
203222
avatarData = knockRequest.getAvatarData(AvatarSize.KnockRequestBanner),
204223
)
205224
}
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 2 additions & 2 deletions
Loading
Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)