Introduce SelectionMode enum
This commit is contained in:
parent
195af44391
commit
0bdf0c1692
8 changed files with 27 additions and 16 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 = {}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue