Merge pull request #3076 from Dominaezzz/suspend_functions_7

Convert UserService to suspend functions
This commit is contained in:
Benoit Marty 2021-03-29 13:18:34 +02:00 committed by GitHub
commit c15e2e96b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 54 additions and 109 deletions

View File

@ -20,6 +20,7 @@ import androidx.paging.PagedList
import io.reactivex.Observable import io.reactivex.Observable
import io.reactivex.Single import io.reactivex.Single
import io.reactivex.functions.Function3 import io.reactivex.functions.Function3
import kotlinx.coroutines.rx2.rxSingle
import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
@ -129,8 +130,8 @@ class RxSession(private val session: Session) {
fun searchUsersDirectory(search: String, fun searchUsersDirectory(search: String,
limit: Int, limit: Int,
excludedUserIds: Set<String>): Single<List<User>> = singleBuilder { excludedUserIds: Set<String>): Single<List<User>> = rxSingle {
session.searchUsersDirectory(search, limit, excludedUserIds, it) session.searchUsersDirectory(search, limit, excludedUserIds)
} }
fun joinRoom(roomIdOrAlias: String, fun joinRoom(roomIdOrAlias: String,

View File

@ -18,9 +18,7 @@ package org.matrix.android.sdk.api.session.user
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.paging.PagedList 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.session.user.model.User
import org.matrix.android.sdk.api.util.Cancelable
import org.matrix.android.sdk.api.util.Optional 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 * Try to resolve user from known users, or using profile api
*/ */
fun resolveUser(userId: String, callback: MatrixCallback<User>) suspend fun resolveUser(userId: String): User
/** /**
* Search list of users on server directory. * Search list of users on server directory.
* @param search the searched term * @param search the searched term
* @param limit the max number of users to return * @param limit the max number of users to return
* @param excludedUserIds the user ids to filter from the search * @param excludedUserIds the user ids to filter from the search
* @param callback the async callback
* @return Cancelable * @return Cancelable
*/ */
fun searchUsersDirectory(search: String, limit: Int, excludedUserIds: Set<String>, callback: MatrixCallback<List<User>>): Cancelable suspend fun searchUsersDirectory(search: String, limit: Int, excludedUserIds: Set<String>): List<User>
/** /**
* Observe a live user from a userId * Observe a live user from a userId
@ -79,10 +76,10 @@ interface UserService {
/** /**
* Ignore users * Ignore users
*/ */
fun ignoreUserIds(userIds: List<String>, callback: MatrixCallback<Unit>): Cancelable suspend fun ignoreUserIds(userIds: List<String>)
/** /**
* Un-ignore some users * Un-ignore some users
*/ */
fun unIgnoreUserIds(userIds: List<String>, callback: MatrixCallback<Unit>): Cancelable suspend fun unIgnoreUserIds(userIds: List<String>)
} }

View File

@ -18,54 +18,35 @@ package org.matrix.android.sdk.internal.session.user
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.paging.PagedList 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.profile.ProfileService
import org.matrix.android.sdk.api.session.user.UserService 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.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.api.util.Optional
import org.matrix.android.sdk.internal.session.profile.GetProfileInfoTask 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.accountdata.UpdateIgnoredUserIdsTask
import org.matrix.android.sdk.internal.session.user.model.SearchUserTask 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 import javax.inject.Inject
internal class DefaultUserService @Inject constructor(private val userDataSource: UserDataSource, internal class DefaultUserService @Inject constructor(private val userDataSource: UserDataSource,
private val searchUserTask: SearchUserTask, private val searchUserTask: SearchUserTask,
private val updateIgnoredUserIdsTask: UpdateIgnoredUserIdsTask, private val updateIgnoredUserIdsTask: UpdateIgnoredUserIdsTask,
private val getProfileInfoTask: GetProfileInfoTask, private val getProfileInfoTask: GetProfileInfoTask) : UserService {
private val taskExecutor: TaskExecutor) : UserService {
override fun getUser(userId: String): User? { override fun getUser(userId: String): User? {
return userDataSource.getUser(userId) return userDataSource.getUser(userId)
} }
override fun resolveUser(userId: String, callback: MatrixCallback<User>) { override suspend fun resolveUser(userId: String): User {
val known = getUser(userId) val known = getUser(userId)
if (known != null) { if (known != null) {
callback.onSuccess(known) return known
} else { } else {
val params = GetProfileInfoTask.Params(userId) val params = GetProfileInfoTask.Params(userId)
getProfileInfoTask val data = getProfileInfoTask.execute(params)
.configureWith(params) { return User(
this.callback = object : MatrixCallback<JsonDict> { userId,
override fun onSuccess(data: JsonDict) { data[ProfileService.DISPLAY_NAME_KEY] as? String,
callback.onSuccess( data[ProfileService.AVATAR_URL_KEY] as? String)
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)
} }
} }
@ -85,33 +66,20 @@ internal class DefaultUserService @Inject constructor(private val userDataSource
return userDataSource.getIgnoredUsersLive() return userDataSource.getIgnoredUsersLive()
} }
override fun searchUsersDirectory(search: String, override suspend fun searchUsersDirectory(search: String,
limit: Int, limit: Int,
excludedUserIds: Set<String>, excludedUserIds: Set<String>): List<User> {
callback: MatrixCallback<List<User>>): Cancelable {
val params = SearchUserTask.Params(limit, search, excludedUserIds) val params = SearchUserTask.Params(limit, search, excludedUserIds)
return searchUserTask return searchUserTask.execute(params)
.configureWith(params) {
this.callback = callback
}
.executeBy(taskExecutor)
} }
override fun ignoreUserIds(userIds: List<String>, callback: MatrixCallback<Unit>): Cancelable { override suspend fun ignoreUserIds(userIds: List<String>) {
val params = UpdateIgnoredUserIdsTask.Params(userIdsToIgnore = userIds.toList()) val params = UpdateIgnoredUserIdsTask.Params(userIdsToIgnore = userIds.toList())
return updateIgnoredUserIdsTask updateIgnoredUserIdsTask.execute(params)
.configureWith(params) {
this.callback = callback
}
.executeBy(taskExecutor)
} }
override fun unIgnoreUserIds(userIds: List<String>, callback: MatrixCallback<Unit>): Cancelable { override suspend fun unIgnoreUserIds(userIds: List<String>) {
val params = UpdateIgnoredUserIdsTask.Params(userIdsToUnIgnore = userIds.toList()) val params = UpdateIgnoredUserIdsTask.Params(userIdsToUnIgnore = userIds.toList())
return updateIgnoredUserIdsTask updateIgnoredUserIdsTask.execute(params)
.configureWith(params) {
this.callback = callback
}
.executeBy(taskExecutor)
} }
} }

View File

@ -1275,15 +1275,15 @@ class RoomDetailViewModel @AssistedInject constructor(
return return
} }
session.ignoreUserIds(listOf(action.userId), object : MatrixCallback<Unit> { viewModelScope.launch {
override fun onSuccess(data: Unit) { val event = try {
_viewEvents.post(RoomDetailViewEvents.ActionSuccess(action)) session.ignoreUserIds(listOf(action.userId))
RoomDetailViewEvents.ActionSuccess(action)
} catch (failure: Throwable) {
RoomDetailViewEvents.ActionFailure(action, failure)
} }
_viewEvents.post(event)
override fun onFailure(failure: Throwable) { }
_viewEvents.post(RoomDetailViewEvents.ActionFailure(action, failure))
}
})
} }
private fun handleAcceptVerification(action: RoomDetailAction.AcceptVerificationRequest) { private fun handleAcceptVerification(action: RoomDetailAction.AcceptVerificationRequest) {

View File

@ -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.permalinks.PermalinkParser
import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.api.session.user.model.User
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
import org.matrix.android.sdk.internal.util.awaitCallback
class MatrixToBottomSheetViewModel @AssistedInject constructor( class MatrixToBottomSheetViewModel @AssistedInject constructor(
@Assisted initialState: MatrixToBottomSheetState, @Assisted initialState: MatrixToBottomSheetState,
@ -101,11 +100,7 @@ class MatrixToBottomSheetViewModel @AssistedInject constructor(
} }
private suspend fun resolveUser(userId: String): User { private suspend fun resolveUser(userId: String): User {
return tryOrNull { return tryOrNull { session.resolveUser(userId) }
awaitCallback<User> {
session.resolveUser(userId, it)
}
}
// Create raw user in case the user is not searchable // Create raw user in case the user is not searchable
?: User(userId, null, null) ?: User(userId, null, null)
} }

View File

@ -37,7 +37,6 @@ import io.reactivex.functions.BiFunction
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext 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.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.EventType 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 -> private fun handleIgnoreAction() = withState { state ->
val isIgnored = state.isIgnored() ?: return@withState val isIgnored = state.isIgnored() ?: return@withState
_viewEvents.post(RoomMemberProfileViewEvents.Loading()) _viewEvents.post(RoomMemberProfileViewEvents.Loading())
val ignoreActionCallback = object : MatrixCallback<Unit> { viewModelScope.launch {
override fun onSuccess(data: Unit) { val event = try {
_viewEvents.post(RoomMemberProfileViewEvents.OnIgnoreActionSuccess) if (isIgnored) {
session.unIgnoreUserIds(listOf(state.userId))
} else {
session.ignoreUserIds(listOf(state.userId))
}
RoomMemberProfileViewEvents.OnIgnoreActionSuccess
} catch (failure: Throwable) {
RoomMemberProfileViewEvents.Failure(failure)
} }
_viewEvents.post(event)
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)
} }
} }

View File

@ -16,6 +16,7 @@
package im.vector.app.features.settings.ignored package im.vector.app.features.settings.ignored
import androidx.lifecycle.viewModelScope
import com.airbnb.mvrx.Async import com.airbnb.mvrx.Async
import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.FragmentViewModelContext import com.airbnb.mvrx.FragmentViewModelContext
@ -30,7 +31,7 @@ import dagger.assisted.AssistedInject
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.platform.VectorViewModelAction 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.Session
import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.api.session.user.model.User
import org.matrix.android.sdk.rx.rx import org.matrix.android.sdk.rx.rx
@ -89,24 +90,14 @@ class IgnoredUsersViewModel @AssistedInject constructor(@Assisted initialState:
) )
} }
session.unIgnoreUserIds(listOf(action.userId), object : MatrixCallback<Unit> { viewModelScope.launch {
override fun onFailure(failure: Throwable) { val result = runCatching { session.unIgnoreUserIds(listOf(action.userId)) }
setState { setState {
copy( copy(
unIgnoreRequest = Fail(failure) unIgnoreRequest = result.fold(::Success, ::Fail)
) )
}
_viewEvents.post(IgnoredUsersViewEvents.Failure(failure))
} }
result.onFailure { _viewEvents.post(IgnoredUsersViewEvents.Failure(it)) }
override fun onSuccess(data: Unit) { }
setState {
copy(
unIgnoreRequest = Success(data)
)
}
}
})
} }
} }

View File

@ -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.permalinks.PermalinkParser
import org.matrix.android.sdk.api.session.user.model.User import org.matrix.android.sdk.api.session.user.model.User
import org.matrix.android.sdk.api.util.toMatrixItem import org.matrix.android.sdk.api.util.toMatrixItem
import org.matrix.android.sdk.internal.util.awaitCallback
class UserCodeSharedViewModel @AssistedInject constructor( class UserCodeSharedViewModel @AssistedInject constructor(
@Assisted val initialState: UserCodeState, @Assisted val initialState: UserCodeState,
@ -126,11 +125,7 @@ class UserCodeSharedViewModel @AssistedInject constructor(
_viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented))) _viewEvents.post(UserCodeShareViewEvents.ToastMessage(stringProvider.getString(R.string.not_implemented)))
} }
is PermalinkData.UserLink -> { is PermalinkData.UserLink -> {
val user = tryOrNull { val user = tryOrNull { session.resolveUser(linkedId.userId) }
awaitCallback<User> {
session.resolveUser(linkedId.userId, it)
}
}
// Create raw Uxid in case the user is not searchable // Create raw Uxid in case the user is not searchable
?: User(linkedId.userId, null, null) ?: User(linkedId.userId, null, null)