From e63cb7373d67bbab81a3fb2598c44dd463e8855f Mon Sep 17 00:00:00 2001 From: Maxime NATUREL <46314705+mnaturel@users.noreply.github.com> Date: Wed, 15 Mar 2023 17:23:15 +0100 Subject: [PATCH] Using qualifier annotation for bindings of SelectUsersPresenter --- .../impl/addpeople/AddPeopleEvents.kt | 7 +----- .../impl/addpeople/AddPeopleNode.kt | 4 ++-- .../impl/addpeople/AddPeoplePresenter.kt | 22 ++++++++--------- .../impl/addpeople/AddPeopleState.kt | 5 ++-- .../impl/addpeople/AddPeopleStateProvider.kt | 20 +++++++++------- .../impl/addpeople/AddPeopleView.kt | 14 +++++------ .../impl/root/CreateRoomRootPresenter.kt | 9 ++++--- .../selectusers/api/SelectUsersPresenter.kt | 24 +++++++++++++++++++ .../DefaultSelectMultipleUsersPresenter.kt | 13 +++++----- .../impl/DefaultSelectSingleUserPresenter.kt | 12 +++++----- .../impl/DefaultSelectUsersPresenter.kt | 6 ++--- 11 files changed, 79 insertions(+), 57 deletions(-) create mode 100644 features/selectusers/api/src/main/kotlin/io/element/android/features/selectusers/api/SelectUsersPresenter.kt diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleEvents.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleEvents.kt index c7ce6308e1..5d246be501 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleEvents.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleEvents.kt @@ -16,9 +16,4 @@ package io.element.android.features.createroom.impl.addpeople -import io.element.android.libraries.matrix.ui.model.MatrixUser -import kotlinx.collections.immutable.ImmutableList - -sealed interface AddPeopleEvents { - data class UpdateSelection(val users: ImmutableList) : AddPeopleEvents -} +sealed interface AddPeopleEvents diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt index 751ab7c53f..5393075d18 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleNode.kt @@ -24,9 +24,9 @@ import com.bumble.appyx.core.plugin.Plugin import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.element.android.anvilannotations.ContributesNode -import io.element.android.libraries.di.AppScope +import io.element.android.libraries.di.SessionScope -@ContributesNode(AppScope::class) +@ContributesNode(SessionScope::class) class AddPeopleNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenter.kt index 4cca64b4dd..23eb9adbec 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeoplePresenter.kt @@ -17,30 +17,28 @@ package io.element.android.features.createroom.impl.addpeople import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import io.element.android.features.selectusers.api.MULTI_SELECTION_USERS_VARIANT +import io.element.android.features.selectusers.api.SelectUsersPresenter import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.matrix.ui.model.MatrixUser -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.persistentListOf import javax.inject.Inject +import javax.inject.Named // TODO add unit tests -class AddPeoplePresenter @Inject constructor() : Presenter { +class AddPeoplePresenter @Inject constructor( + @Named(MULTI_SELECTION_USERS_VARIANT) + private val selectUsersPresenter: SelectUsersPresenter, +) : Presenter { @Composable override fun present(): AddPeopleState { - val selectedUsers: MutableState> = remember { mutableStateOf(persistentListOf(aMatrixUser("test"))) } + val selectUsersState = selectUsersPresenter.present() fun handleEvents(event: AddPeopleEvents) { - when (event) { - is AddPeopleEvents.UpdateSelection -> selectedUsers.value = event.users - } + // do nothing for now } return AddPeopleState( - selectedUsers = selectedUsers.value, + selectUsersState = selectUsersState, eventSink = ::handleEvents, ) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleState.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleState.kt index 6214e2259a..8212d02cc4 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleState.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleState.kt @@ -16,10 +16,9 @@ package io.element.android.features.createroom.impl.addpeople -import io.element.android.libraries.matrix.ui.model.MatrixUser -import kotlinx.collections.immutable.ImmutableList +import io.element.android.features.selectusers.api.SelectUsersState data class AddPeopleState( - val selectedUsers: ImmutableList, + val selectUsersState: SelectUsersState, val eventSink: (AddPeopleEvents) -> Unit, ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleStateProvider.kt index 7d7c1851ff..fc4f4d2648 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleStateProvider.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleStateProvider.kt @@ -17,27 +17,31 @@ package io.element.android.features.createroom.impl.addpeople import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.features.selectusers.api.aSelectUsersState +import io.element.android.features.selectusers.api.aSetOfSelectedUsers import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.ui.model.MatrixUser -import kotlinx.collections.immutable.persistentListOf open class AddPeopleStateProvider : PreviewParameterProvider { override val values: Sequence get() = sequenceOf( aAddPeopleState(), aAddPeopleState().copy( - selectedUsers = persistentListOf( - aMatrixUser(userName = ""), - aMatrixUser(userName = "User"), - aMatrixUser(userName = "User with long name"), - ) + selectUsersState = aSelectUsersState().copy(selectedUsers = aSetOfSelectedUsers()) + ), + aAddPeopleState(isSearchActive = true), + aAddPeopleState(isSearchActive = true).copy( + selectUsersState = aSelectUsersState().copy(selectedUsers = aSetOfSelectedUsers()) ) ) } -fun aAddPeopleState() = AddPeopleState( - selectedUsers = persistentListOf(), +fun aAddPeopleState(isSearchActive: Boolean = false) = AddPeopleState( + selectUsersState = aSelectUsersState().copy( + isMultiSelectionEnabled = true, + isSearchActive = isSearchActive, + ), eventSink = {} ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt index 62e935079a..acecb7bb95 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/addpeople/AddPeopleView.kt @@ -18,13 +18,10 @@ package io.element.android.features.createroom.impl.addpeople import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -32,6 +29,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import io.element.android.features.selectusers.api.SelectUsersView import io.element.android.libraries.designsystem.components.button.BackButton import io.element.android.libraries.designsystem.preview.ElementPreviewDark import io.element.android.libraries.designsystem.preview.ElementPreviewLight @@ -49,13 +47,12 @@ fun AddPeopleView( onBackPressed: () -> Unit = {}, onNextPressed: () -> Unit = {}, ) { - var isSearchActive by rememberSaveable { mutableStateOf(false) } val eventSink = state.eventSink Scaffold( topBar = { AddPeopleViewTopBar( - hasSelectedUsers = state.selectedUsers.isNotEmpty(), + hasSelectedUsers = state.selectUsersState.selectedUsers.isNotEmpty(), onBackPressed = onBackPressed, onNextPressed = onNextPressed, ) @@ -66,7 +63,10 @@ fun AddPeopleView( .fillMaxSize() .padding(padding), ) { - // TODO use reusable searchUser bar with multi selection + SelectUsersView( + modifier = Modifier.fillMaxWidth(), + state = state.selectUsersState, + ) } } } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt index 9c29bbf576..b7bca3a564 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/root/CreateRoomRootPresenter.kt @@ -17,19 +17,22 @@ package io.element.android.features.createroom.impl.root import androidx.compose.runtime.Composable -import io.element.android.features.selectusers.api.SelectSingleUserPresenter +import io.element.android.features.selectusers.api.SINGLE_SELECTION_USERS_VARIANT +import io.element.android.features.selectusers.api.SelectUsersPresenter import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.ui.model.MatrixUser import timber.log.Timber import javax.inject.Inject +import javax.inject.Named class CreateRoomRootPresenter @Inject constructor( - private val selectSingleUserPresenter: SelectSingleUserPresenter, + @Named(SINGLE_SELECTION_USERS_VARIANT) + private val selectUsersPresenter: SelectUsersPresenter, ) : Presenter { @Composable override fun present(): CreateRoomRootState { - val selectUsersState = selectSingleUserPresenter.present() + val selectUsersState = selectUsersPresenter.present() fun handleEvents(event: CreateRoomRootEvents) { when (event) { diff --git a/features/selectusers/api/src/main/kotlin/io/element/android/features/selectusers/api/SelectUsersPresenter.kt b/features/selectusers/api/src/main/kotlin/io/element/android/features/selectusers/api/SelectUsersPresenter.kt new file mode 100644 index 0000000000..913815c698 --- /dev/null +++ b/features/selectusers/api/src/main/kotlin/io/element/android/features/selectusers/api/SelectUsersPresenter.kt @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2023 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.element.android.features.selectusers.api + +import io.element.android.libraries.architecture.Presenter + +const val SINGLE_SELECTION_USERS_VARIANT = "single_selection_users" +const val MULTI_SELECTION_USERS_VARIANT = "multi_selection_users" + +interface SelectUsersPresenter : Presenter diff --git a/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectMultipleUsersPresenter.kt b/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectMultipleUsersPresenter.kt index 7e6628e878..9cc948d62f 100644 --- a/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectMultipleUsersPresenter.kt +++ b/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectMultipleUsersPresenter.kt @@ -17,17 +17,18 @@ package io.element.android.features.selectusers.impl import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.selectusers.api.SelectMultipleUsersPresenter +import io.element.android.features.selectusers.api.MULTI_SELECTION_USERS_VARIANT +import io.element.android.features.selectusers.api.SelectUsersPresenter import io.element.android.libraries.di.SessionScope import javax.inject.Inject +import javax.inject.Named // TODO add unit tests @ContributesBinding( scope = SessionScope::class, - boundType = SelectMultipleUsersPresenter::class, + boundType = SelectUsersPresenter::class ) +@Named(MULTI_SELECTION_USERS_VARIANT) class DefaultSelectMultipleUsersPresenter @Inject constructor() : - DefaultSelectUsersPresenter, - SelectMultipleUsersPresenter { - override val isMultiSelectionEnabled: Boolean = true -} + SelectUsersPresenter by DefaultSelectUsersPresenter(isMultiSelectionEnabled = true) + diff --git a/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectSingleUserPresenter.kt b/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectSingleUserPresenter.kt index e4fb82acb4..ea538e0e39 100644 --- a/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectSingleUserPresenter.kt +++ b/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectSingleUserPresenter.kt @@ -17,16 +17,16 @@ package io.element.android.features.selectusers.impl import com.squareup.anvil.annotations.ContributesBinding -import io.element.android.features.selectusers.api.SelectSingleUserPresenter +import io.element.android.features.selectusers.api.SINGLE_SELECTION_USERS_VARIANT +import io.element.android.features.selectusers.api.SelectUsersPresenter import io.element.android.libraries.di.SessionScope import javax.inject.Inject +import javax.inject.Named @ContributesBinding( scope = SessionScope::class, - boundType = SelectSingleUserPresenter::class, + boundType = SelectUsersPresenter::class ) +@Named(SINGLE_SELECTION_USERS_VARIANT) class DefaultSelectSingleUserPresenter @Inject constructor() : - DefaultSelectUsersPresenter, - SelectSingleUserPresenter { - override val isMultiSelectionEnabled: Boolean = false -} + SelectUsersPresenter by DefaultSelectUsersPresenter(isMultiSelectionEnabled = false) diff --git a/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectUsersPresenter.kt b/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectUsersPresenter.kt index 77e3c6f6c5..ac036fb1c0 100644 --- a/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectUsersPresenter.kt +++ b/features/selectusers/impl/src/main/kotlin/io/element/android/features/selectusers/impl/DefaultSelectUsersPresenter.kt @@ -25,8 +25,8 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import io.element.android.features.selectusers.api.SelectUsersEvents +import io.element.android.features.selectusers.api.SelectUsersPresenter import io.element.android.features.selectusers.api.SelectUsersState -import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.matrix.api.core.MatrixPatterns import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.ui.model.MatrixUser @@ -37,9 +37,7 @@ import kotlinx.collections.immutable.persistentSetOf import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableSet -interface DefaultSelectUsersPresenter : Presenter { - - val isMultiSelectionEnabled: Boolean +class DefaultSelectUsersPresenter(private val isMultiSelectionEnabled: Boolean) : SelectUsersPresenter { @Composable override fun present(): SelectUsersState {