Convert UserService to suspend functions

Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
This commit is contained in:
Dominic Fischer 2020-11-08 13:52:09 +00:00
parent 2045a164c1
commit b9b755e6e1
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.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<String>): Single<List<User>> = singleBuilder {
session.searchUsersDirectory(search, limit, excludedUserIds, it)
excludedUserIds: Set<String>): Single<List<User>> = rxSingle {
session.searchUsersDirectory(search, limit, excludedUserIds)
}
fun joinRoom(roomIdOrAlias: String,

View File

@ -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<User>)
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<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
@ -79,10 +76,10 @@ interface UserService {
/**
* Ignore users
*/
fun ignoreUserIds(userIds: List<String>, callback: MatrixCallback<Unit>): Cancelable
suspend fun ignoreUserIds(userIds: List<String>)
/**
* 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.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<User>) {
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<JsonDict> {
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<String>,
callback: MatrixCallback<List<User>>): Cancelable {
override suspend fun searchUsersDirectory(search: String,
limit: Int,
excludedUserIds: Set<String>): List<User> {
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<String>, callback: MatrixCallback<Unit>): Cancelable {
override suspend fun ignoreUserIds(userIds: List<String>) {
val params = UpdateIgnoredUserIdsTask.Params(userIdsToIgnore = userIds.toList())
return updateIgnoredUserIdsTask
.configureWith(params) {
this.callback = callback
}
.executeBy(taskExecutor)
updateIgnoredUserIdsTask.execute(params)
}
override fun unIgnoreUserIds(userIds: List<String>, callback: MatrixCallback<Unit>): Cancelable {
override suspend fun unIgnoreUserIds(userIds: List<String>) {
val params = UpdateIgnoredUserIdsTask.Params(userIdsToUnIgnore = userIds.toList())
return updateIgnoredUserIdsTask
.configureWith(params) {
this.callback = callback
}
.executeBy(taskExecutor)
updateIgnoredUserIdsTask.execute(params)
}
}

View File

@ -1275,15 +1275,15 @@ class RoomDetailViewModel @AssistedInject constructor(
return
}
session.ignoreUserIds(listOf(action.userId), object : MatrixCallback<Unit> {
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) {

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.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<User> {
session.resolveUser(userId, it)
}
}
return tryOrNull { session.resolveUser(userId) }
// Create raw user in case the user is not searchable
?: User(userId, null, null)
}

View File

@ -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<Unit> {
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)
}
}

View File

@ -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<Unit> {
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)) }
}
}
}

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.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<User> {
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)