diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt index 0d5b5ed821..cac0a32232 100644 --- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt +++ b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt @@ -124,8 +124,8 @@ class RxSession(private val session: Session) { .startWithCallable { session.getPendingThreePids() } } - fun createRoom(roomParams: CreateRoomParams): Single = singleBuilder { - session.createRoom(roomParams, it) + fun createRoom(roomParams: CreateRoomParams): Single = rxSingle { + session.createRoom(roomParams) } fun searchUsersDirectory(search: String, @@ -136,8 +136,8 @@ class RxSession(private val session: Session) { fun joinRoom(roomIdOrAlias: String, reason: String? = null, - viaServers: List = emptyList()): Single = singleBuilder { - session.joinRoom(roomIdOrAlias, reason, viaServers, it) + viaServers: List = emptyList()): Single = rxSingle { + session.joinRoom(roomIdOrAlias, reason, viaServers) } fun getRoomIdByAlias(roomAlias: String, diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt index 5815b23c06..da176491c6 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt @@ -66,8 +66,8 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) { fun doE2ETestWithAliceInARoom(encryptedRoom: Boolean = true): CryptoTestData { val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, defaultSessionParams) - val roomId = mTestHelper.doSync { - aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" }, it) + val roomId = mTestHelper.runBlockingTest { + aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" }) } if (encryptedRoom) { @@ -135,7 +135,7 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) { bobRoomSummariesLive.observeForever(roomJoinedObserver) } - mTestHelper.doSync { bobSession.joinRoom(aliceRoomId, callback = it) } + mTestHelper.runBlockingTest { bobSession.joinRoom(aliceRoomId) } mTestHelper.await(lock) @@ -176,8 +176,8 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) { room.invite(samSession.myUserId, null) } - mTestHelper.doSync { - samSession.joinRoom(room.roomId, null, emptyList(), it) + mTestHelper.runBlockingTest { + samSession.joinRoom(room.roomId, null, emptyList()) } return samSession @@ -256,8 +256,8 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) { } fun createDM(alice: Session, bob: Session): String { - val roomId = mTestHelper.doSync { - alice.createDirectRoom(bob.myUserId, it) + val roomId = mTestHelper.runBlockingTest { + alice.createDirectRoom(bob.myUserId) } mTestHelper.waitWithLatch { latch -> @@ -300,7 +300,7 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) { bobRoomSummariesLive.observeForever(newRoomObserver) } - mTestHelper.doSync { bob.joinRoom(roomId, callback = it) } + mTestHelper.runBlockingTest { bob.joinRoom(roomId) } } return roomId @@ -398,8 +398,8 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) { val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, defaultSessionParams) aliceSession.cryptoService().setWarnOnUnknownDevices(false) - val roomId = mTestHelper.doSync { - aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" }, it) + val roomId = mTestHelper.runBlockingTest { + aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" }) } val room = aliceSession.getRoom(roomId)!! @@ -412,7 +412,7 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) { val session = mTestHelper.createAccount("User_$index", defaultSessionParams) mTestHelper.runBlockingTest(timeout = 600_000) { room.invite(session.myUserId, null) } println("TEST -> " + session.myUserId + " invited") - mTestHelper.doSync { session.joinRoom(room.roomId, null, emptyList(), it) } + mTestHelper.runBlockingTest { session.joinRoom(room.roomId, null, emptyList()) } println("TEST -> " + session.myUserId + " joined") sessions.add(session) } diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/KeyShareTests.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/KeyShareTests.kt index e6b364f3fb..40659cef11 100644 --- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/KeyShareTests.kt +++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/KeyShareTests.kt @@ -71,13 +71,12 @@ class KeyShareTests : InstrumentedTest { val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true)) // Create an encrypted room and add a message - val roomId = mTestHelper.doSync { + val roomId = mTestHelper.runBlockingTest { aliceSession.createRoom( CreateRoomParams().apply { visibility = RoomDirectoryVisibility.PRIVATE enableEncryption() - }, - it + } ) } val room = aliceSession.getRoom(roomId) @@ -332,13 +331,12 @@ class KeyShareTests : InstrumentedTest { } // Create an encrypted room and send a couple of messages - val roomId = mTestHelper.doSync { + val roomId = mTestHelper.runBlockingTest { aliceSession.createRoom( CreateRoomParams().apply { visibility = RoomDirectoryVisibility.PRIVATE enableEncryption() - }, - it + } ) } val roomAlicePov = aliceSession.getRoom(roomId) @@ -371,8 +369,8 @@ class KeyShareTests : InstrumentedTest { roomAlicePov.invite(bobSession.myUserId, null) } - mTestHelper.doSync { - bobSession.joinRoom(roomAlicePov.roomId, null, emptyList(), it) + mTestHelper.runBlockingTest { + bobSession.joinRoom(roomAlicePov.roomId, null, emptyList()) } // we want to discard alice outbound session diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt index 5f02b77a1e..bc5cb3c8f4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/RoomService.kt @@ -17,14 +17,12 @@ package org.matrix.android.sdk.api.session.room import androidx.lifecycle.LiveData -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams import org.matrix.android.sdk.api.session.room.peeking.PeekResult -import org.matrix.android.sdk.api.util.Cancelable import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.session.room.alias.RoomAliasDescription @@ -36,22 +34,19 @@ interface RoomService { /** * Create a room asynchronously */ - fun createRoom(createRoomParams: CreateRoomParams, - callback: MatrixCallback): Cancelable + suspend fun createRoom(createRoomParams: CreateRoomParams): String /** * Create a direct room asynchronously. This is a facility method to create a direct room with the necessary parameters */ - fun createDirectRoom(otherUserId: String, - callback: MatrixCallback): Cancelable { + suspend fun createDirectRoom(otherUserId: String): String { return createRoom( CreateRoomParams() .apply { invitedUserIds.add(otherUserId) setDirectMessage() enableEncryptionIfInvitedUsersSupportIt = true - }, - callback + } ) } @@ -61,10 +56,9 @@ interface RoomService { * @param reason optional reason for joining the room * @param viaServers the servers to attempt to join the room through. One of the servers must be participating in the room. */ - fun joinRoom(roomIdOrAlias: String, - reason: String? = null, - viaServers: List = emptyList(), - callback: MatrixCallback): Cancelable + suspend fun joinRoom(roomIdOrAlias: String, + reason: String? = null, + viaServers: List = emptyList()) /** * Get a room from a roomId @@ -110,20 +104,18 @@ interface RoomService { * Inform the Matrix SDK that a room is displayed. * The SDK will update the breadcrumbs in the user account data */ - fun onRoomDisplayed(roomId: String): Cancelable + suspend fun onRoomDisplayed(roomId: String) /** * Mark all rooms as read */ - fun markAllAsRead(roomIds: List, - callback: MatrixCallback): Cancelable + suspend fun markAllAsRead(roomIds: List) /** * Resolve a room alias to a room ID. */ - fun getRoomIdByAlias(roomAlias: String, - searchOnServer: Boolean, - callback: MatrixCallback>): Cancelable + suspend fun getRoomIdByAlias(roomAlias: String, + searchOnServer: Boolean): Optional /** * Delete a room alias @@ -170,12 +162,12 @@ interface RoomService { /** * Get some state events about a room */ - fun getRoomState(roomId: String, callback: MatrixCallback>) + suspend fun getRoomState(roomId: String): List /** * Use this if you want to get information from a room that you are not yet in (or invited) * It might be possible to get some information on this room if it is public or if guest access is allowed * This call will try to gather some information on this room, but it could fail and get nothing more */ - fun peekRoom(roomIdOrAlias: String, callback: MatrixCallback) + suspend fun peekRoom(roomIdOrAlias: String): PeekResult } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt index 383dd876d3..f510b3c997 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/DefaultRoomService.kt @@ -19,7 +19,6 @@ package org.matrix.android.sdk.internal.session.room import androidx.lifecycle.LiveData import androidx.lifecycle.Transformations import com.zhuinden.monarchy.Monarchy -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.api.session.room.RoomService @@ -29,7 +28,6 @@ import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams import org.matrix.android.sdk.api.session.room.peeking.PeekResult -import org.matrix.android.sdk.api.util.Cancelable import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.api.util.toOptional import org.matrix.android.sdk.internal.database.mapper.asDomain @@ -47,8 +45,6 @@ import org.matrix.android.sdk.internal.session.room.peeking.ResolveRoomStateTask import org.matrix.android.sdk.internal.session.room.read.MarkAllRoomsReadTask import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryDataSource import org.matrix.android.sdk.internal.session.user.accountdata.UpdateBreadcrumbsTask -import org.matrix.android.sdk.internal.task.TaskExecutor -import org.matrix.android.sdk.internal.task.configureWith import org.matrix.android.sdk.internal.util.fetchCopied import javax.inject.Inject @@ -64,16 +60,11 @@ internal class DefaultRoomService @Inject constructor( private val peekRoomTask: PeekRoomTask, private val roomGetter: RoomGetter, private val roomSummaryDataSource: RoomSummaryDataSource, - private val roomChangeMembershipStateDataSource: RoomChangeMembershipStateDataSource, - private val taskExecutor: TaskExecutor + private val roomChangeMembershipStateDataSource: RoomChangeMembershipStateDataSource ) : RoomService { - override fun createRoom(createRoomParams: CreateRoomParams, callback: MatrixCallback): Cancelable { - return createRoomTask - .configureWith(createRoomParams) { - this.callback = callback - } - .executeBy(taskExecutor) + override suspend fun createRoom(createRoomParams: CreateRoomParams): String { + return createRoomTask.execute(createRoomParams) } override fun getRoom(roomId: String): Room? { @@ -104,34 +95,20 @@ internal class DefaultRoomService @Inject constructor( return roomSummaryDataSource.getBreadcrumbsLive(queryParams) } - override fun onRoomDisplayed(roomId: String): Cancelable { - return updateBreadcrumbsTask - .configureWith(UpdateBreadcrumbsTask.Params(roomId)) - .executeBy(taskExecutor) + override suspend fun onRoomDisplayed(roomId: String) { + updateBreadcrumbsTask.execute(UpdateBreadcrumbsTask.Params(roomId)) } - override fun joinRoom(roomIdOrAlias: String, reason: String?, viaServers: List, callback: MatrixCallback): Cancelable { - return joinRoomTask - .configureWith(JoinRoomTask.Params(roomIdOrAlias, reason, viaServers)) { - this.callback = callback - } - .executeBy(taskExecutor) + override suspend fun joinRoom(roomIdOrAlias: String, reason: String?, viaServers: List) { + joinRoomTask.execute(JoinRoomTask.Params(roomIdOrAlias, reason, viaServers)) } - override fun markAllAsRead(roomIds: List, callback: MatrixCallback): Cancelable { - return markAllRoomsReadTask - .configureWith(MarkAllRoomsReadTask.Params(roomIds)) { - this.callback = callback - } - .executeBy(taskExecutor) + override suspend fun markAllAsRead(roomIds: List) { + markAllRoomsReadTask.execute(MarkAllRoomsReadTask.Params(roomIds)) } - override fun getRoomIdByAlias(roomAlias: String, searchOnServer: Boolean, callback: MatrixCallback>): Cancelable { - return roomIdByAliasTask - .configureWith(GetRoomIdByAliasTask.Params(roomAlias, searchOnServer)) { - this.callback = callback - } - .executeBy(taskExecutor) + override suspend fun getRoomIdByAlias(roomAlias: String, searchOnServer: Boolean): Optional { + return roomIdByAliasTask.execute(GetRoomIdByAliasTask.Params(roomAlias, searchOnServer)) } override suspend fun deleteRoomAlias(roomAlias: String) { @@ -162,19 +139,11 @@ internal class DefaultRoomService @Inject constructor( } } - override fun getRoomState(roomId: String, callback: MatrixCallback>) { - resolveRoomStateTask - .configureWith(ResolveRoomStateTask.Params(roomId)) { - this.callback = callback - } - .executeBy(taskExecutor) + override suspend fun getRoomState(roomId: String): List { + return resolveRoomStateTask.execute(ResolveRoomStateTask.Params(roomId)) } - override fun peekRoom(roomIdOrAlias: String, callback: MatrixCallback) { - peekRoomTask - .configureWith(PeekRoomTask.Params(roomIdOrAlias)) { - this.callback = callback - } - .executeBy(taskExecutor) + override suspend fun peekRoom(roomIdOrAlias: String): PeekResult { + return peekRoomTask.execute(PeekRoomTask.Params(roomIdOrAlias)) } } diff --git a/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt b/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt index 171970ec1e..bfa56cfb9e 100644 --- a/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt +++ b/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt @@ -22,7 +22,6 @@ import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams -import org.matrix.android.sdk.internal.util.awaitCallback import javax.inject.Inject class DirectRoomHelper @Inject constructor( @@ -45,9 +44,7 @@ class DirectRoomHelper @Inject constructor( setDirectMessage() enableEncryptionIfInvitedUsersSupportIt = adminE2EByDefault } - roomId = awaitCallback { - session.createRoom(roomParams, it) - } + roomId = session.createRoom(roomParams) } return roomId } diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt index 0e230c6727..a67cb96d37 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/VerificationBottomSheetViewModel.kt @@ -249,32 +249,34 @@ class VerificationBottomSheetViewModel @AssistedInject constructor( pendingRequest = Loading() ) } - session.createDirectRoom(otherUserId, object : MatrixCallback { - override fun onSuccess(data: String) { - setState { - copy( - roomId = data, - pendingRequest = Success( - session - .cryptoService() - .verificationService() - .requestKeyVerificationInDMs( - supportedVerificationMethodsProvider.provide(), - otherUserId, - data, - pendingLocalId - ) + viewModelScope.launch { + val result = runCatching { session.createDirectRoom(otherUserId) } + result.fold( + { data -> + setState { + copy( + roomId = data, + pendingRequest = Success( + session + .cryptoService() + .verificationService() + .requestKeyVerificationInDMs( + supportedVerificationMethodsProvider.provide(), + otherUserId, + data, + pendingLocalId + ) + ) ) - ) - } - } - - override fun onFailure(failure: Throwable) { - setState { - copy(pendingRequest = Fail(failure)) - } - } - }) + } + }, + { failure -> + setState { + copy(pendingRequest = Fail(failure)) + } + } + ) + } } else { setState { copy( diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 6152562850..ce53c72376 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -184,7 +184,12 @@ class RoomDetailViewModel @AssistedInject constructor( } } // Inform the SDK that the room is displayed - session.onRoomDisplayed(initialState.roomId) + viewModelScope.launch { + try { + session.onRoomDisplayed(initialState.roomId) + } catch (_: Exception) { + } + } callManager.addPstnSupportListener(this) callManager.checkForPSTNSupportIfNeeded() chatEffectManager.delegate = this @@ -902,19 +907,19 @@ class RoomDetailViewModel @AssistedInject constructor( } private fun handleJoinToAnotherRoomSlashCommand(command: ParsedCommand.JoinRoom) { - session.joinRoom(command.roomAlias, command.reason, emptyList(), object : MatrixCallback { - override fun onSuccess(data: Unit) { - session.getRoomSummary(command.roomAlias) - ?.roomId - ?.let { - _viewEvents.post(RoomDetailViewEvents.JoinRoomCommandSuccess(it)) - } - } - - override fun onFailure(failure: Throwable) { + viewModelScope.launch { + try { + session.joinRoom(command.roomAlias, command.reason, emptyList()) + } catch (failure: Throwable) { _viewEvents.post(RoomDetailViewEvents.SlashCommandResultError(failure)) + return@launch } - }) + session.getRoomSummary(command.roomAlias) + ?.roomId + ?.let { + _viewEvents.post(RoomDetailViewEvents.JoinRoomCommandSuccess(it)) + } + } } private fun legacyRiotQuoteText(quotedText: String?, myText: String): String { diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt index 3a5e797f98..f4cfbe94d0 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListViewModel.kt @@ -26,7 +26,6 @@ import im.vector.app.core.utils.DataSource import io.reactivex.schedulers.Schedulers import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.matrix.android.sdk.api.NoOpMatrixCallback import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.room.model.Membership @@ -169,7 +168,14 @@ class RoomListViewModel @Inject constructor(initialState: RoomListViewState, ?.filter { it.membership == Membership.JOIN } ?.map { it.roomId } ?.toList() - ?.let { session.markAllAsRead(it, NoOpMatrixCallback()) } + ?.let { + viewModelScope.launch { + try { + session.markAllAsRead(it) + } catch (_: Exception) { + } + } + } } private fun handleChangeNotificationMode(action: RoomListAction.ChangeRoomNotificationState) { diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt index 4ef38758c7..5012243e96 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/RoomDirectoryViewModel.kt @@ -31,7 +31,6 @@ import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.settings.VectorPreferences import kotlinx.coroutines.Job import kotlinx.coroutines.launch -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.session.Session @@ -232,17 +231,16 @@ class RoomDirectoryViewModel @AssistedInject constructor( val viaServers = state.roomDirectoryData.homeServer ?.let { listOf(it) } .orEmpty() - session.joinRoom(action.roomId, viaServers = viaServers, callback = object : MatrixCallback { - override fun onSuccess(data: Unit) { + viewModelScope.launch { + try { + session.joinRoom(action.roomId, viaServers = viaServers) // We do not update the joiningRoomsIds here, because, the room is not joined yet regarding the sync data. // Instead, we wait for the room to be joined - } - - override fun onFailure(failure: Throwable) { + } catch (failure: Throwable) { // Notify the user _viewEvents.post(RoomDirectoryViewEvents.Failure(failure)) } - }) + } } override fun onCleared() { diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt index 3c027c4845..af63f23a8c 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -34,7 +34,6 @@ import im.vector.app.features.raw.wellknown.getElementWellknown import im.vector.app.features.raw.wellknown.isE2EByDefault import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService import org.matrix.android.sdk.api.session.Session @@ -216,19 +215,22 @@ class CreateRoomViewModel @AssistedInject constructor(@Assisted initialState: Cr } } - session.createRoom(createRoomParams, object : MatrixCallback { - override fun onSuccess(data: String) { - setState { - copy(asyncCreateRoomRequest = Success(data)) - } - } - - override fun onFailure(failure: Throwable) { - setState { - copy(asyncCreateRoomRequest = Fail(failure)) - } - _viewEvents.post(CreateRoomViewEvents.Failure(failure)) - } - }) + // TODO: Should this be non-cancellable? + viewModelScope.launch { + val result = runCatching { session.createRoom(createRoomParams) } + result.fold( + { roomId -> + setState { + copy(asyncCreateRoomRequest = Success(roomId)) + } + }, + { failure -> + setState { + copy(asyncCreateRoomRequest = Fail(failure)) + } + _viewEvents.post(CreateRoomViewEvents.Failure(failure)) + } + ) + } } } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewViewModel.kt index c99213d890..c4d479374b 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/roompreview/RoomPreviewViewModel.kt @@ -31,7 +31,6 @@ import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.roomdirectory.JoinState import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session @@ -39,7 +38,6 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.peeking.PeekResult import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams -import org.matrix.android.sdk.internal.util.awaitCallback import org.matrix.android.sdk.rx.rx import timber.log.Timber @@ -77,9 +75,7 @@ class RoomPreviewViewModel @AssistedInject constructor(@Assisted private val ini } viewModelScope.launch(Dispatchers.IO) { val peekResult = tryOrNull { - awaitCallback { - session.peekRoom(initialState.roomAlias ?: initialState.roomId, it) - } + session.peekRoom(initialState.roomAlias ?: initialState.roomId) } when (peekResult) { @@ -177,15 +173,14 @@ class RoomPreviewViewModel @AssistedInject constructor(@Assisted private val ini Timber.w("Try to join an already joining room. Should not happen") return@withState } - session.joinRoom(state.roomId, viaServers = state.homeServers, callback = object : MatrixCallback { - override fun onSuccess(data: Unit) { + viewModelScope.launch { + try { + session.joinRoom(state.roomId, viaServers = state.homeServers) // We do not update the joiningRoomsIds here, because, the room is not joined yet regarding the sync data. // Instead, we wait for the room to be joined - } - - override fun onFailure(failure: Throwable) { + } catch (failure: Throwable) { setState { copy(lastError = failure) } } - }) + } } }