From 8fc35ef7928327115ed963ba3e69b2413c2f6aa6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 14 Oct 2022 11:25:41 +0200 Subject: [PATCH 1/8] Remove unused param --- .../devices/DeviceListBottomSheetViewModel.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt index 92687e1a37..e6f01ed144 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt @@ -42,7 +42,6 @@ data class DeviceListViewState( val userId: String, val allowDeviceAction: Boolean, val userItem: MatrixItem? = null, - val isMine: Boolean = false, val memberCrossSigningKey: MXCrossSigningInfo? = null, val cryptoDevices: Async> = Loading(), val selectedDevice: CryptoDeviceInfo? = null @@ -70,14 +69,12 @@ class DeviceListBottomSheetViewModel @AssistedInject constructor( userId = userId, allowDeviceAction = args.allowDeviceAction, userItem = it, - isMine = userId == session.myUserId ) } ?: return super.initialState(viewModelContext) } } init { - session.flow().liveUserCryptoDevices(initialState.userId) .execute { copy(cryptoDevices = it).also { From 0a6d620f27d3160d273f6d0a2b5e13936a333d23 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 14 Oct 2022 11:38:24 +0200 Subject: [PATCH 2/8] getUser() can return null more often than before, since the SDK will retrieve data asynchronously. So ensure that the initial state can always be built. --- .../devices/DeviceListBottomSheetViewModel.kt | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt index e6f01ed144..eb23c5654e 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/devices/DeviceListBottomSheetViewModel.kt @@ -29,11 +29,13 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory import im.vector.app.core.di.SingletonEntryPoint import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.platform.VectorViewModel +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.crosssigning.MXCrossSigningInfo import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo import org.matrix.android.sdk.api.session.crypto.verification.VerificationMethod -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.util.MatrixItem import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.flow.flow @@ -60,17 +62,15 @@ class DeviceListBottomSheetViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() { - override fun initialState(viewModelContext: ViewModelContext): DeviceListViewState? { + override fun initialState(viewModelContext: ViewModelContext): DeviceListViewState { val args = viewModelContext.args() val userId = args.userId val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getActiveSession() - return session.getUser(userId)?.toMatrixItem()?.let { - DeviceListViewState( - userId = userId, - allowDeviceAction = args.allowDeviceAction, - userItem = it, - ) - } ?: return super.initialState(viewModelContext) + return DeviceListViewState( + userId = userId, + allowDeviceAction = args.allowDeviceAction, + userItem = session.getUserOrDefault(userId).toMatrixItem(), + ) } } @@ -86,6 +86,16 @@ class DeviceListBottomSheetViewModel @AssistedInject constructor( .execute { copy(memberCrossSigningKey = it.invoke()?.getOrNull()) } + + updateMatrixItem() + } + + private fun updateMatrixItem() { + viewModelScope.launch { + tryOrNull { session.userService().resolveUser(initialState.userId) } + ?.toMatrixItem() + ?.let { setState { copy(userItem = it) } } + } } override fun handle(action: DeviceListAction) { From 5a2d74443d7be8c969639153554af46d324aa73b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 14 Oct 2022 12:07:52 +0200 Subject: [PATCH 3/8] Let GetProfileInfoTask store result into DB, except when we want to do bulk insertion. --- .../session/profile/GetProfileInfoTask.kt | 17 +++++++++++++++-- .../session/sync/handler/UpdateUserWorker.kt | 14 ++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt index 40444edcab..4a20c68caf 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt @@ -17,26 +17,39 @@ package org.matrix.android.sdk.internal.session.profile +import com.zhuinden.monarchy.Monarchy +import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.internal.network.GlobalErrorReceiver import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.session.user.UserEntityFactory import org.matrix.android.sdk.internal.task.Task +import org.matrix.android.sdk.internal.util.awaitTransaction import javax.inject.Inject internal abstract class GetProfileInfoTask : Task { data class Params( - val userId: String + val userId: String, + val storeInDatabase: Boolean = true, ) } internal class DefaultGetProfileInfoTask @Inject constructor( private val profileAPI: ProfileAPI, - private val globalErrorReceiver: GlobalErrorReceiver + private val globalErrorReceiver: GlobalErrorReceiver, + private val monarchy: Monarchy, ) : GetProfileInfoTask() { override suspend fun execute(params: Params): JsonDict { return executeRequest(globalErrorReceiver) { profileAPI.getProfile(params.userId) + }.also { user -> + if (params.storeInDatabase) { + // Insert into DB + monarchy.awaitTransaction { + it.insertOrUpdate(UserEntityFactory.create(User.fromJson(params.userId, user))) + } + } } } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UpdateUserWorker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UpdateUserWorker.kt index 1f840a82d5..1ee2fc4802 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UpdateUserWorker.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/UpdateUserWorker.kt @@ -71,10 +71,16 @@ internal class UpdateUserWorker(context: Context, params: WorkerParameters, sess ?.saveLocally() } - private suspend fun fetchUsers(userIdsToFetch: Collection) = userIdsToFetch.mapNotNull { - tryOrNull { - val profileJson = getProfileInfoTask.execute(GetProfileInfoTask.Params(it)) - User.fromJson(it, profileJson) + private suspend fun fetchUsers(userIdsToFetch: Collection): List { + return userIdsToFetch.mapNotNull { userId -> + tryOrNull { + val profileJson = getProfileInfoTask.execute(GetProfileInfoTask.Params( + userId = userId, + // Bulk insert later, so tell the task not to store the User. + storeInDatabase = false, + )) + User.fromJson(userId, profileJson) + } } } From 032fa37b64486ad4ad2bd8846fbcd811f9e6b61c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 14 Oct 2022 12:13:21 +0200 Subject: [PATCH 4/8] Create UserDataSource.getUserOrDefault(). --- .../matrix/android/sdk/internal/session/user/UserDataSource.kt | 2 ++ .../sdk/internal/session/widgets/helper/WidgetFactory.kt | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserDataSource.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserDataSource.kt index f9feb04e97..98108008fe 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserDataSource.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/UserDataSource.kt @@ -66,6 +66,8 @@ internal class UserDataSource @Inject constructor( } } + fun getUserOrDefault(userId: String): User = getUser(userId) ?: User(userId) + fun getUserLive(userId: String): LiveData> { val liveData = monarchy.findAllMappedWithChanges( { UserEntity.where(it, userId) }, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt index 8bd61a7bdf..8ede63c365 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt @@ -74,7 +74,7 @@ internal class WidgetFactory @Inject constructor( // Ref: https://github.com/matrix-org/matrix-widget-api/blob/master/src/templating/url-template.ts#L29-L33 fun computeURL(widget: Widget, isLightTheme: Boolean): String? { var computedUrl = widget.widgetContent.url ?: return null - val myUser = userDataSource.getUser(userId) ?: User(userId) + val myUser = userDataSource.getUserOrDefault(userId) val keyValue = widget.widgetContent.data.mapKeys { "\$${it.key}" }.toMutableMap() From 7699628959c32b3743ca039f3e5c6f89abffc7f3 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 14 Oct 2022 12:25:55 +0200 Subject: [PATCH 5/8] Fix other potential issue when using Session.getUser() --- .../timeline/helper/LocationPinProvider.kt | 8 +++--- .../app/features/html/PillsPostProcessor.kt | 4 +-- .../location/LocationSharingViewModel.kt | 4 +-- .../map/UserLiveLocationViewStateMapper.kt | 26 +++++++++---------- .../notifications/NotifiableEventResolver.kt | 4 +-- .../NotificationDrawerManager.kt | 8 +++--- .../signout/soft/SoftLogoutViewModel.kt | 6 +++-- .../invite/SpaceInviteBottomSheetViewModel.kt | 6 ++--- .../usercode/UserCodeSharedViewModel.kt | 6 ++--- 9 files changed, 36 insertions(+), 36 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/LocationPinProvider.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/LocationPinProvider.kt index 8ef910c931..7f276f2f73 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/LocationPinProvider.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/LocationPinProvider.kt @@ -29,7 +29,7 @@ import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.core.glide.GlideApp import im.vector.app.core.utils.DimensionConverter import im.vector.app.features.home.AvatarRenderer -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.util.toMatrixItem import timber.log.Timber import javax.inject.Inject @@ -67,9 +67,9 @@ class LocationPinProvider @Inject constructor( activeSessionHolder .getActiveSession() - .getUser(userId) - ?.toMatrixItem() - ?.let { userItem -> + .getUserOrDefault(userId) + .toMatrixItem() + .let { userItem -> val size = dimensionConverter.dpToPx(44) val bgTintColor = matrixItemColorProvider.getColor(userItem) avatarRenderer.render(glideRequests, userItem, object : CustomTarget(size, size) { diff --git a/vector/src/main/java/im/vector/app/features/html/PillsPostProcessor.kt b/vector/src/main/java/im/vector/app/features/html/PillsPostProcessor.kt index 5f20b7278e..85cfb76ff7 100644 --- a/vector/src/main/java/im/vector/app/features/html/PillsPostProcessor.kt +++ b/vector/src/main/java/im/vector/app/features/html/PillsPostProcessor.kt @@ -27,7 +27,7 @@ import im.vector.app.core.glide.GlideApp import im.vector.app.features.home.AvatarRenderer import io.noties.markwon.core.spans.LinkSpan import org.matrix.android.sdk.api.session.getRoomSummary -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.session.permalinks.PermalinkData import org.matrix.android.sdk.api.session.permalinks.PermalinkParser import org.matrix.android.sdk.api.session.room.model.RoomSummary @@ -101,7 +101,7 @@ class PillsPostProcessor @AssistedInject constructor( private fun PermalinkData.UserLink.toMatrixItem(roomId: String?): MatrixItem? = if (roomId == null) { - sessionHolder.getSafeActiveSession()?.getUser(userId)?.toMatrixItem() + sessionHolder.getSafeActiveSession()?.getUserOrDefault(userId)?.toMatrixItem() } else { sessionHolder.getSafeActiveSession()?.roomService()?.getRoomMember(userId, roomId)?.toMatrixItem() } diff --git a/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt b/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt index 28e37a38eb..4c7abd99b8 100644 --- a/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/location/LocationSharingViewModel.kt @@ -40,7 +40,7 @@ import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.getRoom -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.session.room.powerlevels.PowerLevelsHelper import org.matrix.android.sdk.api.util.toMatrixItem import timber.log.Timber @@ -101,7 +101,7 @@ class LocationSharingViewModel @AssistedInject constructor( } private fun setUserItem() { - setState { copy(userItem = session.getUser(session.myUserId)?.toMatrixItem()) } + setState { copy(userItem = session.getUserOrDefault(session.myUserId).toMatrixItem()) } } private fun updatePin(isUserPin: Boolean? = true) { diff --git a/vector/src/main/java/im/vector/app/features/location/live/map/UserLiveLocationViewStateMapper.kt b/vector/src/main/java/im/vector/app/features/location/live/map/UserLiveLocationViewStateMapper.kt index 77f8c30fd3..f4f4a462ce 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/map/UserLiveLocationViewStateMapper.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/map/UserLiveLocationViewStateMapper.kt @@ -20,7 +20,7 @@ import im.vector.app.core.di.ActiveSessionHolder import im.vector.app.features.home.room.detail.timeline.helper.LocationPinProvider import im.vector.app.features.location.toLocationData import kotlinx.coroutines.suspendCancellableCoroutine -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.session.room.model.livelocation.LiveLocationShareAggregatedSummary import org.matrix.android.sdk.api.util.toMatrixItem import javax.inject.Inject @@ -45,19 +45,17 @@ class UserLiveLocationViewStateMapper @Inject constructor( else -> { locationPinProvider.create(userId) { pinDrawable -> val session = activeSessionHolder.getActiveSession() - session.getUser(userId)?.toMatrixItem()?.let { matrixItem -> - val locationTimestampMillis = liveLocationShareAggregatedSummary.lastLocationDataContent?.getBestTimestampMillis() - val viewState = UserLiveLocationViewState( - matrixItem = matrixItem, - pinDrawable = pinDrawable, - locationData = locationData, - endOfLiveTimestampMillis = liveLocationShareAggregatedSummary.endOfLiveTimestampMillis, - locationTimestampMillis = locationTimestampMillis, - showStopSharingButton = userId == session.myUserId - ) - continuation.resume(viewState) { - // do nothing on cancellation - } + val locationTimestampMillis = liveLocationShareAggregatedSummary.lastLocationDataContent?.getBestTimestampMillis() + val viewState = UserLiveLocationViewState( + matrixItem = session.getUserOrDefault(userId).toMatrixItem(), + pinDrawable = pinDrawable, + locationData = locationData, + endOfLiveTimestampMillis = liveLocationShareAggregatedSummary.endOfLiveTimestampMillis, + locationTimestampMillis = locationTimestampMillis, + showStopSharingButton = userId == session.myUserId + ) + continuation.resume(viewState) { + // do nothing on cancellation } } } diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt b/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt index 4ee7da4b64..ba1d5c7f6f 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt @@ -38,7 +38,7 @@ import org.matrix.android.sdk.api.session.events.model.supportsNotification import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.getRoomSummary -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.session.room.getTimelineEvent import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.RoomMemberContent @@ -112,7 +112,7 @@ class NotifiableEventResolver @Inject constructor( val notificationAction = actions.toNotificationAction() return if (notificationAction.shouldNotify) { - val user = session.getUser(event.senderId!!) ?: return null + val user = session.getUserOrDefault(event.senderId!!) val timelineEvent = TimelineEvent( root = event, diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt index 5f43ff6b90..2623045cf3 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt @@ -27,7 +27,7 @@ import im.vector.app.features.displayname.getBestName import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.content.ContentUrlResolver -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.util.toMatrixItem import timber.log.Timber import javax.inject.Inject @@ -186,11 +186,11 @@ class NotificationDrawerManager @Inject constructor( } private fun renderEvents(session: Session, eventsToRender: List>) { - val user = session.getUser(session.myUserId) + val user = session.getUserOrDefault(session.myUserId) // myUserDisplayName cannot be empty else NotificationCompat.MessagingStyle() will crash - val myUserDisplayName = user?.toMatrixItem()?.getBestName() ?: session.myUserId + val myUserDisplayName = user.toMatrixItem().getBestName() val myUserAvatarUrl = session.contentUrlResolver().resolveThumbnail( - contentUrl = user?.avatarUrl, + contentUrl = user.avatarUrl, width = avatarSize, height = avatarSize, method = ContentUrlResolver.ThumbnailMethod.SCALE diff --git a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt index f3e2f82edc..117c298878 100644 --- a/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/signout/soft/SoftLogoutViewModel.kt @@ -32,6 +32,7 @@ import im.vector.app.core.di.SingletonEntryPoint import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.extensions.hasUnsavedKeys import im.vector.app.core.platform.VectorViewModel +import im.vector.app.features.displayname.getBestName import im.vector.app.features.login.LoginMode import im.vector.app.features.login.toSsoState import kotlinx.coroutines.launch @@ -39,7 +40,8 @@ import org.matrix.android.sdk.api.auth.AuthenticationService import org.matrix.android.sdk.api.auth.LoginType import org.matrix.android.sdk.api.auth.data.LoginFlowTypes import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault +import org.matrix.android.sdk.api.util.toMatrixItem import timber.log.Timber class SoftLogoutViewModel @AssistedInject constructor( @@ -68,7 +70,7 @@ class SoftLogoutViewModel @AssistedInject constructor( homeServerUrl = session.sessionParams.homeServerUrl, userId = userId, deviceId = session.sessionParams.deviceId.orEmpty(), - userDisplayName = session.getUser(userId)?.displayName ?: userId, + userDisplayName = session.getUserOrDefault(userId).toMatrixItem().getBestName(), hasUnsavedKeys = session.hasUnsavedKeys(), loginType = session.sessionParams.loginType, ) diff --git a/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheetViewModel.kt index ea36908dd2..27f194e8d2 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/invite/SpaceInviteBottomSheetViewModel.kt @@ -34,7 +34,7 @@ import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.getRoomSummary -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.peeking.PeekResult @@ -49,7 +49,7 @@ class SpaceInviteBottomSheetViewModel @AssistedInject constructor( session.getRoomSummary(initialState.spaceId)?.let { roomSummary -> val knownMembers = roomSummary.otherMemberIds.filter { session.roomService().getExistingDirectRoomWithUser(it) != null - }.mapNotNull { session.getUser(it) } + }.map { session.getUserOrDefault(it) } // put one with avatar first, and take 5 val peopleYouKnow = (knownMembers.filter { it.avatarUrl != null } + knownMembers.filter { it.avatarUrl == null }) .take(5) @@ -57,7 +57,7 @@ class SpaceInviteBottomSheetViewModel @AssistedInject constructor( setState { copy( summary = Success(roomSummary), - inviterUser = roomSummary.inviterId?.let { session.getUser(it) }?.let { Success(it) } ?: Uninitialized, + inviterUser = roomSummary.inviterId?.let { session.getUserOrDefault(it) }?.let { Success(it) } ?: Uninitialized, peopleYouKnow = Success(peopleYouKnow) ) } diff --git a/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt index 8c377cafd5..e76837f182 100644 --- a/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/usercode/UserCodeSharedViewModel.kt @@ -30,7 +30,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session -import org.matrix.android.sdk.api.session.getUser +import org.matrix.android.sdk.api.session.getUserOrDefault import org.matrix.android.sdk.api.session.permalinks.PermalinkData import org.matrix.android.sdk.api.session.permalinks.PermalinkParser import org.matrix.android.sdk.api.session.user.model.User @@ -46,10 +46,10 @@ class UserCodeSharedViewModel @AssistedInject constructor( companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory() init { - val user = session.getUser(initialState.userId) + val user = session.getUserOrDefault(initialState.userId) setState { copy( - matrixItem = user?.toMatrixItem(), + matrixItem = user.toMatrixItem(), shareLink = session.permalinkService().createPermalink(initialState.userId) ) } From 8bb5dcd553f866cbbe7bdcf4ceac7f79ed564238 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 14 Oct 2022 12:33:27 +0200 Subject: [PATCH 6/8] Changelog --- changelog.d/7372.bugfix | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/7372.bugfix diff --git a/changelog.d/7372.bugfix b/changelog.d/7372.bugfix new file mode 100644 index 0000000000..e63e00035b --- /dev/null +++ b/changelog.d/7372.bugfix @@ -0,0 +1 @@ +Handle properly when getUser returns null - prefer using getUserOrDefault From 0cdc21649ec9d22220c61f37b82a693362ceb87f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 17 Oct 2022 11:27:40 +0200 Subject: [PATCH 7/8] Fix unused import --- .../android/sdk/internal/session/widgets/helper/WidgetFactory.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt index 8ede63c365..a43c59a83b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/widgets/helper/WidgetFactory.kt @@ -20,7 +20,6 @@ import org.matrix.android.sdk.api.session.content.ContentUrlResolver import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.sender.SenderInfo -import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.api.session.widgets.model.Widget import org.matrix.android.sdk.api.session.widgets.model.WidgetContent import org.matrix.android.sdk.api.session.widgets.model.WidgetType From b7570a3c5e781bc2f1d31aff07605ca6e7376bf4 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 17 Oct 2022 11:31:48 +0200 Subject: [PATCH 8/8] Fix compilation error --- .../android/sdk/internal/session/profile/GetProfileInfoTask.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt index 4a20c68caf..22bb3d37b0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/profile/GetProfileInfoTask.kt @@ -20,6 +20,7 @@ package org.matrix.android.sdk.internal.session.profile import com.zhuinden.monarchy.Monarchy import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.api.util.JsonDict +import org.matrix.android.sdk.internal.di.SessionDatabase import org.matrix.android.sdk.internal.network.GlobalErrorReceiver import org.matrix.android.sdk.internal.network.executeRequest import org.matrix.android.sdk.internal.session.user.UserEntityFactory @@ -37,7 +38,7 @@ internal abstract class GetProfileInfoTask : Task