Merge pull request #6054 from element-hq/feature/fga/room_list_coroutine_scope

sdk : allow passing coroutineScope to RoomList
This commit is contained in:
ganfra 2026-01-21 17:21:29 +01:00 committed by GitHub
commit d2bd1bb784
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
15 changed files with 83 additions and 35 deletions

View file

@ -8,7 +8,9 @@
package io.element.android.features.home.impl.search
import dev.zacsweers.metro.Inject
import dev.zacsweers.metro.Assisted
import dev.zacsweers.metro.AssistedFactory
import dev.zacsweers.metro.AssistedInject
import io.element.android.features.home.impl.datasource.RoomListRoomSummaryFactory
import io.element.android.features.home.impl.model.RoomListRoomSummary
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
@ -18,6 +20,7 @@ import io.element.android.libraries.matrix.api.roomlist.RoomListService
import io.element.android.libraries.matrix.api.roomlist.loadAllIncrementally
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.toImmutableList
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOn
@ -25,16 +28,23 @@ import kotlinx.coroutines.flow.map
private const val PAGE_SIZE = 30
@Inject
@AssistedInject
class RoomListSearchDataSource(
@Assisted coroutineScope: CoroutineScope,
roomListService: RoomListService,
coroutineDispatchers: CoroutineDispatchers,
private val roomSummaryFactory: RoomListRoomSummaryFactory,
) {
@AssistedFactory
interface Factory {
fun create(coroutineScope: CoroutineScope): RoomListSearchDataSource
}
private val roomList = roomListService.createRoomList(
pageSize = PAGE_SIZE,
initialFilter = RoomListFilter.None,
source = RoomList.Source.All,
coroutineScope = coroutineScope
)
val roomSummaries: Flow<ImmutableList<RoomListRoomSummary>> = roomList.filteredSummaries

View file

@ -16,6 +16,7 @@ import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import dev.zacsweers.metro.Inject
import io.element.android.libraries.architecture.Presenter
@ -23,7 +24,7 @@ import kotlinx.collections.immutable.persistentListOf
@Inject
class RoomListSearchPresenter(
private val dataSource: RoomListSearchDataSource,
private val dataSourceFactory: RoomListSearchDataSource.Factory,
) : Presenter<RoomListSearchState> {
@Composable
override fun present(): RoomListSearchState {
@ -33,6 +34,9 @@ class RoomListSearchPresenter(
}
val searchQuery = rememberTextFieldState()
val coroutineScope = rememberCoroutineScope()
val dataSource = remember { dataSourceFactory.create(coroutineScope) }
LaunchedEffect(isSearchActive) {
dataSource.setIsActive(isSearchActive)
}

View file

@ -20,6 +20,7 @@ import io.element.android.libraries.matrix.api.roomlist.RoomListService
import io.element.android.libraries.matrix.test.room.aRoomSummary
import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService
import io.element.android.tests.testutils.testCoroutineDispatchers
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runTest
import org.junit.Test
@ -122,13 +123,18 @@ fun TestScope.createRoomListSearchPresenter(
roomListService: RoomListService = FakeRoomListService(),
): RoomListSearchPresenter {
return RoomListSearchPresenter(
dataSource = RoomListSearchDataSource(
roomListService = roomListService,
roomSummaryFactory = aRoomListRoomSummaryFactory(
dateFormatter = FakeDateFormatter(),
roomLatestEventFormatter = FakeRoomLatestEventFormatter(),
),
coroutineDispatchers = testCoroutineDispatchers(),
),
dataSourceFactory = object : RoomListSearchDataSource.Factory {
override fun create(coroutineScope: CoroutineScope): RoomListSearchDataSource {
return RoomListSearchDataSource(
roomListService = roomListService,
roomSummaryFactory = aRoomListRoomSummaryFactory(
dateFormatter = FakeDateFormatter(),
roomLatestEventFormatter = FakeRoomLatestEventFormatter(),
),
coroutineDispatchers = testCoroutineDispatchers(),
coroutineScope = coroutineScope,
)
}
}
)
}