Add tests and clean code after RoomList Filter rework
This commit is contained in:
parent
0824a3ab8b
commit
9641d3ef4f
27 changed files with 325 additions and 161 deletions
|
|
@ -8,8 +8,6 @@
|
|||
|
||||
package io.element.android.libraries.matrix.api.roomlist
|
||||
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
* RoomList with dynamic filtering and loading.
|
||||
* This is useful for large lists of rooms.
|
||||
|
|
|
|||
|
|
@ -21,7 +21,6 @@ import kotlin.time.Duration
|
|||
* Can be retrieved from [RoomListService] methods.
|
||||
*/
|
||||
interface RoomList {
|
||||
|
||||
/**
|
||||
* The loading state of the room list.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -18,13 +18,11 @@ import kotlinx.coroutines.flow.Flow
|
|||
import kotlinx.coroutines.flow.buffer
|
||||
import kotlinx.coroutines.flow.callbackFlow
|
||||
import kotlinx.coroutines.flow.catch
|
||||
import kotlinx.coroutines.flow.launchIn
|
||||
import kotlinx.coroutines.flow.onEach
|
||||
import org.matrix.rustcomponents.sdk.Room
|
||||
import org.matrix.rustcomponents.sdk.RoomListDynamicEntriesController
|
||||
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind
|
||||
import org.matrix.rustcomponents.sdk.RoomListEntriesListener
|
||||
import org.matrix.rustcomponents.sdk.RoomListEntriesUpdate
|
||||
import org.matrix.rustcomponents.sdk.RoomListEntriesDynamicFilterKind
|
||||
import org.matrix.rustcomponents.sdk.RoomListInterface
|
||||
import org.matrix.rustcomponents.sdk.RoomListLoadingState
|
||||
import org.matrix.rustcomponents.sdk.RoomListLoadingStateListener
|
||||
|
|
|
|||
|
|
@ -90,8 +90,6 @@ internal class RoomListFactory(
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private fun RoomListLoadingState.toLoadingState(): RoomList.LoadingState {
|
||||
return when (this) {
|
||||
is RoomListLoadingState.Loaded -> RoomList.LoadingState.Loaded(maximumNumberOfRooms?.toInt() ?: 0)
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ import org.matrix.rustcomponents.sdk.RoomListFilterCategory
|
|||
* Mapper for converting RoomListFilter to Rust SDK filter kinds.
|
||||
*/
|
||||
internal object RoomListFilterMapper {
|
||||
|
||||
/**
|
||||
* Base rust filters to always apply across all room lists.
|
||||
* These filters ensure we show:
|
||||
|
|
|
|||
|
|
@ -27,7 +27,6 @@ internal class RustDynamicRoomList(
|
|||
private val dynamicController: () -> RoomListDynamicEntriesController?,
|
||||
private val addPagesCount: Int = DEFAULT_ADD_PAGES_COUNT
|
||||
) : DynamicRoomList {
|
||||
|
||||
private val mutex = Mutex()
|
||||
|
||||
override suspend fun rebuildSummaries() {
|
||||
|
|
|
|||
|
|
@ -13,31 +13,30 @@ import io.element.android.libraries.matrix.api.roomlist.RoomList
|
|||
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.getAndUpdate
|
||||
|
||||
data class SimplePagedRoomList(
|
||||
override val summaries: MutableStateFlow<List<RoomSummary>>,
|
||||
override val loadingState: StateFlow<RoomList.LoadingState>,
|
||||
private val currentFilter: MutableStateFlow<RoomListFilter>
|
||||
class FakeDynamicRoomList(
|
||||
override val summaries: MutableStateFlow<List<RoomSummary>> = MutableStateFlow(emptyList()),
|
||||
override val loadingState: MutableStateFlow<RoomList.LoadingState> = MutableStateFlow(RoomList.LoadingState.NotLoaded),
|
||||
override val pageSize: Int = Int.MAX_VALUE,
|
||||
val currentFilter: MutableStateFlow<RoomListFilter> = MutableStateFlow(RoomListFilter.None),
|
||||
private val loadMoreLambda: () -> Unit = {},
|
||||
private val resetLambda: () -> Unit = {},
|
||||
private val updateFilterLambda: (RoomListFilter) -> Unit = { filter -> currentFilter.value = filter },
|
||||
private val rebuildSummariesLambda: () -> Unit = {},
|
||||
) : DynamicRoomList {
|
||||
override val pageSize: Int = Int.MAX_VALUE
|
||||
private val loadedPages = MutableStateFlow(1)
|
||||
|
||||
override suspend fun loadMore() {
|
||||
// No-op
|
||||
loadedPages.getAndUpdate { it + 1 }
|
||||
loadMoreLambda()
|
||||
}
|
||||
|
||||
override suspend fun reset() {
|
||||
loadedPages.emit(1)
|
||||
resetLambda()
|
||||
}
|
||||
|
||||
override suspend fun updateFilter(filter: RoomListFilter) {
|
||||
currentFilter.emit(filter)
|
||||
updateFilterLambda(filter)
|
||||
}
|
||||
|
||||
override suspend fun rebuildSummaries() {
|
||||
// No-op
|
||||
rebuildSummariesLambda()
|
||||
}
|
||||
}
|
||||
|
|
@ -11,29 +11,19 @@ package io.element.android.libraries.matrix.test.roomlist
|
|||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.roomlist.DynamicRoomList
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomList
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomListFilter
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
|
||||
class FakeRoomListService(
|
||||
var subscribeToVisibleRoomsLambda: (List<RoomId>) -> Unit = {},
|
||||
private val subscribeToVisibleRoomsLambda: (List<RoomId>) -> Unit = {},
|
||||
private val createRoomListLambda: (pageSize: Int) -> DynamicRoomList = { pageSize -> FakeDynamicRoomList(pageSize = pageSize) },
|
||||
override val allRooms: RoomList = createRoomListLambda(Int.MAX_VALUE),
|
||||
) : RoomListService {
|
||||
private val allRoomSummariesFlow = MutableStateFlow<List<RoomSummary>>(emptyList())
|
||||
private val allRoomsLoadingStateFlow = MutableStateFlow<RoomList.LoadingState>(RoomList.LoadingState.NotLoaded)
|
||||
private val roomListStateFlow = MutableStateFlow<RoomListService.State>(RoomListService.State.Idle)
|
||||
private val syncIndicatorStateFlow = MutableStateFlow<RoomListService.SyncIndicator>(RoomListService.SyncIndicator.Hide)
|
||||
|
||||
suspend fun postAllRooms(roomSummaries: List<RoomSummary>) {
|
||||
allRoomSummariesFlow.emit(roomSummaries)
|
||||
}
|
||||
|
||||
suspend fun postAllRoomsLoadingState(loadingState: RoomList.LoadingState) {
|
||||
allRoomsLoadingStateFlow.emit(loadingState)
|
||||
}
|
||||
|
||||
suspend fun postState(state: RoomListService.State) {
|
||||
roomListStateFlow.emit(state)
|
||||
}
|
||||
|
|
@ -46,22 +36,12 @@ class FakeRoomListService(
|
|||
pageSize: Int,
|
||||
source: RoomList.Source,
|
||||
coroutineScope: CoroutineScope,
|
||||
): DynamicRoomList {
|
||||
return when (source) {
|
||||
RoomList.Source.All -> allRooms
|
||||
}
|
||||
}
|
||||
) = createRoomListLambda(pageSize)
|
||||
|
||||
override suspend fun subscribeToVisibleRooms(roomIds: List<RoomId>) {
|
||||
subscribeToVisibleRoomsLambda(roomIds)
|
||||
}
|
||||
|
||||
override val allRooms = SimplePagedRoomList(
|
||||
allRoomSummariesFlow,
|
||||
allRoomsLoadingStateFlow,
|
||||
MutableStateFlow(RoomListFilter.all())
|
||||
)
|
||||
|
||||
override val state: StateFlow<RoomListService.State> = roomListStateFlow
|
||||
|
||||
override val syncIndicator: StateFlow<RoomListService.SyncIndicator> = syncIndicatorStateFlow
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue