Rework AvatarSize.

Remove default value for AvatarSize, it has to be explicitely provided.
This commit is contained in:
Benoit Marty 2023-06-21 16:01:42 +02:00 committed by Benoit Marty
parent 82e566175a
commit d6f2d7a5d3
32 changed files with 106 additions and 60 deletions

View file

@ -40,7 +40,7 @@ fun SearchMultipleUsersResultItem(
CheckableUnresolvedUserRow( CheckableUnresolvedUserRow(
checked = isUserSelected, checked = isUserSelected,
modifier = modifier, modifier = modifier,
avatarData = searchResult.matrixUser.getAvatarData(AvatarSize.Custom(36.dp)), avatarData = searchResult.matrixUser.getAvatarData(AvatarSize.UserListItem),
id = searchResult.matrixUser.userId.value, id = searchResult.matrixUser.userId.value,
onCheckedChange = onCheckedChange, onCheckedChange = onCheckedChange,
) )
@ -49,7 +49,7 @@ fun SearchMultipleUsersResultItem(
checked = isUserSelected, checked = isUserSelected,
modifier = modifier, modifier = modifier,
matrixUser = searchResult.matrixUser, matrixUser = searchResult.matrixUser,
avatarSize = AvatarSize.Custom(36.dp), avatarSize = AvatarSize.UserListItem,
onCheckedChange = onCheckedChange, onCheckedChange = onCheckedChange,
) )
} }

View file

@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.ElementThemedPreview
import io.element.android.libraries.matrix.ui.components.MatrixUserRow import io.element.android.libraries.matrix.ui.components.MatrixUserRow
@ -39,21 +38,21 @@ fun SearchSingleUserResultItem(
if (searchResult.isUnresolved) { if (searchResult.isUnresolved) {
UnresolvedUserRow( UnresolvedUserRow(
modifier = modifier.clickable(onClick = onClick), modifier = modifier.clickable(onClick = onClick),
avatarData = searchResult.matrixUser.getAvatarData(AvatarSize.Custom(36.dp)), avatarData = searchResult.matrixUser.getAvatarData(AvatarSize.UserListItem),
id = searchResult.matrixUser.userId.value, id = searchResult.matrixUser.userId.value,
) )
} else { } else {
MatrixUserRow( MatrixUserRow(
modifier = modifier.clickable(onClick = onClick), modifier = modifier.clickable(onClick = onClick),
matrixUser = searchResult.matrixUser, matrixUser = searchResult.matrixUser,
avatarSize = AvatarSize.Custom(36.dp), avatarSize = AvatarSize.UserListItem,
) )
} }
} }
@Preview @Preview
@Composable @Composable
internal fun SearchSingleUserResultItemPreview() = ElementThemedPreview{ ContentToPreview() } internal fun SearchSingleUserResultItemPreview() = ElementThemedPreview { ContentToPreview() }
@Composable @Composable
private fun ContentToPreview() { private fun ContentToPreview() {

View file

@ -33,6 +33,7 @@ import io.element.android.libraries.architecture.Async
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.architecture.runCatchingUpdatingState
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.RoomSummary import io.element.android.libraries.matrix.api.room.RoomSummary
@ -158,12 +159,14 @@ class InviteListPresenter @Inject constructor(
id = i.userId.value, id = i.userId.value,
name = i.displayName, name = i.displayName,
url = i.avatarUrl, url = i.avatarUrl,
size = AvatarSize.RoomListItem,
) )
else else
AvatarData( AvatarData(
id = roomId.value, id = roomId.value,
name = name, name = name,
url = avatarURLString url = avatarURLString,
size = AvatarSize.RoomListItem,
) )
val alias = if (isDirect) val alias = if (isDirect)
@ -186,6 +189,7 @@ class InviteListPresenter @Inject constructor(
id = userId.value, id = userId.value,
name = displayName, name = displayName,
url = avatarUrl, url = avatarUrl,
size = AvatarSize.InviteSender,
), ),
) )
}, },

View file

@ -99,7 +99,7 @@ internal fun DefaultInviteSummaryRow(
verticalAlignment = Alignment.Top verticalAlignment = Alignment.Top
) { ) {
Avatar( Avatar(
invite.roomAvatarData.copy(size = AvatarSize.Custom(52.dp)), invite.roomAvatarData.copy(size = AvatarSize.RoomListItem),
) )
Column( Column(
@ -178,7 +178,7 @@ private fun SenderRow(sender: InviteSender) {
modifier = Modifier.padding(top = 6.dp), modifier = Modifier.padding(top = 6.dp),
) { ) {
Avatar( Avatar(
avatarData = sender.avatarData.copy(size = AvatarSize.Custom(16.dp)), avatarData = sender.avatarData.copy(size = AvatarSize.InviteSender),
) )
Text( Text(
text = stringResource(R.string.screen_invites_invited_you, sender.displayName, sender.userId.value).let { text -> text = stringResource(R.string.screen_invites_invited_you, sender.displayName, sender.userId.value).let { text ->

View file

@ -18,6 +18,7 @@ package io.element.android.features.invitelist.impl.model
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
@ -26,14 +27,14 @@ data class InviteListInviteSummary(
val roomId: RoomId, val roomId: RoomId,
val roomName: String = "", val roomName: String = "",
val roomAlias: String? = null, val roomAlias: String? = null,
val roomAvatarData: AvatarData = AvatarData(roomId.value, roomName), val roomAvatarData: AvatarData = AvatarData(roomId.value, roomName, size = AvatarSize.RoomListItem),
val sender: InviteSender? = null, val sender: InviteSender? = null,
val isDirect: Boolean = false, val isDirect: Boolean = false,
val isNew: Boolean = false, val isNew: Boolean = false,
) )
data class InviteSender( data class InviteSender constructor(
val userId: UserId, val userId: UserId,
val displayName: String, val displayName: String,
val avatarData: AvatarData = AvatarData(userId.value, displayName), val avatarData: AvatarData = AvatarData(userId.value, displayName, size = AvatarSize.InviteSender),
) )

View file

@ -118,7 +118,7 @@ class MessagesPresenter @AssistedInject constructor(
id = room.roomId.value, id = room.roomId.value,
name = room.name, name = room.name,
url = room.avatarUrl, url = room.avatarUrl,
size = AvatarSize.SMALL size = AvatarSize.TimelineRoom
) )
roomName.value = room.name roomName.value = room.name
} }

View file

@ -26,6 +26,7 @@ import io.element.android.features.messages.impl.timeline.components.retrysendme
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent
import io.element.android.libraries.core.data.StableCharSequence import io.element.android.libraries.core.data.StableCharSequence
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.textcomposer.MessageComposerMode import io.element.android.libraries.textcomposer.MessageComposerMode
@ -42,7 +43,7 @@ open class MessagesStateProvider : PreviewParameterProvider<MessagesState> {
fun aMessagesState() = MessagesState( fun aMessagesState() = MessagesState(
roomId = RoomId("!id:domain"), roomId = RoomId("!id:domain"),
roomName = "Room name", roomName = "Room name",
roomAvatar = AvatarData("!id:domain", "Room name"), roomAvatar = AvatarData("!id:domain", "Room name", size = AvatarSize.TimelineRoom),
userHasPermissionToSendMessage = true, userHasPermissionToSendMessage = true,
composerState = aMessageComposerState().copy( composerState = aMessageComposerState().copy(
text = StableCharSequence("Hello"), text = StableCharSequence("Hello"),

View file

@ -214,7 +214,7 @@ private fun SheetContent(
@Composable @Composable
private fun MessageSummary(event: TimelineItem.Event, modifier: Modifier = Modifier) { private fun MessageSummary(event: TimelineItem.Event, modifier: Modifier = Modifier) {
val content: @Composable () -> Unit val content: @Composable () -> Unit
var icon: @Composable () -> Unit = { Avatar(avatarData = event.senderAvatar.copy(size = AvatarSize.SMALL)) } var icon: @Composable () -> Unit = { Avatar(avatarData = event.senderAvatar.copy(size = AvatarSize.TimelineSender)) }
val contentStyle = ElementTextStyles.Regular.bodyMD.copy(color = MaterialTheme.colorScheme.secondary) val contentStyle = ElementTextStyles.Regular.bodyMD.copy(color = MaterialTheme.colorScheme.secondary)
val imageModifier = Modifier val imageModifier = Modifier
.size(36.dp) .size(36.dp)

View file

@ -24,6 +24,7 @@ import io.element.android.features.messages.impl.timeline.model.event.TimelineIt
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemStateEventContent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemStateEventContent
import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.EventId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
@ -107,7 +108,7 @@ internal fun aTimelineItemEvent(
eventId = eventId, eventId = eventId,
transactionId = transactionId, transactionId = transactionId,
senderId = UserId("@senderId:domain"), senderId = UserId("@senderId:domain"),
senderAvatar = AvatarData("@senderId:domain", "sender"), senderAvatar = AvatarData("@senderId:domain", "sender", size = AvatarSize.TimelineSender),
content = content, content = content,
reactionsState = TimelineItemReactions( reactionsState = TimelineItemReactions(
persistentListOf( persistentListOf(

View file

@ -67,7 +67,7 @@ class TimelineItemEventFactory @Inject constructor(
id = currentSender.value, id = currentSender.value,
name = senderDisplayName ?: currentSender.value, name = senderDisplayName ?: currentSender.value,
url = senderAvatarUrl, url = senderAvatarUrl,
size = AvatarSize.SMALL size = AvatarSize.TimelineSender
) )
return TimelineItem.Event( return TimelineItem.Event(
id = currentTimelineItem.uniqueId, id = currentTimelineItem.uniqueId,

View file

@ -229,7 +229,7 @@ internal fun RoomHeaderSection(
Column(modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { Column(modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
Box(modifier = Modifier.size(70.dp)) { Box(modifier = Modifier.size(70.dp)) {
Avatar( Avatar(
avatarData = AvatarData(roomId, roomName, avatarUrl, AvatarSize.HUGE), avatarData = AvatarData(roomId, roomName, avatarUrl, AvatarSize.RoomHeader),
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) )
} }

View file

@ -218,7 +218,7 @@ private fun EditableAvatarView(
when (state.roomAvatarUrl?.scheme) { when (state.roomAvatarUrl?.scheme) {
null, "mxc" -> { null, "mxc" -> {
Avatar( Avatar(
avatarData = AvatarData(state.roomId, state.roomName, state.roomAvatarUrl?.toString(), size = AvatarSize.HUGE), avatarData = AvatarData(state.roomId, state.roomName, state.roomAvatarUrl?.toString(), size = AvatarSize.RoomHeader),
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
) )
} }

View file

@ -186,7 +186,7 @@ private fun RoomInviteMembersSearchBar(
if (invitableUser.isUnresolved && !invitableUser.isAlreadyInvited && !invitableUser.isAlreadyJoined) { if (invitableUser.isUnresolved && !invitableUser.isAlreadyInvited && !invitableUser.isAlreadyJoined) {
CheckableUnresolvedUserRow( CheckableUnresolvedUserRow(
checked = invitableUser.isSelected, checked = invitableUser.isSelected,
avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.MEDIUM), avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem),
id = invitableUser.matrixUser.userId.value, id = invitableUser.matrixUser.userId.value,
onCheckedChange = { onUserToggled(invitableUser.matrixUser) }, onCheckedChange = { onUserToggled(invitableUser.matrixUser) },
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
@ -195,7 +195,7 @@ private fun RoomInviteMembersSearchBar(
CheckableUserRow( CheckableUserRow(
checked = invitableUser.isSelected, checked = invitableUser.isSelected,
enabled = !invitableUser.isAlreadyInvited && !invitableUser.isAlreadyJoined, enabled = !invitableUser.isAlreadyInvited && !invitableUser.isAlreadyJoined,
avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.MEDIUM), avatarData = invitableUser.matrixUser.getAvatarData(AvatarSize.UserListItem),
name = invitableUser.matrixUser.getBestName(), name = invitableUser.matrixUser.getBestName(),
subtext = when { subtext = when {
// If they're already invited or joined we show that information // If they're already invited or joined we show that information

View file

@ -191,7 +191,7 @@ private fun RoomMemberListItem(
displayName = roomMember.displayName, displayName = roomMember.displayName,
avatarUrl = roomMember.avatarUrl avatarUrl = roomMember.avatarUrl
), ),
avatarSize = AvatarSize.Custom(36.dp), avatarSize = AvatarSize.UserListItem,
) )
} }

View file

@ -112,7 +112,7 @@ internal fun RoomMemberHeaderSection(
Column(modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { Column(modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) {
Box(modifier = Modifier.size(70.dp)) { Box(modifier = Modifier.size(70.dp)) {
Avatar( Avatar(
avatarData = AvatarData(userId, userName, avatarUrl, AvatarSize.HUGE), avatarData = AvatarData(userId, userName, avatarUrl, AvatarSize.UserHeader),
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) )
} }

View file

@ -37,6 +37,7 @@ import io.element.android.libraries.core.coroutine.parallelMap
import io.element.android.libraries.core.extensions.orEmpty import io.element.android.libraries.core.extensions.orEmpty
import io.element.android.libraries.dateformatter.api.LastMessageTimestampFormatter import io.element.android.libraries.dateformatter.api.LastMessageTimestampFormatter
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.utils.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.SnackbarDispatcher
import io.element.android.libraries.designsystem.utils.collectSnackbarMessageAsState import io.element.android.libraries.designsystem.utils.collectSnackbarMessageAsState
import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter import io.element.android.libraries.eventformatter.api.RoomLastMessageFormatter
@ -190,7 +191,8 @@ class RoomListPresenter @Inject constructor(
val avatarData = AvatarData( val avatarData = AvatarData(
id = roomSummary.identifier(), id = roomSummary.identifier(),
name = roomSummary.details.name, name = roomSummary.details.name,
url = roomSummary.details.avatarURLString url = roomSummary.details.avatarURLString,
size = AvatarSize.RoomListItem,
) )
val roomIdentifier = roomSummary.identifier() val roomIdentifier = roomSummary.identifier()
RoomListRoomSummary( RoomListRoomSummary(

View file

@ -21,6 +21,7 @@ import io.element.android.features.leaveroom.api.LeaveRoomState
import io.element.android.features.roomlist.impl.model.RoomListRoomSummary import io.element.android.features.roomlist.impl.model.RoomListRoomSummary
import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryPlaceholders import io.element.android.features.roomlist.impl.model.RoomListRoomSummaryPlaceholders
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.designsystem.utils.SnackbarMessage import io.element.android.libraries.designsystem.utils.SnackbarMessage
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
@ -68,7 +69,7 @@ internal fun aRoomListRoomSummaryList(): ImmutableList<RoomListRoomSummary> {
hasUnread = true, hasUnread = true,
timestamp = "14:18", timestamp = "14:18",
lastMessage = "A very very very very long message which suites on two lines", lastMessage = "A very very very very long message which suites on two lines",
avatarData = AvatarData("!id", "R"), avatarData = AvatarData("!id", "R", size = AvatarSize.RoomListItem),
id = "!roomId:domain", id = "!roomId:domain",
roomId = RoomId("!roomId:domain") roomId = RoomId("!roomId:domain")
), ),
@ -77,7 +78,7 @@ internal fun aRoomListRoomSummaryList(): ImmutableList<RoomListRoomSummary> {
hasUnread = false, hasUnread = false,
timestamp = "14:16", timestamp = "14:16",
lastMessage = "A short message", lastMessage = "A short message",
avatarData = AvatarData("!id", "Z"), avatarData = AvatarData("!id", "Z", size = AvatarSize.RoomListItem),
id = "!roomId2:domain", id = "!roomId2:domain",
roomId = RoomId("!roomId2:domain") roomId = RoomId("!roomId2:domain")
), ),

View file

@ -126,7 +126,7 @@ private fun DefaultRoomListTopBar(
) { ) {
val avatarData by remember { val avatarData by remember {
derivedStateOf { derivedStateOf {
matrixUser.getAvatarData(size = AvatarSize.Custom(28.dp)) matrixUser.getAvatarData(size = AvatarSize.CurrentUserTopBar)
} }
} }
Avatar(avatarData, contentDescription = stringResource(CommonStrings.common_settings)) Avatar(avatarData, contentDescription = stringResource(CommonStrings.common_settings))

View file

@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.IntrinsicSize import androidx.compose.foundation.layout.IntrinsicSize
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.defaultMinSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.heightIn
@ -107,6 +108,7 @@ internal fun DefaultRoomSummaryRow(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp) .padding(horizontal = 16.dp)
.defaultMinSize(minHeight = 84.dp)
.height(IntrinsicSize.Min), .height(IntrinsicSize.Min),
verticalAlignment = CenterVertically verticalAlignment = CenterVertically
) { ) {

View file

@ -17,18 +17,18 @@
package io.element.android.features.roomlist.impl.model package io.element.android.features.roomlist.impl.model
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import io.element.android.libraries.core.data.tryOrNull
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
@Immutable @Immutable
data class RoomListRoomSummary( data class RoomListRoomSummary constructor(
val id: String, val id: String,
val roomId: RoomId, val roomId: RoomId,
val name: String = "", val name: String = "",
val hasUnread: Boolean = false, val hasUnread: Boolean = false,
val timestamp: String? = null, val timestamp: String? = null,
val lastMessage: CharSequence? = null, val lastMessage: CharSequence? = null,
val avatarData: AvatarData = AvatarData(id, name), val avatarData: AvatarData = AvatarData(id, name, size = AvatarSize.RoomListItem),
val isPlaceholder: Boolean = false, val isPlaceholder: Boolean = false,
) )

View file

@ -17,6 +17,7 @@
package io.element.android.features.roomlist.impl.model package io.element.android.features.roomlist.impl.model
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
object RoomListRoomSummaryPlaceholders { object RoomListRoomSummaryPlaceholders {
@ -29,7 +30,7 @@ object RoomListRoomSummaryPlaceholders {
name = "Short name", name = "Short name",
timestamp = "hh:mm", timestamp = "hh:mm",
lastMessage = "Last message for placeholder", lastMessage = "Last message for placeholder",
avatarData = AvatarData(id, "S") avatarData = AvatarData(id, "S", size = AvatarSize.RoomListItem)
) )
} }

View file

@ -18,6 +18,7 @@ package io.element.android.features.roomlist.impl.model
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.RoomId
open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSummary> { open class RoomListRoomSummaryProvider : PreviewParameterProvider<RoomListRoomSummary> {
@ -39,6 +40,6 @@ fun aRoomListRoomSummary() = RoomListRoomSummary(
hasUnread = false, hasUnread = false,
timestamp = null, timestamp = null,
lastMessage = "Last message", lastMessage = "Last message",
avatarData = AvatarData("!roomId", "Room name"), avatarData = AvatarData("!roomId", "Room name", size = AvatarSize.RoomListItem),
isPlaceholder = false, isPlaceholder = false,
) )

View file

@ -17,7 +17,9 @@
package io.element.android.libraries.designsystem.components.avatar package io.element.android.libraries.designsystem.components.avatar
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -30,6 +32,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import coil.compose.AsyncImage import coil.compose.AsyncImage
import io.element.android.libraries.designsystem.preview.ElementThemedPreview import io.element.android.libraries.designsystem.preview.ElementThemedPreview
@ -109,4 +112,12 @@ private fun InitialsAvatar(
@Preview(group = PreviewGroup.Avatars) @Preview(group = PreviewGroup.Avatars)
@Composable @Composable
fun AvatarPreview(@PreviewParameter(AvatarDataProvider::class) avatarData: AvatarData) = fun AvatarPreview(@PreviewParameter(AvatarDataProvider::class) avatarData: AvatarData) =
ElementThemedPreview { Avatar(avatarData) } ElementThemedPreview {
Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(16.dp)
) {
Avatar(avatarData)
Text(text = avatarData.size.name + " " + avatarData.size.dp)
}
}

View file

@ -23,7 +23,7 @@ data class AvatarData(
val id: String, val id: String,
val name: String?, val name: String?,
val url: String? = null, val url: String? = null,
val size: AvatarSize = AvatarSize.MEDIUM val size: AvatarSize,
) { ) {
val initial by lazy { val initial by lazy {

View file

@ -20,15 +20,28 @@ import androidx.compose.ui.tooling.preview.PreviewParameterProvider
open class AvatarDataProvider : PreviewParameterProvider<AvatarData> { open class AvatarDataProvider : PreviewParameterProvider<AvatarData> {
override val values: Sequence<AvatarData> override val values: Sequence<AvatarData>
get() = sequenceOf( get() {
anAvatarData(), AvatarSize.values()
anAvatarData().copy(name = null), .also { it.sortBy { item -> item.name } }
anAvatarData().copy(url = "aUrl"), .asSequence()
) return AvatarSize.values().asSequence().map {
sequenceOf(
anAvatarData(size = it),
anAvatarData(size = it).copy(name = null),
anAvatarData(size = it).copy(url = "aUrl"),
)
}
.flatten()
}
} }
fun anAvatarData(id: String = "@id_of_alice:server.org", name: String = "Alice") = AvatarData( fun anAvatarData(
// Let's the id not start with a 'a'. // Let's the id not start with a 'a'.
id: String = "@id_of_alice:server.org",
name: String = "Alice",
size: AvatarSize = AvatarSize.RoomListItem,
) = AvatarData(
id = id, id = id,
name = name, name = name,
size = size,
) )

View file

@ -19,13 +19,19 @@ package io.element.android.libraries.designsystem.components.avatar
import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
sealed class AvatarSize(open val dp: Dp) { enum class AvatarSize(val dp: Dp) {
CurrentUserTopBar(28.dp),
object SMALL : AvatarSize(32.dp) RoomHeader(96.dp),
object MEDIUM : AvatarSize(40.dp) RoomListItem(52.dp),
object BIG : AvatarSize(48.dp)
object HUGE : AvatarSize(96.dp)
// FIXME maybe remove this field and switch back to an enum (or remove this class) when design system will be integrated UserHeader(96.dp),
data class Custom(override val dp: Dp) : AvatarSize(dp) UserListItem(36.dp),
SelectedUser(56.dp),
TimelineRoom(32.dp),
TimelineSender(32.dp),
InviteSender(16.dp),
} }

View file

@ -42,7 +42,7 @@ fun CheckableMatrixUserRow(
checked: Boolean, checked: Boolean,
matrixUser: MatrixUser, matrixUser: MatrixUser,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
avatarSize: AvatarSize = AvatarSize.MEDIUM, avatarSize: AvatarSize = AvatarSize.UserListItem,
onCheckedChange: (Boolean) -> Unit = {}, onCheckedChange: (Boolean) -> Unit = {},
enabled: Boolean = true, enabled: Boolean = true,
) = CheckableUserRow( ) = CheckableUserRow(

View file

@ -57,7 +57,7 @@ fun MatrixUserHeader(
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
Avatar( Avatar(
matrixUser.getAvatarData(size = AvatarSize.HUGE), matrixUser.getAvatarData(size = AvatarSize.UserHeader),
) )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
// Name // Name

View file

@ -49,7 +49,7 @@ import io.element.android.libraries.matrix.ui.model.getBestName
fun MatrixUserRow( fun MatrixUserRow(
matrixUser: MatrixUser, matrixUser: MatrixUser,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
avatarSize: AvatarSize = AvatarSize.Custom(36.dp), avatarSize: AvatarSize = AvatarSize.UserListItem,
) = UserRow( ) = UserRow(
avatarData = matrixUser.getAvatarData(avatarSize), avatarData = matrixUser.getAvatarData(avatarSize),
name = matrixUser.getBestName(), name = matrixUser.getBestName(),

View file

@ -55,13 +55,14 @@ fun SelectedUser(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onUserRemoved: (MatrixUser) -> Unit = {}, onUserRemoved: (MatrixUser) -> Unit = {},
) { ) {
Box(modifier = modifier Box(
.width(56.dp) modifier = modifier
.width(AvatarSize.SelectedUser.dp)
) { ) {
Column( Column(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
) { ) {
Avatar(matrixUser.getAvatarData(size = AvatarSize.Custom(56.dp))) Avatar(matrixUser.getAvatarData(size = AvatarSize.SelectedUser))
Text( Text(
text = matrixUser.getBestName(), text = matrixUser.getBestName(),
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,

View file

@ -82,7 +82,9 @@ fun UnresolvedUserRow(
) )
// Warning // Warning
Row(modifier = Modifier.fillMaxWidth().padding(top = 3.dp)) { Row(modifier = Modifier
.fillMaxWidth()
.padding(top = 3.dp)) {
Icon( Icon(
imageVector = Icons.Filled.Error, imageVector = Icons.Filled.Error,
contentDescription = "", contentDescription = "",
@ -141,7 +143,7 @@ fun CheckableUnresolvedUserRow(
internal fun UnresolvedUserRowPreview() = internal fun UnresolvedUserRowPreview() =
ElementThemedPreview { ElementThemedPreview {
val matrixUser = aMatrixUser() val matrixUser = aMatrixUser()
UnresolvedUserRow(matrixUser.getAvatarData(), matrixUser.userId.value) UnresolvedUserRow(matrixUser.getAvatarData(size = AvatarSize.UserListItem), matrixUser.userId.value)
} }
@Preview @Preview
@ -150,9 +152,9 @@ internal fun CheckableUnresolvedUserRowPreview() =
ElementThemedPreview { ElementThemedPreview {
val matrixUser = aMatrixUser() val matrixUser = aMatrixUser()
Column { Column {
CheckableUnresolvedUserRow(false, matrixUser.getAvatarData(AvatarSize.Custom(36.dp)), matrixUser.userId.value) CheckableUnresolvedUserRow(false, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value)
CheckableUnresolvedUserRow(true, matrixUser.getAvatarData(AvatarSize.Custom(36.dp)), matrixUser.userId.value) CheckableUnresolvedUserRow(true, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value)
CheckableUnresolvedUserRow(false, matrixUser.getAvatarData(AvatarSize.Custom(36.dp)), matrixUser.userId.value, enabled = false) CheckableUnresolvedUserRow(false, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value, enabled = false)
CheckableUnresolvedUserRow(true, matrixUser.getAvatarData(AvatarSize.Custom(36.dp)), matrixUser.userId.value, enabled = false) CheckableUnresolvedUserRow(true, matrixUser.getAvatarData(AvatarSize.UserListItem), matrixUser.userId.value, enabled = false)
} }
} }

View file

@ -20,7 +20,7 @@ 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.AvatarSize
import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.api.user.MatrixUser
fun MatrixUser.getAvatarData(size: AvatarSize = AvatarSize.MEDIUM) = AvatarData( fun MatrixUser.getAvatarData(size: AvatarSize) = AvatarData(
id = userId.value, id = userId.value,
name = displayName, name = displayName,
url = avatarUrl, url = avatarUrl,