Ensure `MatrixItem.UserItem` is not null at other places

This commit is contained in:
Benoit Marty 2022-09-15 11:29:38 +02:00
parent 42fc601c59
commit 3ddaf0c51f
14 changed files with 66 additions and 49 deletions

View File

@ -32,5 +32,13 @@ fun Session.getRoomSummary(roomIdOrAlias: String): RoomSummary? = roomService().
/** /**
* Get a user using the UserService of a Session. * Get a user using the UserService of a Session.
* @param userId the userId to look for.
* @return a user with userId or null if the User is not known yet by the SDK.
* See [org.matrix.android.sdk.api.session.user.UserService.resolveUser] to ensure that a User is retrieved.
*/ */
fun Session.getUser(userId: String): User? = userService().getUser(userId) fun Session.getUser(userId: String): User? = userService().getUser(userId)
/**
* Similar to [getUser], but fallback to a User without details if the User is not known by the SDK, or if Session is null.
*/
fun Session?.getUserOrDefault(userId: String): User = this?.userService()?.getUser(userId) ?: User(userId)

View File

@ -29,7 +29,7 @@ interface UserService {
/** /**
* Get a user from a userId. * Get a user from a userId.
* @param userId the userId to look for. * @param userId the userId to look for.
* @return a user with userId or null * @return a user with userId or null if the User is not known yet by the SDK. See [resolveUser] to ensure that a User is retrieved.
*/ */
fun getUser(userId: String): User? fun getUser(userId: String): User?

View File

@ -37,11 +37,10 @@ import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.raw.RawService import org.matrix.android.sdk.api.raw.RawService
import org.matrix.android.sdk.api.session.Session 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.PermalinkData
import org.matrix.android.sdk.api.session.permalinks.PermalinkParser import org.matrix.android.sdk.api.session.permalinks.PermalinkParser
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
import org.matrix.android.sdk.api.session.user.model.User
class CreateDirectRoomViewModel @AssistedInject constructor( class CreateDirectRoomViewModel @AssistedInject constructor(
@Assisted initialState: CreateDirectRoomViewState, @Assisted initialState: CreateDirectRoomViewState,
@ -78,11 +77,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor(
_viewEvents.post(CreateDirectRoomViewEvents.DmSelf) _viewEvents.post(CreateDirectRoomViewEvents.DmSelf)
} else { } else {
// Try to get user from known users and fall back to creating a User object from MXID // Try to get user from known users and fall back to creating a User object from MXID
val qrInvitee = if (session.getUser(mxid) != null) { val qrInvitee = session.getUserOrDefault(mxid)
session.getUser(mxid)!!
} else {
User(mxid, null, null)
}
onSubmitInvitees(setOf(PendingSelection.UserPendingSelection(qrInvitee))) onSubmitInvitees(setOf(PendingSelection.UserPendingSelection(qrInvitee)))
} }
} }

View File

@ -31,6 +31,7 @@ import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificatio
import org.matrix.android.sdk.api.session.crypto.verification.VerificationService import org.matrix.android.sdk.api.session.crypto.verification.VerificationService
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState
import org.matrix.android.sdk.api.session.getUserOrDefault
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
@ -67,8 +68,8 @@ class IncomingVerificationRequestHandler @Inject constructor(
when (tx.state) { when (tx.state) {
is VerificationTxState.OnStarted -> { is VerificationTxState.OnStarted -> {
// Add a notification for every incoming request // Add a notification for every incoming request
val user = session?.userService()?.getUser(tx.otherUserId) val user = session.getUserOrDefault(tx.otherUserId).toMatrixItem()
val name = user?.toMatrixItem()?.getBestName() ?: tx.otherUserId val name = user.getBestName()
val alert = VerificationVectorAlert( val alert = VerificationVectorAlert(
uid, uid,
context.getString(R.string.sas_incoming_request_notif_title), context.getString(R.string.sas_incoming_request_notif_title),
@ -86,7 +87,7 @@ class IncomingVerificationRequestHandler @Inject constructor(
} }
) )
.apply { .apply {
viewBinder = VerificationVectorAlert.ViewBinder(user?.toMatrixItem(), avatarRenderer.get()) viewBinder = VerificationVectorAlert.ViewBinder(user, avatarRenderer.get())
contentAction = Runnable { contentAction = Runnable {
(weakCurrentActivity?.get() as? VectorBaseActivity<*>)?.let { (weakCurrentActivity?.get() as? VectorBaseActivity<*>)?.let {
it.navigator.performDeviceVerification(it, tx.otherUserId, tx.transactionId) it.navigator.performDeviceVerification(it, tx.otherUserId, tx.transactionId)
@ -131,8 +132,8 @@ class IncomingVerificationRequestHandler @Inject constructor(
// XXX this is a bit hard coded :/ // XXX this is a bit hard coded :/
popupAlertManager.cancelAlert("review_login") popupAlertManager.cancelAlert("review_login")
} }
val user = session?.userService()?.getUser(pr.otherUserId)?.toMatrixItem() val user = session.getUserOrDefault(pr.otherUserId).toMatrixItem()
val name = user?.getBestName() ?: pr.otherUserId val name = user.getBestName()
val description = if (name == pr.otherUserId) { val description = if (name == pr.otherUserId) {
name name
} else { } else {

View File

@ -136,7 +136,7 @@ class VerificationEmojiCodeController @Inject constructor(
if (state.isWaitingFromOther) { if (state.isWaitingFromOther) {
bottomSheetVerificationWaitingItem { bottomSheetVerificationWaitingItem {
id("waiting") id("waiting")
title(host.stringProvider.getString(R.string.verification_request_waiting_for, state.otherUser?.getBestName() ?: "")) title(host.stringProvider.getString(R.string.verification_request_waiting_for, state.otherUser.getBestName()))
} }
} else { } else {
bottomSheetVerificationActionItem { bottomSheetVerificationActionItem {

View File

@ -68,13 +68,13 @@ class VerificationEmojiCodeFragment :
} }
override fun onMatchButtonTapped() = withState(viewModel) { state -> override fun onMatchButtonTapped() = withState(viewModel) { state ->
val otherUserId = state.otherUser?.id ?: return@withState val otherUserId = state.otherUser.id
val txId = state.transactionId ?: return@withState val txId = state.transactionId ?: return@withState
sharedViewModel.handle(VerificationAction.SASMatchAction(otherUserId, txId)) sharedViewModel.handle(VerificationAction.SASMatchAction(otherUserId, txId))
} }
override fun onDoNotMatchButtonTapped() = withState(viewModel) { state -> override fun onDoNotMatchButtonTapped() = withState(viewModel) { state ->
val otherUserId = state.otherUser?.id ?: return@withState val otherUserId = state.otherUser.id
val txId = state.transactionId ?: return@withState val txId = state.transactionId ?: return@withState
sharedViewModel.handle(VerificationAction.SASDoNotMatchAction(otherUserId, txId)) sharedViewModel.handle(VerificationAction.SASDoNotMatchAction(otherUserId, txId))
} }

View File

@ -40,13 +40,13 @@ import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTra
import org.matrix.android.sdk.api.session.crypto.verification.VerificationService import org.matrix.android.sdk.api.session.crypto.verification.VerificationService
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction import org.matrix.android.sdk.api.session.crypto.verification.VerificationTransaction
import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxState
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.MatrixItem
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
data class VerificationEmojiCodeViewState( data class VerificationEmojiCodeViewState(
val transactionId: String?, val transactionId: String?,
val otherUser: MatrixItem? = null, val otherUser: MatrixItem,
val supportsEmoji: Boolean = true, val supportsEmoji: Boolean = true,
val emojiDescription: Async<List<EmojiRepresentation>> = Uninitialized, val emojiDescription: Async<List<EmojiRepresentation>> = Uninitialized,
val decimalDescription: Async<String> = Uninitialized, val decimalDescription: Async<String> = Uninitialized,
@ -59,15 +59,13 @@ class VerificationEmojiCodeViewModel @AssistedInject constructor(
) : VectorViewModel<VerificationEmojiCodeViewState, EmptyAction, EmptyViewEvents>(initialState), VerificationService.Listener { ) : VectorViewModel<VerificationEmojiCodeViewState, EmptyAction, EmptyViewEvents>(initialState), VerificationService.Listener {
init { init {
withState { state -> refreshStateFromTx(
refreshStateFromTx( session.cryptoService().verificationService()
session.cryptoService().verificationService() .getExistingTransaction(
.getExistingTransaction( otherUserId = initialState.otherUser.id,
state.otherUser?.id ?: "", state.transactionId tid = initialState.transactionId ?: ""
?: "" ) as? SasVerificationTransaction
) as? SasVerificationTransaction )
)
}
session.cryptoService().verificationService().addListener(this) session.cryptoService().verificationService().addListener(this)
} }
@ -165,10 +163,10 @@ class VerificationEmojiCodeViewModel @AssistedInject constructor(
companion object : MavericksViewModelFactory<VerificationEmojiCodeViewModel, VerificationEmojiCodeViewState> by hiltMavericksViewModelFactory() { companion object : MavericksViewModelFactory<VerificationEmojiCodeViewModel, VerificationEmojiCodeViewState> by hiltMavericksViewModelFactory() {
override fun initialState(viewModelContext: ViewModelContext): VerificationEmojiCodeViewState? { override fun initialState(viewModelContext: ViewModelContext): VerificationEmojiCodeViewState {
val args = viewModelContext.args<VerificationBottomSheet.VerificationArgs>() val args = viewModelContext.args<VerificationBottomSheet.VerificationArgs>()
val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getActiveSession() val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getActiveSession()
val matrixItem = session.getUser(args.otherUserId)?.toMatrixItem() val matrixItem = session.getUserOrDefault(args.otherUserId).toMatrixItem()
return VerificationEmojiCodeViewState( return VerificationEmojiCodeViewState(
transactionId = args.verificationId, transactionId = args.verificationId,

View File

@ -514,7 +514,7 @@ class HomeActivity :
) )
} }
private fun promptSecurityEvent(userItem: MatrixItem.UserItem?, titleRes: Int, descRes: Int, action: ((VectorBaseActivity<*>) -> Unit)) { private fun promptSecurityEvent(userItem: MatrixItem.UserItem, titleRes: Int, descRes: Int, action: ((VectorBaseActivity<*>) -> Unit)) {
popupAlertManager.postVectorAlert( popupAlertManager.postVectorAlert(
VerificationVectorAlert( VerificationVectorAlert(
uid = "upgradeSecurity", uid = "upgradeSecurity",

View File

@ -20,13 +20,13 @@ import im.vector.app.core.platform.VectorViewEvents
import org.matrix.android.sdk.api.util.MatrixItem import org.matrix.android.sdk.api.util.MatrixItem
sealed interface HomeActivityViewEvents : VectorViewEvents { sealed interface HomeActivityViewEvents : VectorViewEvents {
data class AskPasswordToInitCrossSigning(val userItem: MatrixItem.UserItem?) : HomeActivityViewEvents data class AskPasswordToInitCrossSigning(val userItem: MatrixItem.UserItem) : HomeActivityViewEvents
data class CurrentSessionNotVerified( data class CurrentSessionNotVerified(
val userItem: MatrixItem.UserItem?, val userItem: MatrixItem.UserItem,
val waitForIncomingRequest: Boolean = true, val waitForIncomingRequest: Boolean = true,
) : HomeActivityViewEvents ) : HomeActivityViewEvents
data class CurrentSessionCannotBeVerified( data class CurrentSessionCannotBeVerified(
val userItem: MatrixItem.UserItem?, val userItem: MatrixItem.UserItem,
) : HomeActivityViewEvents ) : HomeActivityViewEvents
data class OnCrossSignedInvalidated(val userItem: MatrixItem.UserItem) : HomeActivityViewEvents data class OnCrossSignedInvalidated(val userItem: MatrixItem.UserItem) : HomeActivityViewEvents
object PromptToEnableSessionPush : HomeActivityViewEvents object PromptToEnableSessionPush : HomeActivityViewEvents

View File

@ -60,7 +60,7 @@ import org.matrix.android.sdk.api.raw.RawService
import org.matrix.android.sdk.api.session.crypto.crosssigning.CrossSigningService import org.matrix.android.sdk.api.session.crypto.crosssigning.CrossSigningService
import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap
import org.matrix.android.sdk.api.session.getUser import org.matrix.android.sdk.api.session.getUserOrDefault
import org.matrix.android.sdk.api.session.pushrules.RuleIds import org.matrix.android.sdk.api.session.pushrules.RuleIds
import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
@ -312,10 +312,10 @@ class HomeActivityViewModel @AssistedInject constructor(
} else { } else {
// cross signing keys have been reset // cross signing keys have been reset
// Trigger a popup to re-verify // Trigger a popup to re-verify
// Note: user can be null in case of logout // Note: user can be unknown in case of logout
session.getUser(session.myUserId) session.getUserOrDefault(session.myUserId)
?.toMatrixItem() .toMatrixItem()
?.let { user -> .let { user ->
_viewEvents.post(HomeActivityViewEvents.OnCrossSignedInvalidated(user)) _viewEvents.post(HomeActivityViewEvents.OnCrossSignedInvalidated(user))
} }
} }
@ -396,7 +396,7 @@ class HomeActivityViewModel @AssistedInject constructor(
// New session // New session
_viewEvents.post( _viewEvents.post(
HomeActivityViewEvents.CurrentSessionNotVerified( HomeActivityViewEvents.CurrentSessionNotVerified(
session.getUser(session.myUserId)?.toMatrixItem(), session.getUserOrDefault(session.myUserId).toMatrixItem(),
// Always send request instead of waiting for an incoming as per recent EW changes // Always send request instead of waiting for an incoming as per recent EW changes
false false
) )
@ -404,7 +404,7 @@ class HomeActivityViewModel @AssistedInject constructor(
} else { } else {
_viewEvents.post( _viewEvents.post(
HomeActivityViewEvents.CurrentSessionCannotBeVerified( HomeActivityViewEvents.CurrentSessionCannotBeVerified(
session.getUser(session.myUserId)?.toMatrixItem(), session.getUserOrDefault(session.myUserId).toMatrixItem(),
) )
) )
} }
@ -424,7 +424,7 @@ class HomeActivityViewModel @AssistedInject constructor(
// Check this is not an SSO account // Check this is not an SSO account
if (session.homeServerCapabilitiesService().getHomeServerCapabilities().canChangePassword) { if (session.homeServerCapabilitiesService().getHomeServerCapabilities().canChangePassword) {
// Ask password to the user: Upgrade security // Ask password to the user: Upgrade security
_viewEvents.post(HomeActivityViewEvents.AskPasswordToInitCrossSigning(session.getUser(session.myUserId)?.toMatrixItem())) _viewEvents.post(HomeActivityViewEvents.AskPasswordToInitCrossSigning(session.getUserOrDefault(session.myUserId).toMatrixItem()))
} }
// Else (SSO) just ignore for the moment // Else (SSO) just ignore for the moment
} else { } else {

View File

@ -21,10 +21,13 @@ import com.airbnb.mvrx.MavericksState
import com.airbnb.mvrx.MavericksViewModelFactory import com.airbnb.mvrx.MavericksViewModelFactory
import com.airbnb.mvrx.Success import com.airbnb.mvrx.Success
import com.airbnb.mvrx.Uninitialized import com.airbnb.mvrx.Uninitialized
import com.airbnb.mvrx.ViewModelContext
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import dagger.hilt.EntryPoints
import im.vector.app.core.di.MavericksAssistedViewModelFactory 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.di.hiltMavericksViewModelFactory
import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.EmptyViewEvents
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
@ -40,14 +43,14 @@ import org.matrix.android.sdk.api.NoOpMatrixCallback
import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo
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.MatrixItem
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
import org.matrix.android.sdk.flow.flow import org.matrix.android.sdk.flow.flow
import timber.log.Timber import timber.log.Timber
data class UnknownDevicesState( data class UnknownDevicesState(
val myMatrixItem: MatrixItem.UserItem? = null, val myMatrixItem: MatrixItem.UserItem,
val unknownSessions: Async<List<DeviceDetectionInfo>> = Uninitialized val unknownSessions: Async<List<DeviceDetectionInfo>> = Uninitialized
) : MavericksState ) : MavericksState
@ -73,7 +76,15 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
override fun create(initialState: UnknownDevicesState): UnknownDeviceDetectorSharedViewModel override fun create(initialState: UnknownDevicesState): UnknownDeviceDetectorSharedViewModel
} }
companion object : MavericksViewModelFactory<UnknownDeviceDetectorSharedViewModel, UnknownDevicesState> by hiltMavericksViewModelFactory() companion object : MavericksViewModelFactory<UnknownDeviceDetectorSharedViewModel, UnknownDevicesState> by hiltMavericksViewModelFactory() {
override fun initialState(viewModelContext: ViewModelContext): UnknownDevicesState {
val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getActiveSession()
return UnknownDevicesState(
myMatrixItem = session.getUserOrDefault(session.myUserId).toMatrixItem()
)
}
}
private val ignoredDeviceList = ArrayList<String>() private val ignoredDeviceList = ArrayList<String>()
@ -118,7 +129,7 @@ class UnknownDeviceDetectorSharedViewModel @AssistedInject constructor(
.execute { async -> .execute { async ->
// Timber.v("## Detector trigger passed distinct") // Timber.v("## Detector trigger passed distinct")
copy( copy(
myMatrixItem = session.getUser(session.myUserId)?.toMatrixItem(), myMatrixItem = session.getUserOrDefault(session.myUserId).toMatrixItem(),
unknownSessions = async unknownSessions = async
) )
} }

View File

@ -32,6 +32,7 @@ import im.vector.app.core.platform.StateView
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.resources.DrawableProvider import im.vector.app.core.resources.DrawableProvider
import im.vector.app.core.resources.StringProvider import im.vector.app.core.resources.StringProvider
import im.vector.app.features.displayname.getBestName
import im.vector.app.features.home.room.list.home.header.HomeRoomFilter import im.vector.app.features.home.room.list.home.header.HomeRoomFilter
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@ -53,6 +54,7 @@ import org.matrix.android.sdk.api.query.RoomTagQueryFilter
import org.matrix.android.sdk.api.query.toActiveSpaceOrNoFilter import org.matrix.android.sdk.api.query.toActiveSpaceOrNoFilter
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.getRoom import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.getUserOrDefault
import org.matrix.android.sdk.api.session.room.RoomSortOrder import org.matrix.android.sdk.api.session.room.RoomSortOrder
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
import org.matrix.android.sdk.api.session.room.UpdatableLivePageResult import org.matrix.android.sdk.api.session.room.UpdatableLivePageResult
@ -62,6 +64,7 @@ import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
import org.matrix.android.sdk.api.session.room.state.isPublic import org.matrix.android.sdk.api.session.room.state.isPublic
import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.api.util.toMatrixItem
import org.matrix.android.sdk.flow.flow import org.matrix.android.sdk.flow.flow
class HomeRoomListViewModel @AssistedInject constructor( class HomeRoomListViewModel @AssistedInject constructor(
@ -298,7 +301,7 @@ class HomeRoomListViewModel @AssistedInject constructor(
isBigImage = true isBigImage = true
) )
} else { } else {
val userName = session.userService().getUser(session.myUserId)?.displayName ?: "" val userName = session.getUserOrDefault(session.myUserId).toMatrixItem().getBestName()
StateView.State.Empty( StateView.State.Empty(
title = stringProvider.getString(R.string.home_empty_no_rooms_title, userName), title = stringProvider.getString(R.string.home_empty_no_rooms_title, userName),
message = stringProvider.getString(R.string.home_empty_no_rooms_message), message = stringProvider.getString(R.string.home_empty_no_rooms_message),

View File

@ -38,13 +38,13 @@ class VerificationVectorAlert(
override val layoutRes = R.layout.alerter_verification_layout override val layoutRes = R.layout.alerter_verification_layout
class ViewBinder( class ViewBinder(
private val matrixItem: MatrixItem?, private val matrixItem: MatrixItem,
private val avatarRenderer: AvatarRenderer private val avatarRenderer: AvatarRenderer
) : VectorAlert.ViewBinder { ) : VectorAlert.ViewBinder {
override fun bind(view: View) { override fun bind(view: View) {
val views = AlerterVerificationLayoutBinding.bind(view) val views = AlerterVerificationLayoutBinding.bind(view)
matrixItem?.let { avatarRenderer.render(it, views.ivUserAvatar, GlideApp.with(view.context.applicationContext)) } avatarRenderer.render(matrixItem, views.ivUserAvatar, GlideApp.with(view.context.applicationContext))
} }
} }
} }

View File

@ -47,6 +47,7 @@ import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.toContent import org.matrix.android.sdk.api.session.events.model.toContent
import org.matrix.android.sdk.api.session.events.model.toModel 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.getRoom
import org.matrix.android.sdk.api.session.getUserOrDefault
import org.matrix.android.sdk.api.session.room.RoomSortOrder import org.matrix.android.sdk.api.session.room.RoomSortOrder
import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataTypes import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataTypes
import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.Membership
@ -272,7 +273,7 @@ class SpaceListViewModel @AssistedInject constructor(
?.safeOrder() ?.safeOrder()
} }
val inviterIds = spaces.mapNotNull { it.inviterId } val inviterIds = spaces.mapNotNull { it.inviterId }
val inviters = inviterIds.mapNotNull { session.userService().getUser(it) } val inviters = inviterIds.map { session.getUserOrDefault(it) }
copy( copy(
asyncSpaces = asyncSpaces, asyncSpaces = asyncSpaces,
spaces = spaces, spaces = spaces,