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.

This commit is contained in:
Benoit Marty 2022-10-14 11:38:24 +02:00
parent 8fc35ef792
commit 0a6d620f27

View File

@ -29,11 +29,13 @@ import im.vector.app.core.di.MavericksAssistedViewModelFactory
import im.vector.app.core.di.SingletonEntryPoint 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.VectorViewModel 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.Session
import org.matrix.android.sdk.api.session.crypto.crosssigning.MXCrossSigningInfo 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.model.CryptoDeviceInfo
import org.matrix.android.sdk.api.session.crypto.verification.VerificationMethod 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.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
@ -60,17 +62,15 @@ class DeviceListBottomSheetViewModel @AssistedInject constructor(
companion object : MavericksViewModelFactory<DeviceListBottomSheetViewModel, DeviceListViewState> by hiltMavericksViewModelFactory() { companion object : MavericksViewModelFactory<DeviceListBottomSheetViewModel, DeviceListViewState> by hiltMavericksViewModelFactory() {
override fun initialState(viewModelContext: ViewModelContext): DeviceListViewState? { override fun initialState(viewModelContext: ViewModelContext): DeviceListViewState {
val args = viewModelContext.args<DeviceListBottomSheet.Args>() val args = viewModelContext.args<DeviceListBottomSheet.Args>()
val userId = args.userId val userId = args.userId
val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getActiveSession() val session = EntryPoints.get(viewModelContext.app(), SingletonEntryPoint::class.java).activeSessionHolder().getActiveSession()
return session.getUser(userId)?.toMatrixItem()?.let { return DeviceListViewState(
DeviceListViewState( userId = userId,
userId = userId, allowDeviceAction = args.allowDeviceAction,
allowDeviceAction = args.allowDeviceAction, userItem = session.getUserOrDefault(userId).toMatrixItem(),
userItem = it, )
)
} ?: return super.initialState(viewModelContext)
} }
} }
@ -86,6 +86,16 @@ class DeviceListBottomSheetViewModel @AssistedInject constructor(
.execute { .execute {
copy(memberCrossSigningKey = it.invoke()?.getOrNull()) 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) { override fun handle(action: DeviceListAction) {