Migrate RoomDirectoryService to coroutines (#2449)
This commit is contained in:
parent
07d2d29212
commit
043ddcae2c
@ -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
|
||||||
|
@ -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 {
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user