Introduce SelectionMode enum

This commit is contained in:
Florian Renaud 2023-03-22 11:35:07 +01:00
parent 195af44391
commit 0bdf0c1692
8 changed files with 27 additions and 16 deletions

View file

@ -19,6 +19,7 @@ package io.element.android.features.createroom.impl.addpeople
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import io.element.android.features.selectusers.api.SelectUsersPresenter import io.element.android.features.selectusers.api.SelectUsersPresenter
import io.element.android.features.selectusers.api.SelectUsersPresenterArgs import io.element.android.features.selectusers.api.SelectUsersPresenterArgs
import io.element.android.features.selectusers.api.SelectionMode
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import javax.inject.Inject import javax.inject.Inject
@ -27,7 +28,7 @@ class AddPeoplePresenter @Inject constructor(
) : Presenter<AddPeopleState> { ) : Presenter<AddPeopleState> {
private val selectUsersPresenter by lazy { private val selectUsersPresenter by lazy {
selectUsersPresenterFactory.create(SelectUsersPresenterArgs(isMultiSelectionEnabled = true)) selectUsersPresenterFactory.create(SelectUsersPresenterArgs(SelectionMode.Multiple))
} }
@Composable @Composable

View file

@ -17,6 +17,7 @@
package io.element.android.features.createroom.impl.addpeople package io.element.android.features.createroom.impl.addpeople
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.features.selectusers.api.SelectionMode
import io.element.android.features.selectusers.api.aSelectUsersState import io.element.android.features.selectusers.api.aSelectUsersState
import io.element.android.features.selectusers.api.aSetOfSelectedUsers import io.element.android.features.selectusers.api.aSetOfSelectedUsers
@ -27,14 +28,14 @@ open class AddPeopleStateProvider : PreviewParameterProvider<AddPeopleState> {
aAddPeopleState().copy( aAddPeopleState().copy(
selectUsersState = aSelectUsersState().copy( selectUsersState = aSelectUsersState().copy(
selectedUsers = aSetOfSelectedUsers(), selectedUsers = aSetOfSelectedUsers(),
isMultiSelectionEnabled = true, selectionMode = SelectionMode.Multiple,
) )
), ),
aAddPeopleState().copy( aAddPeopleState().copy(
selectUsersState = aSelectUsersState().copy( selectUsersState = aSelectUsersState().copy(
selectedUsers = aSetOfSelectedUsers(), selectedUsers = aSetOfSelectedUsers(),
isSearchActive = true, isSearchActive = true,
isMultiSelectionEnabled = true, selectionMode = SelectionMode.Multiple,
) )
) )
) )

View file

@ -19,6 +19,7 @@ package io.element.android.features.createroom.impl.root
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import io.element.android.features.selectusers.api.SelectUsersPresenter import io.element.android.features.selectusers.api.SelectUsersPresenter
import io.element.android.features.selectusers.api.SelectUsersPresenterArgs import io.element.android.features.selectusers.api.SelectUsersPresenterArgs
import io.element.android.features.selectusers.api.SelectionMode
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.matrix.ui.model.MatrixUser import io.element.android.libraries.matrix.ui.model.MatrixUser
import timber.log.Timber import timber.log.Timber
@ -29,7 +30,7 @@ class CreateRoomRootPresenter @Inject constructor(
) : Presenter<CreateRoomRootState> { ) : Presenter<CreateRoomRootState> {
private val presenter by lazy { private val presenter by lazy {
presenterFactory.create(SelectUsersPresenterArgs(isMultiSelectionEnabled = false)) presenterFactory.create(SelectUsersPresenterArgs(SelectionMode.Single))
} }
@Composable @Composable

View file

@ -17,5 +17,10 @@
package io.element.android.features.selectusers.api package io.element.android.features.selectusers.api
data class SelectUsersPresenterArgs( data class SelectUsersPresenterArgs(
val isMultiSelectionEnabled: Boolean, val selectionMode: SelectionMode,
) )
enum class SelectionMode {
Single,
Multiple,
}

View file

@ -27,6 +27,8 @@ data class SelectUsersState(
val selectedUsers: ImmutableSet<MatrixUser>, val selectedUsers: ImmutableSet<MatrixUser>,
val selectedUsersListState: LazyListState, val selectedUsersListState: LazyListState,
val isSearchActive: Boolean, val isSearchActive: Boolean,
val isMultiSelectionEnabled: Boolean, val selectionMode: SelectionMode,
val eventSink: (SelectUsersEvents) -> Unit, val eventSink: (SelectUsersEvents) -> Unit,
) ) {
val isMultiSelectionEnabled = selectionMode == SelectionMode.Multiple
}

View file

@ -30,11 +30,11 @@ open class SelectUsersStateProvider : PreviewParameterProvider<SelectUsersState>
aSelectUsersState().copy( aSelectUsersState().copy(
isSearchActive = false, isSearchActive = false,
selectedUsers = aSetOfSelectedUsers(), selectedUsers = aSetOfSelectedUsers(),
isMultiSelectionEnabled = true selectionMode = SelectionMode.Multiple,
), ),
aSelectUsersState().copy(isSearchActive = true), aSelectUsersState().copy(isSearchActive = true),
aSelectUsersState().copy(isSearchActive = true, searchQuery = "someone"), aSelectUsersState().copy(isSearchActive = true, searchQuery = "someone"),
aSelectUsersState().copy(isSearchActive = true, searchQuery = "someone", isMultiSelectionEnabled = true), aSelectUsersState().copy(isSearchActive = true, searchQuery = "someone", selectionMode = SelectionMode.Multiple),
aSelectUsersState().copy( aSelectUsersState().copy(
isSearchActive = true, isSearchActive = true,
searchQuery = "@someone:matrix.org", searchQuery = "@someone:matrix.org",
@ -44,7 +44,7 @@ open class SelectUsersStateProvider : PreviewParameterProvider<SelectUsersState>
aSelectUsersState().copy( aSelectUsersState().copy(
isSearchActive = true, isSearchActive = true,
searchQuery = "@someone:matrix.org", searchQuery = "@someone:matrix.org",
isMultiSelectionEnabled = true, selectionMode = SelectionMode.Multiple,
selectedUsers = aSetOfSelectedUsers(), selectedUsers = aSetOfSelectedUsers(),
searchResults = aListOfResults(), searchResults = aListOfResults(),
) )
@ -60,7 +60,7 @@ fun aSelectUsersState() = SelectUsersState(
firstVisibleItemIndex = 0, firstVisibleItemIndex = 0,
firstVisibleItemScrollOffset = 0, firstVisibleItemScrollOffset = 0,
), ),
isMultiSelectionEnabled = false, selectionMode = SelectionMode.Single,
eventSink = {} eventSink = {}
) )

View file

@ -102,7 +102,7 @@ class DefaultSelectUsersPresenter @AssistedInject constructor(
selectedUsers = selectedUsers.value.reversed().toImmutableSet(), selectedUsers = selectedUsers.value.reversed().toImmutableSet(),
selectedUsersListState = selectedUsersListState, selectedUsersListState = selectedUsersListState,
isSearchActive = isSearchActive, isSearchActive = isSearchActive,
isMultiSelectionEnabled = args.isMultiSelectionEnabled, selectionMode = args.selectionMode,
eventSink = ::handleEvents, eventSink = ::handleEvents,
) )
} }

View file

@ -23,6 +23,7 @@ import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import io.element.android.features.selectusers.api.SelectUsersEvents import io.element.android.features.selectusers.api.SelectUsersEvents
import io.element.android.features.selectusers.api.SelectUsersPresenterArgs import io.element.android.features.selectusers.api.SelectUsersPresenterArgs
import io.element.android.features.selectusers.api.SelectionMode
import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.core.UserId
import io.element.android.libraries.matrix.ui.components.aMatrixUser import io.element.android.libraries.matrix.ui.components.aMatrixUser
import io.element.android.libraries.matrix.ui.model.MatrixUser import io.element.android.libraries.matrix.ui.model.MatrixUser
@ -37,7 +38,7 @@ class DefaultSelectUsersPresenterTests {
@Test @Test
fun `present - initial state for single selection`() = runTest { fun `present - initial state for single selection`() = runTest {
val presenter = DefaultSelectUsersPresenter(SelectUsersPresenterArgs(isMultiSelectionEnabled = false)) val presenter = DefaultSelectUsersPresenter(SelectUsersPresenterArgs(SelectionMode.Single))
moleculeFlow(RecompositionClock.Immediate) { moleculeFlow(RecompositionClock.Immediate) {
presenter.present() presenter.present()
}.test { }.test {
@ -52,7 +53,7 @@ class DefaultSelectUsersPresenterTests {
@Test @Test
fun `present - initial state for multiple selection`() = runTest { fun `present - initial state for multiple selection`() = runTest {
val presenter = DefaultSelectUsersPresenter(SelectUsersPresenterArgs(isMultiSelectionEnabled = true)) val presenter = DefaultSelectUsersPresenter(SelectUsersPresenterArgs(SelectionMode.Multiple))
moleculeFlow(RecompositionClock.Immediate) { moleculeFlow(RecompositionClock.Immediate) {
presenter.present() presenter.present()
}.test { }.test {
@ -67,7 +68,7 @@ class DefaultSelectUsersPresenterTests {
@Test @Test
fun `present - update search query`() = runTest { fun `present - update search query`() = runTest {
val presenter = DefaultSelectUsersPresenter(SelectUsersPresenterArgs(isMultiSelectionEnabled = false)) val presenter = DefaultSelectUsersPresenter(SelectUsersPresenterArgs(SelectionMode.Single))
moleculeFlow(RecompositionClock.Immediate) { moleculeFlow(RecompositionClock.Immediate) {
presenter.present() presenter.present()
}.test { }.test {
@ -96,7 +97,7 @@ class DefaultSelectUsersPresenterTests {
mockkConstructor(LazyListState::class) mockkConstructor(LazyListState::class)
coJustRun { anyConstructed<LazyListState>().scrollToItem(index = any()) } coJustRun { anyConstructed<LazyListState>().scrollToItem(index = any()) }
val presenter = DefaultSelectUsersPresenter(SelectUsersPresenterArgs(isMultiSelectionEnabled = false)) val presenter = DefaultSelectUsersPresenter(SelectUsersPresenterArgs(SelectionMode.Single))
moleculeFlow(RecompositionClock.Immediate) { moleculeFlow(RecompositionClock.Immediate) {
presenter.present() presenter.present()
}.test { }.test {