Rework AvatarSize.
Remove default value for AvatarSize, it has to be explicitely provided.
This commit is contained in:
parent
82e566175a
commit
d6f2d7a5d3
32 changed files with 106 additions and 60 deletions
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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 ->
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"),
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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")
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
) {
|
) {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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),
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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(),
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue