From acf919f2fbc006cd39a1e50852706698752cdd6a Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 19 Jan 2026 10:54:00 +0100 Subject: [PATCH] misc: Provide `ConfigureRoomState.availableVisibilityOptions` from the presenter (#6024) It seems better to handle the filtering logic there than on the view. Besides this, hide knocking for spaces even if the knocking feature is enabled. We don't want to have knocking in spaces yet. --- .../impl/configureroom/ConfigureRoomPresenter.kt | 10 +++++++++- .../impl/configureroom/ConfigureRoomState.kt | 2 +- .../impl/configureroom/ConfigureRoomStateProvider.kt | 5 ++++- .../impl/configureroom/ConfigureRoomView.kt | 11 ++++------- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt index aef55c77df..d14fa82656 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomPresenter.kt @@ -124,6 +124,14 @@ class ConfigureRoomPresenter( val localCoroutineScope = rememberCoroutineScope() val createRoomAction: MutableState> = remember { mutableStateOf(AsyncAction.Uninitialized) } + val availableVisibilityOptions = remember(isSpace, isKnockFeatureEnabled) { + listOfNotNull( + RoomVisibilityItem.Public, + RoomVisibilityItem.AskToJoin.takeIf { !isSpace && isKnockFeatureEnabled }, + RoomVisibilityItem.Private, + ).toImmutableList() + } + fun createRoom(config: CreateRoomConfig) { createRoomAction.value = AsyncAction.Uninitialized localCoroutineScope.createRoom(config, createRoomAction) @@ -155,13 +163,13 @@ class ConfigureRoomPresenter( } return ConfigureRoomState( - isKnockFeatureEnabled = isKnockFeatureEnabled, config = createRoomConfig, avatarActions = avatarActions, createRoomAction = createRoomAction.value, cameraPermissionState = cameraPermissionState, homeserverName = homeserverName, roomAddressValidity = roomAddressValidity.value, + availableVisibilityOptions = availableVisibilityOptions, eventSink = ::handleEvent, ) } diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt index 127aa20ccb..d50d057061 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomState.kt @@ -16,13 +16,13 @@ import io.element.android.libraries.permissions.api.PermissionsState import kotlinx.collections.immutable.ImmutableList data class ConfigureRoomState( - val isKnockFeatureEnabled: Boolean, val config: CreateRoomConfig, val avatarActions: ImmutableList, val createRoomAction: AsyncAction, val cameraPermissionState: PermissionsState, val roomAddressValidity: RoomAddressValidity, val homeserverName: String, + val availableVisibilityOptions: ImmutableList, val eventSink: (ConfigureRoomEvents) -> Unit ) { val isValid: Boolean = config.roomName?.isNotEmpty() == true && diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt index dc78ed7aab..577daf6b3e 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomStateProvider.kt @@ -101,14 +101,17 @@ fun aConfigureRoomState( cameraPermissionState: PermissionsState = aPermissionsState(showDialog = false), homeserverName: String = "matrix.org", roomAddressValidity: RoomAddressValidity = RoomAddressValidity.Valid, + availableVisibilityOptions: List = RoomVisibilityItem.entries.filter { + if (!isKnockFeatureEnabled) it != RoomVisibilityItem.AskToJoin else true + }, eventSink: (ConfigureRoomEvents) -> Unit = { }, ) = ConfigureRoomState( config = config, - isKnockFeatureEnabled = isKnockFeatureEnabled, avatarActions = avatarActions.toImmutableList(), createRoomAction = createRoomAction, cameraPermissionState = cameraPermissionState, homeserverName = homeserverName, roomAddressValidity = roomAddressValidity, + availableVisibilityOptions = availableVisibilityOptions.toImmutableList(), eventSink = eventSink, ) diff --git a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt index 2e0cbc6d5d..4ae5626ee3 100644 --- a/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt +++ b/features/createroom/impl/src/main/kotlin/io/element/android/features/createroom/impl/configureroom/ConfigureRoomView.kt @@ -65,6 +65,7 @@ import io.element.android.libraries.matrix.ui.components.AvatarPickerView import io.element.android.libraries.matrix.ui.room.address.RoomAddressField import io.element.android.libraries.permissions.api.PermissionsView import io.element.android.libraries.ui.strings.CommonStrings +import kotlinx.collections.immutable.ImmutableList import kotlin.jvm.optionals.getOrNull @Composable @@ -120,6 +121,7 @@ fun ConfigureRoomView( ) RoomVisibilityAndAccessOptions( + options = state.availableVisibilityOptions, selected = when (state.config.roomVisibility) { is RoomVisibilityState.Private -> RoomVisibilityItem.Private is RoomVisibilityState.Public -> when (state.config.roomVisibility.roomAccess) { @@ -127,7 +129,6 @@ fun ConfigureRoomView( RoomAccess.Anyone -> RoomVisibilityItem.Public } }, - isKnockingEnabled = state.isKnockFeatureEnabled, onOptionClick = { focusManager.clearFocus() state.eventSink(ConfigureRoomEvents.RoomVisibilityChanged(it)) @@ -279,8 +280,8 @@ private fun ConfigureRoomOptions( @Composable private fun RoomVisibilityAndAccessOptions( + options: ImmutableList, selected: RoomVisibilityItem, - isKnockingEnabled: Boolean, onOptionClick: (RoomVisibilityItem) -> Unit, modifier: Modifier = Modifier, ) { @@ -288,11 +289,7 @@ private fun RoomVisibilityAndAccessOptions( title = stringResource(R.string.screen_create_room_room_access_section_title), modifier = modifier, ) { - RoomVisibilityItem.entries.forEach { item -> - if (item == RoomVisibilityItem.AskToJoin && !isKnockingEnabled) { - return@forEach - } - + options.forEach { item -> val isSelected = item == selected ListItem( leadingContent = ListItemContent.Custom {