Room list: always show who's in an active call
Sonar / Sonar Quality Checks (push) Has been cancelled
Code Quality Checks / Search for forbidden patterns (push) Has been cancelled
Code Quality Checks / Search for invalid screenshot files (push) Has been cancelled
Code Quality Checks / Compose tests (push) Has been cancelled
Code Quality Checks / Ktlint checks (push) Has been cancelled
Code Quality Checks / Check shell scripts (push) Has been cancelled
Code Quality Checks / Run zizmor (push) Has been cancelled
Test / Runs unit tests (push) Has been cancelled
Code Quality Checks / Search for invalid dependencies (push) Has been cancelled
Code Quality Checks / Konsist tests (push) Has been cancelled
Code Quality Checks / Android lint check (push) Has been cancelled
Code Quality Checks / Detekt checks (push) Has been cancelled
Code Quality Checks / Doc checks (push) Has been cancelled
Code Quality Checks / Project Check Suite (push) Has been cancelled
Create release App Bundle and APKs / Create App Bundle (Gplay) (push) Has been cancelled
Create release App Bundle and APKs / Create App Bundle Enterprise (push) Has been cancelled
Create release App Bundle and APKs / Create APKs (FDroid) (push) Has been cancelled
Post-release / post-release (push) Has been cancelled

The participants row was gated on the voice-room classification, which only
happens after the room's space was opened once — so live calls showed nobody.
Now any room with active call participants lists them, with initial-letter
avatars instead of plain dots.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-25 23:54:24 -07:00
parent a302dfb1eb
commit cd4b1b7216
2 changed files with 17 additions and 6 deletions
@@ -25,6 +25,10 @@ import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.home.impl.roomlist.BlapSection
import io.element.android.libraries.designsystem.components.avatar.Avatar
import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.components.avatar.AvatarType
import io.element.android.libraries.designsystem.theme.components.Icon
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.matrix.api.core.UserId
@@ -78,18 +82,23 @@ internal fun BlapVoiceMembersRow(
) {
Column(modifier = modifier.padding(start = 64.dp, bottom = 8.dp)) {
participants.take(MAX_VOICE_MEMBERS_SHOWN).forEach { userId ->
val localpart = userId.value.removePrefix("@").substringBefore(":")
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.padding(vertical = 2.dp),
) {
androidx.compose.foundation.layout.Box(
modifier = Modifier
.size(8.dp)
.background(ElementTheme.colors.iconAccentPrimary, CircleShape),
Avatar(
avatarData = AvatarData(
id = userId.value,
name = localpart,
url = null,
size = AvatarSize.TimelineReadReceipt,
),
avatarType = AvatarType.User,
)
Spacer(modifier = Modifier.width(8.dp))
Text(
text = userId.value.removePrefix("@").substringBefore(":"),
text = localpart,
style = ElementTheme.typography.fontBodySmRegular,
color = ElementTheme.colors.textSecondary,
)
@@ -315,7 +315,9 @@ private fun RoomsViewList(
onClick = onRoomClick,
eventSink = eventSink,
)
if (room.roomId in state.blapVoiceRoomIds && room.activeRoomCallParticipants.isNotEmpty()) {
// Any room with an active call shows who's in it — not just classified
// voice rooms (classification lags until the space was opened once).
if (room.activeRoomCallParticipants.isNotEmpty()) {
BlapVoiceMembersRow(participants = room.activeRoomCallParticipants)
}
if (index != entry.rooms.lastIndex) {