From 581c5ab2d27965bd4bc149ae85786f19f20d3685 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Wed, 3 May 2023 17:30:19 +0100 Subject: [PATCH] Move and refactor MatrixUser (#381) Move and refactor MatrixUser Instead of living in matrixui and having an AvatarData, this can reside in the matrix module and just have the URL. An extension method in matrixui can then provide the AvatarData when required. This removes some small duplication, and pushes the UI-specific information (i.e., what size of avatar is going to be rendered) further down the stack. It also aligns the field names with those used by the rust SDK (e.g. "displayName" instead of "userName"). --- .../impl/AllMatrixUsersDataSource.kt | 16 +----- .../createroom/impl/CreateRoomConfig.kt | 2 +- .../impl/configureroom/ConfigureRoomEvents.kt | 2 +- .../configureroom/ConfigureRoomPresenter.kt | 2 +- .../ConfigureRoomPresenterArgs.kt | 2 +- .../impl/root/CreateRoomRootEvents.kt | 2 +- .../impl/root/CreateRoomRootPresenter.kt | 6 +-- .../impl/root/CreateRoomRootStateProvider.kt | 4 +- .../impl/AllMatrixUsersDataSourceTest.kt | 22 ++++---- .../impl/root/CreateRoomRootPresenterTests.kt | 2 +- .../impl/root/PreferencesRootState.kt | 2 +- .../impl/root/PreferencesRootView.kt | 2 +- .../preferences/impl/user/UserPreferences.kt | 2 +- .../impl/members/RoomMemberListEvents.kt | 2 +- .../impl/members/RoomMemberListPresenter.kt | 2 +- .../impl/members/RoomMemberListState.kt | 3 +- .../members/RoomMemberListStateProvider.kt | 2 +- .../impl/members/RoomMemberListView.kt | 4 +- .../impl/members/RoomUserListDataSource.kt | 17 ++---- .../roomlist/impl/RoomListPresenter.kt | 20 +++---- .../features/roomlist/impl/RoomListState.kt | 2 +- .../roomlist/impl/RoomListStateProvider.kt | 4 +- .../impl/components/RoomListTopBar.kt | 12 +++-- .../roomlist/impl/RoomListPresenterTests.kt | 9 ++-- .../userlist/api/UserListDataSource.kt | 2 +- .../userlist/api/UserListDataStore.kt | 2 +- .../features/userlist/api/UserListEvents.kt | 2 +- .../features/userlist/api/UserListState.kt | 2 +- .../SearchMultipleUsersResultItem.kt | 2 +- .../components/SearchSingleUserResultItem.kt | 2 +- .../userlist/api/components/SearchUserBar.kt | 4 +- .../userlist/api/components/SelectedUser.kt | 5 +- .../api/components/SelectedUsersList.kt | 2 +- .../userlist/api/components/UserListView.kt | 2 +- .../userlist/impl/DefaultUserListPresenter.kt | 4 +- .../impl/DefaultUserListPresenterTests.kt | 2 +- .../userlist/test/FakeUserListDataSource.kt | 2 +- .../components/avatar/AvatarData.kt | 8 +-- .../libraries/matrix/api/MatrixClient.kt | 2 +- .../libraries/matrix/api/room/RoomMember.kt | 7 +++ .../MatrixSearchUserResults.kt | 4 +- .../MatrixUser.kt} | 13 +++-- .../libraries/matrix/impl/RustMatrixClient.kt | 2 +- .../impl/usersearch/UserSearchResultMapper.kt | 8 +-- .../libraries/matrix/test/FakeMatrixClient.kt | 2 +- .../libraries/matrix/ui/MatrixItemHelper.kt | 53 ------------------- .../ui/components/CheckableMatrixUserRow.kt | 4 +- .../matrix/ui/components/MatrixUserHeader.kt | 9 ++-- .../ui/components/MatrixUserProvider.kt | 20 +++---- .../matrix/ui/components/MatrixUserRow.kt | 11 ++-- ...{MatrixUser.kt => MatrixUserExtensions.kt} | 21 ++++---- 51 files changed, 125 insertions(+), 215 deletions(-) rename libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/{usersearch => user}/MatrixSearchUserResults.kt (86%) rename libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/{usersearch/MatrixUserProfile.kt => user/MatrixUser.kt} (74%) delete mode 100644 libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/MatrixItemHelper.kt rename libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/{MatrixUser.kt => MatrixUserExtensions.kt} (65%) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/AllMatrixUsersDataSource.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/AllMatrixUsersDataSource.kt index 4ca985134e..e021d17144 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/AllMatrixUsersDataSource.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/AllMatrixUsersDataSource.kt @@ -17,11 +17,9 @@ package io.element.android.features.createroom.impl import io.element.android.features.userlist.api.UserListDataSource -import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.api.usersearch.MatrixUserProfile -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import javax.inject.Inject class AllMatrixUsersDataSource @Inject constructor( @@ -29,7 +27,7 @@ class AllMatrixUsersDataSource @Inject constructor( ) : UserListDataSource { override suspend fun search(query: String): List { val res = client.searchUsers(query, MAX_SEARCH_RESULTS) - return res.getOrNull()?.results?.map(::toMatrixUser).orEmpty() + return res.getOrNull()?.results.orEmpty() } override suspend fun getProfile(userId: UserId): MatrixUser? { @@ -37,16 +35,6 @@ class AllMatrixUsersDataSource @Inject constructor( return null } - private fun toMatrixUser(matrixUserProfile: MatrixUserProfile) = MatrixUser( - id = matrixUserProfile.userId, - username = matrixUserProfile.displayName, - avatarData = AvatarData( - id = matrixUserProfile.userId.value, - name = matrixUserProfile.displayName, - url = matrixUserProfile.avatarUrl, - ) - ) - companion object { private const val MAX_SEARCH_RESULTS = 5L } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomConfig.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomConfig.kt index 0aedf12d0f..21662fdb64 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomConfig.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/CreateRoomConfig.kt @@ -17,7 +17,7 @@ package io.element.android.features.createroom.impl import io.element.android.features.createroom.impl.configureroom.RoomPrivacy -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt index c444e83c16..f2c454656c 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomEvents.kt @@ -18,7 +18,7 @@ package io.element.android.features.createroom.impl.configureroom import android.net.Uri import io.element.android.features.createroom.impl.CreateRoomConfig -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser sealed interface ConfigureRoomEvents { data class RoomNameChanged(val name: String) : ConfigureRoomEvents diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt index 99d093a4ee..fa61c7f643 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt @@ -89,7 +89,7 @@ class ConfigureRoomPresenter @Inject constructor( isDirect = false, visibility = if (config.privacy == RoomPrivacy.Public) RoomVisibility.PUBLIC else RoomVisibility.PRIVATE, preset = if (config.privacy == RoomPrivacy.Public) RoomPreset.PUBLIC_CHAT else RoomPreset.PRIVATE_CHAT, - invite = config.invites.map { it.id }, + invite = config.invites.map { it.userId }, avatar = config.avatarUrl, ) matrixClient.createRoom(params).getOrThrow() diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterArgs.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterArgs.kt index 8969a2a5fa..5e52668a3d 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterArgs.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenterArgs.kt @@ -16,7 +16,7 @@ package io.element.android.features.createroom.impl.configureroom -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser data class ConfigureRoomPresenterArgs( val selectedUsers: List, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt index 87f35e4b1b..33691009ed 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootEvents.kt @@ -16,7 +16,7 @@ package io.element.android.features.createroom.impl.root -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser sealed interface CreateRoomRootEvents { object InvitePeople : CreateRoomRootEvents diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt index 363dc23363..c7f3a11e5f 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt @@ -31,7 +31,7 @@ import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.execute import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch import javax.inject.Inject @@ -65,7 +65,7 @@ class CreateRoomRootPresenter @Inject constructor( fun startDm(matrixUser: MatrixUser) { startDmAction.value = Async.Uninitialized - val existingDM = matrixClient.findDM(matrixUser.id) + val existingDM = matrixClient.findDM(matrixUser.userId) if (existingDM == null) { localCoroutineScope.createDM(matrixUser, startDmAction) } else { @@ -90,7 +90,7 @@ class CreateRoomRootPresenter @Inject constructor( private fun CoroutineScope.createDM(user: MatrixUser, startDmAction: MutableState>) = launch { suspend { - matrixClient.createDM(user.id).getOrThrow() + matrixClient.createDM(user.userId).getOrThrow() }.execute(startDmAction) } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt index 1836495ecf..ccfad47a86 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootStateProvider.kt @@ -31,7 +31,7 @@ open class CreateRoomRootStateProvider : PreviewParameterProvider) = launch { val userAvatarUrl = client.loadUserAvatarURLString().getOrNull() val userDisplayName = client.loadUserDisplayName().getOrNull() - val avatarData = - AvatarData( - id = client.sessionId.value, - name = userDisplayName, - url = userAvatarUrl, - size = AvatarSize.SMALL - ) matrixUser.value = MatrixUser( - id = UserId(client.sessionId.value), - username = userDisplayName ?: client.sessionId.value, - avatarData = avatarData, + userId = UserId(client.sessionId.value), + displayName = userDisplayName, + avatarUrl = userAvatarUrl, ) } diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt index 6fd629d67f..0afc88a8e2 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListState.kt @@ -19,7 +19,7 @@ package io.element.android.features.roomlist.impl import androidx.compose.runtime.Immutable import io.element.android.features.roomlist.impl.model.RoomListRoomSummary import io.element.android.libraries.designsystem.utils.SnackbarMessage -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList @Immutable diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt index a95456b6a4..154dd37a9c 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListStateProvider.kt @@ -23,7 +23,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarData 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.UserId -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import io.element.android.libraries.ui.strings.R as StringR @@ -42,7 +42,7 @@ open class RoomListStateProvider : PreviewParameterProvider { } internal fun aRoomListState() = RoomListState( - matrixUser = MatrixUser(id = UserId("@id:domain"), username = "User#1", avatarData = AvatarData("@id:domain", "U")), + matrixUser = MatrixUser(userId = UserId("@id:domain"), displayName = "User#1"), roomList = aRoomListRoomSummaryList(), filter = "filter", filteredRoomList = aRoomListRoomSummaryList(), diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt index 11f0616e07..32bf30b082 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/components/RoomListTopBar.kt @@ -27,6 +27,9 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.rememberTopAppBarState import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.stringResource @@ -35,7 +38,6 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import io.element.android.features.roomlist.impl.R 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 @@ -44,7 +46,8 @@ import io.element.android.libraries.designsystem.theme.components.MediumTopAppBa import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.utils.LogCompositions import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.testtags.TestTags import io.element.android.libraries.testtags.testTag import io.element.android.libraries.ui.strings.R as StringR @@ -107,7 +110,8 @@ private fun DefaultRoomListTopBar( modifier = Modifier.testTag(TestTags.homeScreenSettings), onClick = onOpenSettings ) { - Avatar(matrixUser.avatarData, contentDescription = stringResource(StringR.string.common_settings)) + val avatarData by remember { derivedStateOf { matrixUser.getAvatarData() } } + Avatar(avatarData, contentDescription = stringResource(StringR.string.common_settings)) } } }, @@ -135,7 +139,7 @@ internal fun DefaultRoomListTopBarDarkPreview() = ElementPreviewDark { DefaultRo @Composable private fun DefaultRoomListTopBarPreview() { DefaultRoomListTopBar( - matrixUser = MatrixUser(UserId("@id:domain"), "Alice", AvatarData("@id:domain", "Alice")), + matrixUser = MatrixUser(UserId("@id:domain"), "Alice"), scrollBehavior = TopAppBarDefaults.exitUntilCollapsedScrollBehavior(rememberTopAppBarState()), ) } diff --git a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt index 5dd73980f8..7f7743aae9 100644 --- a/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt +++ b/features/roomlist/impl/src/test/kotlin/io/element/android/features/roomlist/impl/RoomListPresenterTests.kt @@ -60,10 +60,9 @@ class RoomListPresenterTests { Truth.assertThat(initialState.matrixUser).isNull() val withUserState = awaitItem() Truth.assertThat(withUserState.matrixUser).isNotNull() - Truth.assertThat(withUserState.matrixUser!!.id).isEqualTo(A_USER_ID) - Truth.assertThat(withUserState.matrixUser!!.username).isEqualTo(A_USER_NAME) - Truth.assertThat(withUserState.matrixUser!!.avatarData.name).isEqualTo(A_USER_NAME) - Truth.assertThat(withUserState.matrixUser!!.avatarData.url).isEqualTo(AN_AVATAR_URL) + Truth.assertThat(withUserState.matrixUser!!.userId).isEqualTo(A_USER_ID) + Truth.assertThat(withUserState.matrixUser!!.displayName).isEqualTo(A_USER_NAME) + Truth.assertThat(withUserState.matrixUser!!.avatarUrl).isEqualTo(AN_AVATAR_URL) } } @@ -88,8 +87,6 @@ class RoomListPresenterTests { Truth.assertThat(initialState.matrixUser).isNull() val withUserState = awaitItem() Truth.assertThat(withUserState.matrixUser).isNotNull() - // username fallback to user id value - Truth.assertThat(withUserState.matrixUser!!.username).isEqualTo(A_USER_ID.value) } } diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListDataSource.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListDataSource.kt index 2cfd23eb61..0f579b48b7 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListDataSource.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListDataSource.kt @@ -17,7 +17,7 @@ package io.element.android.features.userlist.api import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser interface UserListDataSource { //TODO should probably have a flow diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListDataStore.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListDataStore.kt index f9c73950f1..31750e5350 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListDataStore.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListDataStore.kt @@ -16,7 +16,7 @@ package io.element.android.features.userlist.api -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import javax.inject.Inject diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListEvents.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListEvents.kt index f648a14d74..fe0d681fe1 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListEvents.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListEvents.kt @@ -16,7 +16,7 @@ package io.element.android.features.userlist.api -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser sealed interface UserListEvents { data class UpdateSearchQuery(val query: String) : UserListEvents diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListState.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListState.kt index 4904a6ceab..490a1fdde3 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListState.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/UserListState.kt @@ -16,7 +16,7 @@ package io.element.android.features.userlist.api -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList data class UserListState( diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchMultipleUsersResultItem.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchMultipleUsersResultItem.kt index 7267af1f9b..f153d3671a 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchMultipleUsersResultItem.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchMultipleUsersResultItem.kt @@ -24,9 +24,9 @@ import androidx.compose.ui.unit.dp import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.CheckableMatrixUserRow import io.element.android.libraries.matrix.ui.components.aMatrixUser -import io.element.android.libraries.matrix.ui.model.MatrixUser @Composable fun SearchMultipleUsersResultItem( diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchSingleUserResultItem.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchSingleUserResultItem.kt index 67af583473..5f42438868 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchSingleUserResultItem.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchSingleUserResultItem.kt @@ -24,9 +24,9 @@ import androidx.compose.ui.unit.dp import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight +import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.MatrixUserRow import io.element.android.libraries.matrix.ui.components.aMatrixUser -import io.element.android.libraries.matrix.ui.model.MatrixUser @Composable fun SearchSingleUserResultItem( diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchUserBar.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchUserBar.kt index c5f6afd2e5..1e82936c92 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchUserBar.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SearchUserBar.kt @@ -43,7 +43,7 @@ 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.SearchBar import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.ui.strings.R import kotlinx.collections.immutable.ImmutableList @@ -128,7 +128,7 @@ fun SearchUserBar( SearchMultipleUsersResultItem( modifier = Modifier.fillMaxWidth(), matrixUser = matrixUser, - isUserSelected = selectedUsers.find { it.id == matrixUser.id } != null, + isUserSelected = selectedUsers.find { it.userId == matrixUser.userId } != null, onCheckedChange = { checked -> if (checked) { onUserSelected(matrixUser) diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SelectedUser.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SelectedUser.kt index 666a0c5265..d43281bbb1 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SelectedUser.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SelectedUser.kt @@ -40,8 +40,9 @@ 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.Text +import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.aMatrixUser -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getBestName import io.element.android.libraries.ui.strings.R @@ -55,7 +56,7 @@ fun SelectedUser( Column( horizontalAlignment = Alignment.CenterHorizontally, ) { - Avatar(matrixUser.avatarData.copy(size = AvatarSize.Custom(56.dp))) + Avatar(matrixUser.getAvatarData(size = AvatarSize.Custom(56.dp))) Text( text = matrixUser.getBestName(), overflow = TextOverflow.Ellipsis, diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SelectedUsersList.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SelectedUsersList.kt index 6909345a51..c9279a3389 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SelectedUsersList.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/SelectedUsersList.kt @@ -33,7 +33,7 @@ import androidx.compose.ui.unit.dp import io.element.android.features.userlist.api.aListOfSelectedUsers import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.ImmutableList @Composable diff --git a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/UserListView.kt b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/UserListView.kt index 7bfca1c216..afff072d9f 100644 --- a/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/UserListView.kt +++ b/features/userlist/api/src/main/kotlin/io/element/android/features/userlist/api/components/UserListView.kt @@ -29,7 +29,7 @@ import io.element.android.features.userlist.api.UserListState import io.element.android.features.userlist.api.UserListStateProvider import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser @Composable fun UserListView( diff --git a/features/userlist/impl/src/main/kotlin/io/element/android/features/userlist/impl/DefaultUserListPresenter.kt b/features/userlist/impl/src/main/kotlin/io/element/android/features/userlist/impl/DefaultUserListPresenter.kt index 8b1f08b763..24ee9d4e26 100644 --- a/features/userlist/impl/src/main/kotlin/io/element/android/features/userlist/impl/DefaultUserListPresenter.kt +++ b/features/userlist/impl/src/main/kotlin/io/element/android/features/userlist/impl/DefaultUserListPresenter.kt @@ -38,7 +38,7 @@ import io.element.android.features.userlist.api.UserSearchResultState import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.MatrixPatterns import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.delay @@ -105,7 +105,7 @@ class DefaultUserListPresenter @AssistedInject constructor( private suspend fun performSearch(query: String): UserSearchResultState { val isMatrixId = MatrixPatterns.isUserId(query) val results = userListDataSource.search(query).toMutableList() - if (isMatrixId && results.none { it.id.value == query }) { + if (isMatrixId && results.none { it.userId.value == query }) { val getProfileResult: MatrixUser? = userListDataSource.getProfile(UserId(query)) val profile = getProfileResult ?: MatrixUser(UserId(query)) results.add(0, profile) diff --git a/features/userlist/impl/src/test/kotlin/io/element/android/features/userlist/impl/DefaultUserListPresenterTests.kt b/features/userlist/impl/src/test/kotlin/io/element/android/features/userlist/impl/DefaultUserListPresenterTests.kt index 39ceeba35c..cf9d9da642 100644 --- a/features/userlist/impl/src/test/kotlin/io/element/android/features/userlist/impl/DefaultUserListPresenterTests.kt +++ b/features/userlist/impl/src/test/kotlin/io/element/android/features/userlist/impl/DefaultUserListPresenterTests.kt @@ -28,8 +28,8 @@ import io.element.android.features.userlist.api.UserListPresenterArgs import io.element.android.features.userlist.api.UserSearchResultState import io.element.android.features.userlist.test.FakeUserListDataSource import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.components.aMatrixUser -import io.element.android.libraries.matrix.ui.model.MatrixUser import io.mockk.coJustRun import io.mockk.mockkConstructor import kotlinx.collections.immutable.persistentListOf diff --git a/features/userlist/test/src/main/kotlin/io/element/android/features/userlist/test/FakeUserListDataSource.kt b/features/userlist/test/src/main/kotlin/io/element/android/features/userlist/test/FakeUserListDataSource.kt index ba0ccd2c89..1f656e388f 100644 --- a/features/userlist/test/src/main/kotlin/io/element/android/features/userlist/test/FakeUserListDataSource.kt +++ b/features/userlist/test/src/main/kotlin/io/element/android/features/userlist/test/FakeUserListDataSource.kt @@ -18,7 +18,7 @@ package io.element.android.features.userlist.test import io.element.android.features.userlist.api.UserListDataSource import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser class FakeUserListDataSource : UserListDataSource { 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 2d1e0558f4..7bf4a51ce4 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 @@ -16,22 +16,16 @@ package io.element.android.libraries.designsystem.components.avatar -import android.os.Parcelable import androidx.compose.runtime.Immutable -import kotlinx.parcelize.IgnoredOnParcel -import kotlinx.parcelize.Parcelize @Immutable -@Parcelize data class AvatarData( val id: String, val name: String?, val url: String? = null, - @IgnoredOnParcel val size: AvatarSize = AvatarSize.MEDIUM -) : Parcelable { +) { - @IgnoredOnParcel val initial by lazy { (name?.takeIf { it.isNotBlank() } ?: id) .let { dn -> diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt index c9adb6e50e..92da3ad557 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/MatrixClient.kt @@ -26,7 +26,7 @@ import io.element.android.libraries.matrix.api.pusher.PushersService import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource -import io.element.android.libraries.matrix.api.usersearch.MatrixSearchUserResults +import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults import io.element.android.libraries.matrix.api.verification.SessionVerificationService import java.io.Closeable diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt index 3c9bd030b0..7c977f7569 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/RoomMember.kt @@ -17,6 +17,7 @@ package io.element.android.libraries.matrix.api.room import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.libraries.matrix.api.user.MatrixUser data class RoomMember( val userId: UserId, @@ -29,6 +30,12 @@ data class RoomMember( val isIgnored: Boolean, ) +fun RoomMember.toMatrixUser() = MatrixUser( + userId = userId, + displayName = displayName, + avatarUrl = avatarUrl, +) + enum class RoomMembershipState { BAN, INVITE, JOIN, KNOCK, LEAVE } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/usersearch/MatrixSearchUserResults.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/user/MatrixSearchUserResults.kt similarity index 86% rename from libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/usersearch/MatrixSearchUserResults.kt rename to libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/user/MatrixSearchUserResults.kt index a37e28c197..a63a31b51f 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/usersearch/MatrixSearchUserResults.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/user/MatrixSearchUserResults.kt @@ -14,9 +14,9 @@ * limitations under the License. */ -package io.element.android.libraries.matrix.api.usersearch +package io.element.android.libraries.matrix.api.user data class MatrixSearchUserResults( - val results: List, + val results: List, val limited: Boolean, ) diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/usersearch/MatrixUserProfile.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/user/MatrixUser.kt similarity index 74% rename from libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/usersearch/MatrixUserProfile.kt rename to libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/user/MatrixUser.kt index e9c7330f9b..9880557e33 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/usersearch/MatrixUserProfile.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/user/MatrixUser.kt @@ -14,12 +14,15 @@ * limitations under the License. */ -package io.element.android.libraries.matrix.api.usersearch +package io.element.android.libraries.matrix.api.user +import android.os.Parcelable import io.element.android.libraries.matrix.api.core.UserId +import kotlinx.parcelize.Parcelize -data class MatrixUserProfile( +@Parcelize +data class MatrixUser( val userId: UserId, - val displayName: String?, - val avatarUrl: String? -) + val displayName: String? = null, + val avatarUrl: String? = null +) : Parcelable diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index 6e5b46d447..3e90b55d93 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -29,7 +29,7 @@ import io.element.android.libraries.matrix.api.pusher.PushersService import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource -import io.element.android.libraries.matrix.api.usersearch.MatrixSearchUserResults +import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults import io.element.android.libraries.matrix.api.verification.SessionVerificationService import io.element.android.libraries.matrix.impl.media.RustMediaResolver import io.element.android.libraries.matrix.impl.notification.RustNotificationService diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/usersearch/UserSearchResultMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/usersearch/UserSearchResultMapper.kt index 598e4cb889..c4e18e64fc 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/usersearch/UserSearchResultMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/usersearch/UserSearchResultMapper.kt @@ -17,8 +17,8 @@ package io.element.android.libraries.matrix.impl.usersearch import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.api.usersearch.MatrixSearchUserResults -import io.element.android.libraries.matrix.api.usersearch.MatrixUserProfile +import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults +import io.element.android.libraries.matrix.api.user.MatrixUser import org.matrix.rustcomponents.sdk.SearchUsersResults import org.matrix.rustcomponents.sdk.UserProfile @@ -31,8 +31,8 @@ object UserSearchResultMapper { ) } - private fun mapUserProfile(userProfile: UserProfile): MatrixUserProfile { - return MatrixUserProfile( + private fun mapUserProfile(userProfile: UserProfile): MatrixUser { + return MatrixUser( userId = UserId(userProfile.userId), displayName = userProfile.displayName, avatarUrl = userProfile.avatarUrl, diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt index ca41b9d828..207ddc252c 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/FakeMatrixClient.kt @@ -27,7 +27,7 @@ import io.element.android.libraries.matrix.api.pusher.PushersService import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.RoomMembershipObserver import io.element.android.libraries.matrix.api.room.RoomSummaryDataSource -import io.element.android.libraries.matrix.api.usersearch.MatrixSearchUserResults +import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults import io.element.android.libraries.matrix.api.verification.SessionVerificationService import io.element.android.libraries.matrix.test.media.FakeMediaResolver import io.element.android.libraries.matrix.test.notification.FakeNotificationService 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 deleted file mode 100644 index 6a2d1b2a3c..0000000000 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/MatrixItemHelper.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2022 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.element.android.libraries.matrix.ui - -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.ui.model.MatrixUser -import kotlinx.coroutines.FlowPreview -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.asFlow -import javax.inject.Inject - -class MatrixItemHelper @Inject constructor( - private val client: MatrixClient -) { - /** - * TODO Make username and avatar live... - */ - @OptIn(FlowPreview::class) - fun getCurrentUserData(avatarSize: AvatarSize): Flow { - return suspend { - val userAvatarUrl = client.loadUserAvatarURLString().getOrNull() - val userDisplayName = client.loadUserDisplayName().getOrNull() - val avatarData = - AvatarData( - client.sessionId.value, - userDisplayName, - userAvatarUrl, - avatarSize - ) - MatrixUser( - id = client.sessionId, - username = userDisplayName, - avatarData = avatarData, - ) - }.asFlow() - } -} diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableMatrixUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableMatrixUserRow.kt index e61f02ebf6..14ed5ef134 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableMatrixUserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/CheckableMatrixUserRow.kt @@ -30,14 +30,14 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Checkbox -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser @Composable fun CheckableMatrixUserRow( checked: Boolean, matrixUser: MatrixUser, modifier: Modifier = Modifier, - avatarSize: AvatarSize = matrixUser.avatarData.size, + avatarSize: AvatarSize = AvatarSize.MEDIUM, onCheckedChange: (Boolean) -> Unit = {}, enabled: Boolean = true, ) { diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt index 18b767bce7..1bfa226725 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt @@ -38,7 +38,8 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getBestName @Composable @@ -56,7 +57,7 @@ fun MatrixUserHeader( horizontalAlignment = Alignment.CenterHorizontally ) { Avatar( - matrixUser.avatarData.copy(size = AvatarSize.HUGE), + matrixUser.getAvatarData(size = AvatarSize.HUGE), ) Spacer(modifier = Modifier.height(16.dp)) // Name @@ -69,10 +70,10 @@ fun MatrixUserHeader( color = MaterialTheme.colorScheme.primary, ) // Id - if (matrixUser.username.isNullOrEmpty().not()) { + if (matrixUser.displayName.isNullOrEmpty().not()) { Spacer(modifier = Modifier.height(4.dp)) Text( - text = matrixUser.id.value, + text = matrixUser.userId.value, color = MaterialTheme.colorScheme.secondary, fontSize = 14.sp, maxLines = 1, diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt index e79e78802a..923afd94ad 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserProvider.kt @@ -17,25 +17,20 @@ package io.element.android.libraries.matrix.ui.components import androidx.compose.ui.tooling.preview.PreviewParameterProvider -import io.element.android.libraries.designsystem.components.avatar.anAvatarData import io.element.android.libraries.matrix.api.core.UserId -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser open class MatrixUserProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aMatrixUser(), - aMatrixUser().copy( - username = null, - avatarData = anAvatarData().copy(name = null) - ), + aMatrixUser().copy(displayName = null), ) } -fun aMatrixUser(id: String = "@id_of_alice:server.org", userName: String = "Alice") = MatrixUser( - id = UserId(id), - username = userName, - avatarData = anAvatarData(id, userName) +fun aMatrixUser(id: String = "@id_of_alice:server.org", displayName: String = "Alice") = MatrixUser( + userId = UserId(id), + displayName = displayName, ) fun aMatrixUserList() = listOf( @@ -55,10 +50,7 @@ open class MatrixUserWithNullProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aMatrixUser(), - aMatrixUser().copy( - username = null, - avatarData = anAvatarData().copy(name = null) - ), + aMatrixUser().copy(displayName = null), null, ) } diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt index e4d2386c1c..721682f3a3 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt @@ -37,14 +37,15 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight import io.element.android.libraries.designsystem.theme.components.Text -import io.element.android.libraries.matrix.ui.model.MatrixUser +import io.element.android.libraries.matrix.api.user.MatrixUser +import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getBestName @Composable fun MatrixUserRow( matrixUser: MatrixUser, modifier: Modifier = Modifier, - avatarSize: AvatarSize = matrixUser.avatarData.size, + avatarSize: AvatarSize = AvatarSize.MEDIUM, ) { Row( modifier = modifier @@ -54,7 +55,7 @@ fun MatrixUserRow( verticalAlignment = Alignment.CenterVertically ) { Avatar( - matrixUser.avatarData.copy(size = avatarSize), + matrixUser.getAvatarData(size = avatarSize), ) Column( modifier = Modifier @@ -70,9 +71,9 @@ fun MatrixUserRow( color = MaterialTheme.colorScheme.primary, ) // Id - if (matrixUser.username.isNullOrEmpty().not()) { + if (matrixUser.displayName.isNullOrEmpty().not()) { Text( - text = matrixUser.id.value, + text = matrixUser.userId.value, color = MaterialTheme.colorScheme.secondary, fontSize = 14.sp, maxLines = 1, 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/MatrixUserExtensions.kt similarity index 65% rename from libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUser.kt rename to libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/MatrixUserExtensions.kt index f0ddb30a93..4d834349a1 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/MatrixUserExtensions.kt @@ -16,20 +16,17 @@ package io.element.android.libraries.matrix.ui.model -import android.os.Parcelable -import androidx.compose.runtime.Immutable import io.element.android.libraries.designsystem.components.avatar.AvatarData -import io.element.android.libraries.matrix.api.core.UserId -import kotlinx.parcelize.Parcelize +import io.element.android.libraries.designsystem.components.avatar.AvatarSize +import io.element.android.libraries.matrix.api.user.MatrixUser -@Parcelize -@Immutable -data class MatrixUser( - val id: UserId, - val username: String? = null, - val avatarData: AvatarData = AvatarData(id.value, username), -) : Parcelable +fun MatrixUser.getAvatarData(size: AvatarSize = AvatarSize.MEDIUM) = AvatarData( + id = userId.value, + name = displayName, + url = avatarUrl, + size = size, +) fun MatrixUser.getBestName(): String { - return username?.takeIf { it.isNotEmpty() } ?: id.value + return displayName?.takeIf { it.isNotEmpty() } ?: userId.value }