From 443076f6362eee3df7f60a0a0f9e205b47ede82b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 13 Feb 2023 10:06:30 +0100 Subject: [PATCH] Give the id to AvatarData to be able to compute initial properly. --- .../features/messages/MessagesPresenter.kt | 3 ++- .../android/features/messages/MessagesView.kt | 23 ++++--------------- .../messages/timeline/TimelineItemsFactory.kt | 3 ++- .../messages/timeline/TimelineView.kt | 4 ++-- .../messages/MessagesPresenterTest.kt | 2 +- .../actionlist/ActionListPresenterTest.kt | 2 +- .../preferences/root/PreferencesRootView.kt | 14 +++++++---- .../features/roomlist/RoomListPresenter.kt | 13 ++++------- .../android/features/roomlist/RoomListView.kt | 2 +- .../roomlist/components/RoomListTopBar.kt | 2 +- .../roomlist/model/RoomListRoomSummary.kt | 2 +- .../model/RoomListRoomSummaryPlaceholders.kt | 2 +- .../features/roomlist/model/stubbed.kt | 4 ++-- .../roomlist/RoomListPresenterTests.kt | 2 +- .../designsystem/components/avatar/Avatar.kt | 13 +++++++---- .../components/avatar/AvatarData.kt | 23 ++++++++++++++++++- .../libraries/matrix/ui/MatrixItemHelper.kt | 3 ++- .../MatrixUserPreviewParameterProvider.kt | 18 ++++++++------- .../libraries/matrix/ui/model/MatrixUser.kt | 2 +- 19 files changed, 76 insertions(+), 61 deletions(-) diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt index 44d6f0b7a1..a173ba4293 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesPresenter.kt @@ -67,7 +67,8 @@ class MessagesPresenter @Inject constructor( LaunchedEffect(syncUpdateFlow) { roomAvatar.value = AvatarData( - name = room.bestName, + id = room.roomId.value, + name = room.name, url = room.avatarUrl, size = AvatarSize.SMALL ) diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesView.kt index 05e788a02b..de3b6739bc 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/MessagesView.kt @@ -21,18 +21,7 @@ package io.element.android.features.messages -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.imePadding -import androidx.compose.foundation.layout.navigationBarsPadding -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.statusBars -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.* import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ModalBottomSheetValue import androidx.compose.material.icons.Icons @@ -68,11 +57,7 @@ import io.element.android.libraries.designsystem.components.avatar.Avatar import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.designsystem.theme.components.Icon -import io.element.android.libraries.designsystem.theme.components.IconButton -import io.element.android.libraries.designsystem.theme.components.Scaffold -import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.designsystem.theme.components.TopAppBar +import io.element.android.libraries.designsystem.theme.components.* import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.matrix.core.RoomId import io.element.android.libraries.textcomposer.MessageComposerMode @@ -223,9 +208,9 @@ fun MessagesViewDarkPreview() = ElementPreviewDark { ContentToPreview() } private fun ContentToPreview() { MessagesView( MessagesState( - roomId = RoomId(""), + roomId = RoomId("!id"), roomName = "Room name", - roomAvatar = AvatarData("Room name"), + roomAvatar = AvatarData("!id", "Room name"), composerState = aMessageComposerState().copy( text = StableCharSequence("Hello"), isFullScreen = false, diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineItemsFactory.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineItemsFactory.kt index ce945f1e88..2b7529031d 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineItemsFactory.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineItemsFactory.kt @@ -156,7 +156,8 @@ class TimelineItemsFactory @Inject constructor( val senderDisplayName = room.userDisplayName(currentSender).getOrNull() val senderAvatarUrl = room.userAvatarUrl(currentSender).getOrNull() val senderAvatarData = AvatarData( - name = senderDisplayName ?: currentSender, + id = currentSender, + name = senderDisplayName, url = senderAvatarUrl, size = AvatarSize.SMALL ) diff --git a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt index c3b9d27b7b..ccfd566703 100644 --- a/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt +++ b/features/messages/src/main/kotlin/io/element/android/features/messages/timeline/TimelineView.kt @@ -418,8 +418,8 @@ internal fun createMessageEvent( ): TimelineItem.MessageEvent { return TimelineItem.MessageEvent( id = EventId(Math.random().toString()), - senderId = "senderId", - senderAvatar = AvatarData("sender"), + senderId = "@senderId", + senderAvatar = AvatarData("@senderId", "sender"), content = content, reactionsState = TimelineItemReactions( persistentListOf( diff --git a/features/messages/src/test/kotlin/io/element/android/features/messages/MessagesPresenterTest.kt b/features/messages/src/test/kotlin/io/element/android/features/messages/MessagesPresenterTest.kt index a16d9f7eb1..f7c675430a 100644 --- a/features/messages/src/test/kotlin/io/element/android/features/messages/MessagesPresenterTest.kt +++ b/features/messages/src/test/kotlin/io/element/android/features/messages/MessagesPresenterTest.kt @@ -170,7 +170,7 @@ private fun aMessageEvent( id = AN_EVENT_ID, senderId = A_USER_ID.value, senderDisplayName = A_USER_NAME, - senderAvatar = AvatarData(), + senderAvatar = AvatarData(A_USER_ID.value, A_USER_NAME), content = content, sentTime = "", isMine = isMine, diff --git a/features/messages/src/test/kotlin/io/element/android/features/messages/actionlist/ActionListPresenterTest.kt b/features/messages/src/test/kotlin/io/element/android/features/messages/actionlist/ActionListPresenterTest.kt index 06d1486293..7da64088f5 100644 --- a/features/messages/src/test/kotlin/io/element/android/features/messages/actionlist/ActionListPresenterTest.kt +++ b/features/messages/src/test/kotlin/io/element/android/features/messages/actionlist/ActionListPresenterTest.kt @@ -168,7 +168,7 @@ private fun aMessageEvent( id = AN_EVENT_ID, senderId = A_USER_ID.value, senderDisplayName = A_USER_NAME, - senderAvatar = AvatarData(), + senderAvatar = AvatarData(A_USER_ID.value, A_USER_NAME), content = content, sentTime = "", isMine = isMine, diff --git a/features/preferences/src/main/kotlin/io/element/android/features/preferences/root/PreferencesRootView.kt b/features/preferences/src/main/kotlin/io/element/android/features/preferences/root/PreferencesRootView.kt index d781d1cec3..29aeccd87f 100644 --- a/features/preferences/src/main/kotlin/io/element/android/features/preferences/root/PreferencesRootView.kt +++ b/features/preferences/src/main/kotlin/io/element/android/features/preferences/root/PreferencesRootView.kt @@ -20,12 +20,16 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.features.logout.LogoutPreferenceView import io.element.android.features.preferences.user.UserPreferences import io.element.android.features.rageshake.preferences.RageshakePreferencesView +import io.element.android.libraries.architecture.Async import io.element.android.libraries.designsystem.components.preferences.PreferenceView import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.matrix.ui.components.MatrixUserPreviewParameterProvider +import io.element.android.libraries.matrix.ui.model.MatrixUser import io.element.android.libraries.ui.strings.R as StringR @Composable @@ -55,13 +59,15 @@ fun PreferencesRootView( @Preview @Composable -fun PreferencesRootViewLightPreview() = ElementPreviewLight { ContentToPreview() } +fun PreferencesRootViewLightPreview(@PreviewParameter(MatrixUserPreviewParameterProvider::class) matrixUser: MatrixUser) = + ElementPreviewLight { ContentToPreview(matrixUser) } @Preview @Composable -fun PreferencesRootViewDarkPreview() = ElementPreviewDark { ContentToPreview() } +fun PreferencesRootViewDarkPreview(@PreviewParameter(MatrixUserPreviewParameterProvider::class) matrixUser: MatrixUser) = + ElementPreviewDark { ContentToPreview(matrixUser) } @Composable -private fun ContentToPreview() { - PreferencesRootView(aPreferencesRootState()) +private fun ContentToPreview(matrixUser: MatrixUser) { + PreferencesRootView(aPreferencesRootState().copy(myUser = Async.Success(matrixUser))) } diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListPresenter.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListPresenter.kt index 26d3bfd4ae..094b592a94 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListPresenter.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListPresenter.kt @@ -16,15 +16,8 @@ package io.element.android.features.roomlist -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue import io.element.android.features.roomlist.model.RoomListEvents import io.element.android.features.roomlist.model.RoomListRoomSummary import io.element.android.features.roomlist.model.RoomListRoomSummaryPlaceholders @@ -107,7 +100,8 @@ class RoomListPresenter @Inject constructor( val userDisplayName = client.loadUserDisplayName().getOrNull() val avatarData = AvatarData( - name = userDisplayName ?: client.userId().value, + id = client.userId().value, + name = userDisplayName, url = userAvatarUrl, size = AvatarSize.SMALL ) @@ -136,6 +130,7 @@ class RoomListPresenter @Inject constructor( is RoomSummary.Empty -> RoomListRoomSummaryPlaceholders.create(roomSummary.identifier) is RoomSummary.Filled -> { val avatarData = AvatarData( + id = roomSummary.identifier(), name = roomSummary.details.name, url = roomSummary.details.avatarURLString ) diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt index d163f60269..e238459a05 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/RoomListView.kt @@ -168,7 +168,7 @@ fun RoomListViewDarkPreview() = ElementPreviewDark { ContentToPreview() } private fun ContentToPreview() { RoomListView( aRoomListState().copy( - matrixUser = MatrixUser(id = UserId("@id"), username = "User#1", avatarData = AvatarData("U")), + matrixUser = MatrixUser(id = UserId("@id"), username = "User#1", avatarData = AvatarData("@id", "U")), roomList = stubbedRoomSummaries(), filter = "filter", ) diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/components/RoomListTopBar.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/components/RoomListTopBar.kt index d742b3e3df..b1f8816e3b 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/components/RoomListTopBar.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/components/RoomListTopBar.kt @@ -239,7 +239,7 @@ fun DefaultRoomListTopBarDarkPreview() = ElementPreviewDark { DefaultRoomListTop @Composable private fun DefaultRoomListTopBarPreview() { DefaultRoomListTopBar( - matrixUser = MatrixUser(UserId("id"), "Alice", AvatarData("Alice")), + matrixUser = MatrixUser(UserId("@id"), "Alice", AvatarData("@id", "Alice")), scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState()), ) } diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/RoomListRoomSummary.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/RoomListRoomSummary.kt index f88b3da31f..5f9e883e5d 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/RoomListRoomSummary.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/RoomListRoomSummary.kt @@ -28,6 +28,6 @@ data class RoomListRoomSummary( val hasUnread: Boolean = false, val timestamp: String? = null, val lastMessage: CharSequence? = null, - val avatarData: AvatarData = AvatarData(), + val avatarData: AvatarData = AvatarData(id, name), val isPlaceholder: Boolean = false, ) diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/RoomListRoomSummaryPlaceholders.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/RoomListRoomSummaryPlaceholders.kt index 5fb3221093..b1f48c8ab2 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/RoomListRoomSummaryPlaceholders.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/RoomListRoomSummaryPlaceholders.kt @@ -27,7 +27,7 @@ object RoomListRoomSummaryPlaceholders { name = "Short name", timestamp = "hh:mm", lastMessage = "Last message for placeholder", - avatarData = AvatarData("S") + avatarData = AvatarData(id, "S") ) } diff --git a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/stubbed.kt b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/stubbed.kt index c122752d4d..dbf05c014a 100644 --- a/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/stubbed.kt +++ b/features/roomlist/src/main/kotlin/io/element/android/features/roomlist/model/stubbed.kt @@ -27,7 +27,7 @@ internal fun stubbedRoomSummaries(): ImmutableList { hasUnread = true, timestamp = "14:18", lastMessage = "A very very very very long message which suites on two lines", - avatarData = AvatarData("R"), + avatarData = AvatarData("!id", "R"), id = "roomId" ), RoomListRoomSummary( @@ -35,7 +35,7 @@ internal fun stubbedRoomSummaries(): ImmutableList { hasUnread = false, timestamp = "14:16", lastMessage = "A short message", - avatarData = AvatarData("Z"), + avatarData = AvatarData("!id", "Z"), id = "roomId2" ), RoomListRoomSummaryPlaceholders.create("roomId2") diff --git a/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt b/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt index 94256c8888..743fd2d888 100644 --- a/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt +++ b/features/roomlist/src/test/kotlin/io/element/android/features/roomlist/RoomListPresenterTests.kt @@ -217,6 +217,6 @@ private val aRoomListRoomSummary = RoomListRoomSummary( hasUnread = true, timestamp = A_FORMATTED_DATE, lastMessage = A_MESSAGE, - avatarData = AvatarData(name = A_ROOM_NAME), + avatarData = AvatarData(id = A_ROOM_ID.value, name = A_ROOM_NAME), isPlaceholder = false, ) diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt index b9a6d19bc8..c1e5fa7e8f 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/Avatar.kt @@ -29,6 +29,7 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.sp import coil.compose.AsyncImage import io.element.android.libraries.designsystem.AvatarGradientEnd @@ -90,7 +91,7 @@ private fun InitialsAvatar( ) { Text( modifier = Modifier.align(Alignment.Center), - text = avatarData.name.first().uppercase(), + text = avatarData.getInitial(), fontSize = (avatarData.size.value / 2).sp, color = Color.White, ) @@ -99,13 +100,15 @@ private fun InitialsAvatar( @Preview @Composable -fun AvatarLightPreview() = ElementPreviewLight { ContentToPreview() } +fun AvatarLightPreview(@PreviewParameter(AvatarDataPreviewParameterProvider::class) avatarData: AvatarData) = + ElementPreviewLight { ContentToPreview(avatarData) } @Preview @Composable -fun AvatarDarkPreview() = ElementPreviewDark { ContentToPreview() } +fun AvatarDarkPreview(@PreviewParameter(AvatarDataPreviewParameterProvider::class) avatarData: AvatarData) = + ElementPreviewDark { ContentToPreview(avatarData) } @Composable -private fun ContentToPreview() { - Avatar(AvatarData(name = "A")) +private fun ContentToPreview(avatarData: AvatarData) { + Avatar(avatarData) } diff --git a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt index 777ea701cc..199e6f575c 100644 --- a/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt +++ b/libraries/designsystem/src/main/kotlin/io/element/android/libraries/designsystem/components/avatar/AvatarData.kt @@ -17,10 +17,31 @@ package io.element.android.libraries.designsystem.components.avatar import androidx.compose.runtime.Immutable +import androidx.compose.ui.tooling.preview.PreviewParameterProvider @Immutable data class AvatarData( - val name: String = "", + val id: String, + val name: String?, val url: String? = null, val size: AvatarSize = AvatarSize.MEDIUM +) { + fun getInitial(): String { + val firstChar = name?.firstOrNull() ?: id.getOrNull(1) ?: '?' + return firstChar.uppercase() + } +} + +open class AvatarDataPreviewParameterProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + anAvatarData(), + anAvatarData().copy(name = null), + ) +} + +fun anAvatarData() = AvatarData( + // Let's the id not start with a 'a'. + id = "@id_of_alice:server.org", + name = "Alice", ) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/MatrixItemHelper.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/MatrixItemHelper.kt index 8f1dcc203a..f60f95cee8 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/MatrixItemHelper.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/MatrixItemHelper.kt @@ -38,7 +38,8 @@ class MatrixItemHelper @Inject constructor( val userDisplayName = client.loadUserDisplayName().getOrNull() val avatarData = AvatarData( - userDisplayName ?: client.userId().value, + client.userId().value, + userDisplayName, userAvatarUrl, avatarSize ) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserPreviewParameterProvider.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserPreviewParameterProvider.kt index ffa73a7a84..c277ca42c2 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserPreviewParameterProvider.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserPreviewParameterProvider.kt @@ -17,22 +17,24 @@ package io.element.android.libraries.matrix.ui.components import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.designsystem.components.avatar.AvatarData +import io.element.android.libraries.designsystem.components.avatar.anAvatarData import io.element.android.libraries.matrix.core.UserId import io.element.android.libraries.matrix.ui.model.MatrixUser open class MatrixUserPreviewParameterProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( + aMatrixUser(), MatrixUser( - id = UserId("@alice:server.org"), - username = "Alice", - avatarData = AvatarData("Alice") - ), - MatrixUser( - id = UserId("@alice:server.org"), + id = UserId("@id_of_alice:server.org"), username = null, - avatarData = AvatarData("Alice") + avatarData = anAvatarData().copy(name = null) ), ) } + +fun aMatrixUser() = MatrixUser( + id = UserId("@id_of_alice:server.org"), + username = "Alice", + avatarData = anAvatarData() +) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUser.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUser.kt index 1fdc63ab3e..b1a58c7920 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUser.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUser.kt @@ -24,7 +24,7 @@ import io.element.android.libraries.matrix.core.UserId data class MatrixUser( val id: UserId, val username: String? = null, - val avatarData: AvatarData = AvatarData(), + val avatarData: AvatarData = AvatarData(id.value, username), ) fun MatrixUser.getBestName(): String {