From 0a6d620f27d3160d273f6d0a2b5e13936a333d23 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Fri, 14 Oct 2022 11:38:24 +0200 Subject: [PATCH] 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) {