Migrate RoomDirectoryService to coroutines (#2449)

This commit is contained in:
Benoit Marty 2021-03-08 13:30:24 +01:00
parent 07d2d29212
commit 043ddcae2c
3 changed files with 54 additions and 62 deletions

View File

@ -16,11 +16,9 @@
package org.matrix.android.sdk.api.session.room package org.matrix.android.sdk.api.session.room
import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse
import org.matrix.android.sdk.api.util.Cancelable
/** /**
* This interface defines methods to get and join public rooms. It's implemented at the session level. * This interface defines methods to get and join public rooms. It's implemented at the session level.
@ -30,9 +28,8 @@ interface RoomDirectoryService {
/** /**
* Get rooms from directory * Get rooms from directory
*/ */
fun getPublicRooms(server: String?, suspend fun getPublicRooms(server: String?,
publicRoomsParams: PublicRoomsParams, publicRoomsParams: PublicRoomsParams): PublicRoomsResponse
callback: MatrixCallback<PublicRoomsResponse>): Cancelable
/** /**
* Get the visibility of a room in the directory * Get the visibility of a room in the directory

View File

@ -16,33 +16,24 @@
package org.matrix.android.sdk.internal.session.room package org.matrix.android.sdk.internal.session.room
import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.session.room.RoomDirectoryService import org.matrix.android.sdk.api.session.room.RoomDirectoryService
import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse
import org.matrix.android.sdk.api.util.Cancelable
import org.matrix.android.sdk.internal.session.room.directory.GetPublicRoomTask import org.matrix.android.sdk.internal.session.room.directory.GetPublicRoomTask
import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask import org.matrix.android.sdk.internal.session.room.directory.GetRoomDirectoryVisibilityTask
import org.matrix.android.sdk.internal.session.room.directory.SetRoomDirectoryVisibilityTask import org.matrix.android.sdk.internal.session.room.directory.SetRoomDirectoryVisibilityTask
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 DefaultRoomDirectoryService @Inject constructor( internal class DefaultRoomDirectoryService @Inject constructor(
private val getPublicRoomTask: GetPublicRoomTask, private val getPublicRoomTask: GetPublicRoomTask,
private val getRoomDirectoryVisibilityTask: GetRoomDirectoryVisibilityTask, private val getRoomDirectoryVisibilityTask: GetRoomDirectoryVisibilityTask,
private val setRoomDirectoryVisibilityTask: SetRoomDirectoryVisibilityTask, private val setRoomDirectoryVisibilityTask: SetRoomDirectoryVisibilityTask
private val taskExecutor: TaskExecutor) : RoomDirectoryService { ) : RoomDirectoryService {
override fun getPublicRooms(server: String?, override suspend fun getPublicRooms(server: String?,
publicRoomsParams: PublicRoomsParams, publicRoomsParams: PublicRoomsParams): PublicRoomsResponse {
callback: MatrixCallback<PublicRoomsResponse>): Cancelable { return getPublicRoomTask.execute(GetPublicRoomTask.Params(server, publicRoomsParams))
return getPublicRoomTask
.configureWith(GetPublicRoomTask.Params(server, publicRoomsParams)) {
this.callback = callback
}
.executeBy(taskExecutor)
} }
override suspend fun getRoomDirectoryVisibility(roomId: String): RoomDirectoryVisibility { override suspend fun getRoomDirectoryVisibility(roomId: String): RoomDirectoryVisibility {

View File

@ -16,6 +16,7 @@
package im.vector.app.features.roomdirectory package im.vector.app.features.roomdirectory
import androidx.lifecycle.viewModelScope
import com.airbnb.mvrx.ActivityViewModelContext import com.airbnb.mvrx.ActivityViewModelContext
import com.airbnb.mvrx.Fail import com.airbnb.mvrx.Fail
import com.airbnb.mvrx.Loading import com.airbnb.mvrx.Loading
@ -24,9 +25,11 @@ import com.airbnb.mvrx.Success
import com.airbnb.mvrx.ViewModelContext import com.airbnb.mvrx.ViewModelContext
import com.airbnb.mvrx.appendAt import com.airbnb.mvrx.appendAt
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import dagger.assisted.AssistedFactory import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModel
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.failure.Failure
@ -34,10 +37,8 @@ import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsFilter import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsFilter
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsParams
import org.matrix.android.sdk.api.session.room.model.roomdirectory.PublicRoomsResponse
import org.matrix.android.sdk.api.session.room.model.thirdparty.RoomDirectoryData import org.matrix.android.sdk.api.session.room.model.thirdparty.RoomDirectoryData
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
import org.matrix.android.sdk.api.util.Cancelable
import org.matrix.android.sdk.rx.rx import org.matrix.android.sdk.rx.rx
import timber.log.Timber import timber.log.Timber
@ -63,7 +64,7 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState:
private var since: String? = null private var since: String? = null
private var currentTask: Cancelable? = null private var currentJob: Job? = null
init { init {
// Observe joined room (from the sync) // Observe joined room (from the sync)
@ -122,7 +123,7 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState:
private fun filterWith(action: RoomDirectoryAction.FilterWith) = withState { state -> private fun filterWith(action: RoomDirectoryAction.FilterWith) = withState { state ->
if (state.currentFilter != action.filter) { if (state.currentFilter != action.filter) {
currentTask?.cancel() currentJob?.cancel()
reset(action.filter) reset(action.filter)
load(action.filter, state.roomDirectoryData) load(action.filter, state.roomDirectoryData)
@ -144,7 +145,7 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState:
} }
private fun loadMore() = withState { state -> private fun loadMore() = withState { state ->
if (currentTask == null) { if (currentJob == null) {
setState { setState {
copy( copy(
asyncPublicRoomsRequest = Loading() asyncPublicRoomsRequest = Loading()
@ -155,47 +156,50 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState:
} }
private fun load(filter: String, roomDirectoryData: RoomDirectoryData) { private fun load(filter: String, roomDirectoryData: RoomDirectoryData) {
currentTask = session.getPublicRooms(roomDirectoryData.homeServer, currentJob = viewModelScope.launch {
PublicRoomsParams( val data = try {
limit = PUBLIC_ROOMS_LIMIT, session.getPublicRooms(roomDirectoryData.homeServer,
filter = PublicRoomsFilter(searchTerm = filter), PublicRoomsParams(
includeAllNetworks = roomDirectoryData.includeAllNetworks, limit = PUBLIC_ROOMS_LIMIT,
since = since, filter = PublicRoomsFilter(searchTerm = filter),
thirdPartyInstanceId = roomDirectoryData.thirdPartyInstanceId includeAllNetworks = roomDirectoryData.includeAllNetworks,
), since = since,
object : MatrixCallback<PublicRoomsResponse> { thirdPartyInstanceId = roomDirectoryData.thirdPartyInstanceId
override fun onSuccess(data: PublicRoomsResponse) { )
currentTask = null )
} catch (failure: Throwable) {
if (failure is Failure.Cancelled) {
// Ignore, another request should be already started
return@launch
}
since = data.nextBatch currentJob = null
setState { setState {
copy( copy(
asyncPublicRoomsRequest = Success(Unit), asyncPublicRoomsRequest = Fail(failure)
// It's ok to append at the end of the list, so I use publicRooms.size() )
publicRooms = publicRooms.appendAt(data.chunk!!, publicRooms.size) }
// Rageshake #8206 tells that we can have several times the same room null
.distinctBy { it.roomId }, }
hasMore = since != null
)
}
}
override fun onFailure(failure: Throwable) { data ?: return@launch
if (failure is Failure.Cancelled) {
// Ignore, another request should be already started
return
}
currentTask = null currentJob = null
setState { since = data.nextBatch
copy(
asyncPublicRoomsRequest = Fail(failure) setState {
) copy(
} asyncPublicRoomsRequest = Success(Unit),
} // It's ok to append at the end of the list, so I use publicRooms.size()
}) publicRooms = publicRooms.appendAt(data.chunk!!, publicRooms.size)
// Rageshake #8206 tells that we can have several times the same room
.distinctBy { it.roomId },
hasMore = since != null
)
}
}
} }
private fun joinRoom(action: RoomDirectoryAction.JoinRoom) = withState { state -> private fun joinRoom(action: RoomDirectoryAction.JoinRoom) = withState { state ->
@ -222,7 +226,7 @@ class RoomDirectoryViewModel @AssistedInject constructor(@Assisted initialState:
} }
override fun onCleared() { override fun onCleared() {
currentTask?.cancel() currentJob?.cancel()
super.onCleared() super.onCleared()
} }
} }