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 a7b269fcc6..33bcad8f4d 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 @@ -20,6 +20,7 @@ import androidx.paging.PagedList import io.reactivex.Observable import io.reactivex.Single import io.reactivex.functions.Function3 +import kotlinx.coroutines.rx2.rxSingle import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session @@ -129,8 +130,8 @@ class RxSession(private val session: Session) { fun searchUsersDirectory(search: String, limit: Int, - excludedUserIds: Set): Single> = singleBuilder { - session.searchUsersDirectory(search, limit, excludedUserIds, it) + excludedUserIds: Set): Single> = rxSingle { + session.searchUsersDirectory(search, limit, excludedUserIds) } fun joinRoom(roomIdOrAlias: String, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt index ab85f979bf..cd4fb216d3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/user/UserService.kt @@ -18,9 +18,7 @@ package org.matrix.android.sdk.api.session.user import androidx.lifecycle.LiveData import androidx.paging.PagedList -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.user.model.User -import org.matrix.android.sdk.api.util.Cancelable import org.matrix.android.sdk.api.util.Optional /** @@ -38,17 +36,16 @@ interface UserService { /** * Try to resolve user from known users, or using profile api */ - fun resolveUser(userId: String, callback: MatrixCallback) + suspend fun resolveUser(userId: String): User /** * Search list of users on server directory. * @param search the searched term * @param limit the max number of users to return * @param excludedUserIds the user ids to filter from the search - * @param callback the async callback * @return Cancelable */ - fun searchUsersDirectory(search: String, limit: Int, excludedUserIds: Set, callback: MatrixCallback>): Cancelable + suspend fun searchUsersDirectory(search: String, limit: Int, excludedUserIds: Set): List /** * Observe a live user from a userId @@ -79,10 +76,10 @@ interface UserService { /** * Ignore users */ - fun ignoreUserIds(userIds: List, callback: MatrixCallback): Cancelable + suspend fun ignoreUserIds(userIds: List) /** * Un-ignore some users */ - fun unIgnoreUserIds(userIds: List, callback: MatrixCallback): Cancelable + suspend fun unIgnoreUserIds(userIds: List) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/DefaultUserService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/DefaultUserService.kt index 1740956915..52b8cc3689 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/DefaultUserService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/user/DefaultUserService.kt @@ -18,54 +18,35 @@ package org.matrix.android.sdk.internal.session.user import androidx.lifecycle.LiveData import androidx.paging.PagedList -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.session.profile.ProfileService import org.matrix.android.sdk.api.session.user.UserService import org.matrix.android.sdk.api.session.user.model.User -import org.matrix.android.sdk.api.util.Cancelable -import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.api.util.Optional import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask import org.matrix.android.sdk.internal.session.user.accountdata.UpdateIgnoredUserIdsTask import org.matrix.android.sdk.internal.session.user.model.SearchUserTask -import org.matrix.android.sdk.internal.task.TaskExecutor -import org.matrix.android.sdk.internal.task.configureWith import javax.inject.Inject internal class DefaultUserService @Inject constructor(private val userDataSource: UserDataSource, private val searchUserTask: SearchUserTask, private val updateIgnoredUserIdsTask: UpdateIgnoredUserIdsTask, - private val getProfileInfoTask: GetProfileInfoTask, - private val taskExecutor: TaskExecutor) : UserService { + private val getProfileInfoTask: GetProfileInfoTask) : UserService { override fun getUser(userId: String): User? { return userDataSource.getUser(userId) } - override fun resolveUser(userId: String, callback: MatrixCallback) { + override suspend fun resolveUser(userId: String): User { val known = getUser(userId) if (known != null) { - callback.onSuccess(known) + return known } else { val params = GetProfileInfoTask.Params(userId) - getProfileInfoTask - .configureWith(params) { - this.callback = object : MatrixCallback { - override fun onSuccess(data: JsonDict) { - callback.onSuccess( - User( - userId, - data[ProfileService.DISPLAY_NAME_KEY] as? String, - data[ProfileService.AVATAR_URL_KEY] as? String) - ) - } - - override fun onFailure(failure: Throwable) { - callback.onFailure(failure) - } - } - } - .executeBy(taskExecutor) + val data = getProfileInfoTask.execute(params) + return User( + userId, + data[ProfileService.DISPLAY_NAME_KEY] as? String, + data[ProfileService.AVATAR_URL_KEY] as? String) } } @@ -85,33 +66,20 @@ internal class DefaultUserService @Inject constructor(private val userDataSource return userDataSource.getIgnoredUsersLive() } - override fun searchUsersDirectory(search: String, - limit: Int, - excludedUserIds: Set, - callback: MatrixCallback>): Cancelable { + override suspend fun searchUsersDirectory(search: String, + limit: Int, + excludedUserIds: Set): List { val params = SearchUserTask.Params(limit, search, excludedUserIds) - return searchUserTask - .configureWith(params) { - this.callback = callback - } - .executeBy(taskExecutor) + return searchUserTask.execute(params) } - override fun ignoreUserIds(userIds: List, callback: MatrixCallback): Cancelable { + override suspend fun ignoreUserIds(userIds: List) { val params = UpdateIgnoredUserIdsTask.Params(userIdsToIgnore = userIds.toList()) - return updateIgnoredUserIdsTask - .configureWith(params) { - this.callback = callback - } - .executeBy(taskExecutor) + updateIgnoredUserIdsTask.execute(params) } - override fun unIgnoreUserIds(userIds: List, callback: MatrixCallback): Cancelable { + override suspend fun unIgnoreUserIds(userIds: List) { val params = UpdateIgnoredUserIdsTask.Params(userIdsToUnIgnore = userIds.toList()) - return updateIgnoredUserIdsTask - .configureWith(params) { - this.callback = callback - } - .executeBy(taskExecutor) + updateIgnoredUserIdsTask.execute(params) } } 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 af3d5461ef..2d301a813b 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 @@ -1275,15 +1275,15 @@ class RoomDetailViewModel @AssistedInject constructor( return } - session.ignoreUserIds(listOf(action.userId), object : MatrixCallback { - override fun onSuccess(data: Unit) { - _viewEvents.post(RoomDetailViewEvents.ActionSuccess(action)) + viewModelScope.launch { + val event = try { + session.ignoreUserIds(listOf(action.userId)) + RoomDetailViewEvents.ActionSuccess(action) + } catch (failure: Throwable) { + RoomDetailViewEvents.ActionFailure(action, failure) } - - override fun onFailure(failure: Throwable) { - _viewEvents.post(RoomDetailViewEvents.ActionFailure(action, failure)) - } - }) + _viewEvents.post(event) + } } private fun handleAcceptVerification(action: RoomDetailAction.AcceptVerificationRequest) { diff --git a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt index e5bdc9bca8..b961383575 100644 --- a/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/matrixto/MatrixToBottomSheetViewModel.kt @@ -41,7 +41,6 @@ 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 import org.matrix.android.sdk.api.util.toMatrixItem -import org.matrix.android.sdk.internal.util.awaitCallback class MatrixToBottomSheetViewModel @AssistedInject constructor( @Assisted initialState: MatrixToBottomSheetState, @@ -101,11 +100,7 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor( } private suspend fun resolveUser(userId: String): User { - return tryOrNull { - awaitCallback { - session.resolveUser(userId, it) - } - } + return tryOrNull { session.resolveUser(userId) } // Create raw user in case the user is not searchable ?: User(userId, null, null) } diff --git a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt index 0556b9d2d6..108841faa0 100644 --- a/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roommemberprofile/RoomMemberProfileViewModel.kt @@ -37,7 +37,6 @@ import io.reactivex.functions.BiFunction import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.EventType @@ -321,19 +320,18 @@ class RoomMemberProfileViewModel @AssistedInject constructor(@Assisted private v private fun handleIgnoreAction() = withState { state -> val isIgnored = state.isIgnored() ?: return@withState _viewEvents.post(RoomMemberProfileViewEvents.Loading()) - val ignoreActionCallback = object : MatrixCallback { - override fun onSuccess(data: Unit) { - _viewEvents.post(RoomMemberProfileViewEvents.OnIgnoreActionSuccess) + viewModelScope.launch { + val event = try { + if (isIgnored) { + session.unIgnoreUserIds(listOf(state.userId)) + } else { + session.ignoreUserIds(listOf(state.userId)) + } + RoomMemberProfileViewEvents.OnIgnoreActionSuccess + } catch (failure: Throwable) { + RoomMemberProfileViewEvents.Failure(failure) } - - override fun onFailure(failure: Throwable) { - _viewEvents.post(RoomMemberProfileViewEvents.Failure(failure)) - } - } - if (isIgnored) { - session.unIgnoreUserIds(listOf(state.userId), ignoreActionCallback) - } else { - session.ignoreUserIds(listOf(state.userId), ignoreActionCallback) + _viewEvents.post(event) } } diff --git a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt index fdc6585829..aa00f71542 100644 --- a/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/ignored/IgnoredUsersViewModel.kt @@ -16,6 +16,7 @@ package im.vector.app.features.settings.ignored +import androidx.lifecycle.viewModelScope import com.airbnb.mvrx.Async import com.airbnb.mvrx.Fail import com.airbnb.mvrx.FragmentViewModelContext @@ -30,7 +31,7 @@ import dagger.assisted.AssistedInject import dagger.assisted.AssistedFactory import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModelAction -import org.matrix.android.sdk.api.MatrixCallback +import kotlinx.coroutines.launch import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.rx.rx @@ -89,24 +90,14 @@ class IgnoredUsersViewModel @AssistedInject constructor(@Assisted initialState: ) } - session.unIgnoreUserIds(listOf(action.userId), object : MatrixCallback { - override fun onFailure(failure: Throwable) { - setState { - copy( - unIgnoreRequest = Fail(failure) - ) - } - - _viewEvents.post(IgnoredUsersViewEvents.Failure(failure)) + viewModelScope.launch { + val result = runCatching { session.unIgnoreUserIds(listOf(action.userId)) } + setState { + copy( + unIgnoreRequest = result.fold(::Success, ::Fail) + ) } - - override fun onSuccess(data: Unit) { - setState { - copy( - unIgnoreRequest = Success(data) - ) - } - } - }) + result.onFailure { _viewEvents.post(IgnoredUsersViewEvents.Failure(it)) } + } } } 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 671d018b63..9637b72581 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 @@ -37,7 +37,6 @@ 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 import org.matrix.android.sdk.api.util.toMatrixItem -import org.matrix.android.sdk.internal.util.awaitCallback class UserCodeSharedViewModel @AssistedInject constructor( @Assisted val initialState: UserCodeState, @@ -126,11 +125,7 @@ class UserCodeSharedViewModel @AssistedInject constructor( _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented))) } is PermalinkData.UserLink -> { - val user = tryOrNull { - awaitCallback { - session.resolveUser(linkedId.userId, it) - } - } + val user = tryOrNull { session.resolveUser(linkedId.userId) } // Create raw Uxid in case the user is not searchable ?: User(linkedId.userId, null, null)