From e9969fda56696d06a3d72b1b43e94db4a703afa9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 21 Oct 2025 14:31:29 +0200 Subject: [PATCH] Iterate on rendering the "Ask to join" option. --- .../SecurityAndPrivacyPresenter.kt | 2 +- .../SecurityAndPrivacyState.kt | 2 +- .../SecurityAndPrivacyStateProvider.kt | 12 +++++-- .../SecurityAndPrivacyView.kt | 10 ++++-- .../SecurityAndPrivacyPresenterTest.kt | 32 +++---------------- 5 files changed, 23 insertions(+), 35 deletions(-) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenter.kt index 995e07ad90..4ff45bb588 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenter.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenter.kt @@ -155,7 +155,7 @@ class SecurityAndPrivacyPresenter( editedSettings = editedSettings, homeserverName = homeserverName, showEnableEncryptionConfirmation = showEnableEncryptionConfirmation, - showAskToJoinOption = isKnockEnabled || savedSettings.roomAccess == SecurityAndPrivacyRoomAccess.AskToJoin, + isKnockEnabled = isKnockEnabled, saveAction = saveAction.value, permissions = permissions, eventSink = ::handleEvents diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyState.kt index d0b7e45875..dbc0125abb 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyState.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyState.kt @@ -19,7 +19,7 @@ data class SecurityAndPrivacyState( val editedSettings: SecurityAndPrivacySettings, val homeserverName: String, val showEnableEncryptionConfirmation: Boolean, - val showAskToJoinOption: Boolean, + val isKnockEnabled: Boolean, val saveAction: AsyncAction, private val permissions: SecurityAndPrivacyPermissions, val eventSink: (SecurityAndPrivacyEvents) -> Unit diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyStateProvider.kt index 7b73aed43e..8964ee59c5 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyStateProvider.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyStateProvider.kt @@ -31,7 +31,7 @@ open class SecurityAndPrivacyStateProvider : PreviewParameterProvider Unit = {} ) = SecurityAndPrivacyState( editedSettings = editedSettings, @@ -92,7 +98,7 @@ fun aSecurityAndPrivacyState( homeserverName = homeserverName, showEnableEncryptionConfirmation = showEncryptionConfirmation, saveAction = saveAction, - showAskToJoinOption = showAskToJoinOption, + isKnockEnabled = isKnockEnabled, permissions = permissions, eventSink = eventSink ) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt index 00222158ab..7428763dd8 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyView.kt @@ -81,7 +81,7 @@ fun SecurityAndPrivacyView( modifier = Modifier.padding(top = 24.dp), edited = state.editedSettings.roomAccess, saved = state.savedSettings.roomAccess, - showAskToJoinOption = state.showAskToJoinOption, + isKnockEnabled = state.isKnockEnabled, onSelectOption = { state.eventSink(SecurityAndPrivacyEvents.ChangeRoomAccess(it)) }, ) } @@ -177,7 +177,7 @@ private fun SecurityAndPrivacySection( private fun RoomAccessSection( edited: SecurityAndPrivacyRoomAccess, saved: SecurityAndPrivacyRoomAccess, - showAskToJoinOption: Boolean, + isKnockEnabled: Boolean, onSelectOption: (SecurityAndPrivacyRoomAccess) -> Unit, modifier: Modifier = Modifier, ) { @@ -191,12 +191,16 @@ private fun RoomAccessSection( trailingContent = ListItemContent.RadioButton(selected = edited == SecurityAndPrivacyRoomAccess.InviteOnly), onClick = { onSelectOption(SecurityAndPrivacyRoomAccess.InviteOnly) }, ) - if (showAskToJoinOption) { + // Show Ask to join option in two cases: + // - the Knock FF is enabled + // - AskToJoin is the current saved value + if (saved == SecurityAndPrivacyRoomAccess.AskToJoin || isKnockEnabled) { ListItem( headlineContent = { Text(text = stringResource(R.string.screen_security_and_privacy_ask_to_join_option_title)) }, supportingContent = { Text(text = stringResource(R.string.screen_security_and_privacy_ask_to_join_option_description)) }, trailingContent = ListItemContent.RadioButton(selected = edited == SecurityAndPrivacyRoomAccess.AskToJoin), onClick = { onSelectOption(SecurityAndPrivacyRoomAccess.AskToJoin) }, + enabled = isKnockEnabled, ) } ListItem( diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenterTest.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenterTest.kt index 0f950fe7be..5d2d9ab906 100644 --- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenterTest.kt +++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/impl/securityandprivacy/SecurityAndPrivacyPresenterTest.kt @@ -41,7 +41,7 @@ class SecurityAndPrivacyPresenterTest { assertThat(showRoomVisibilitySections).isFalse() assertThat(showHistoryVisibilitySection).isFalse() assertThat(showEncryptionSection).isFalse() - assertThat(showAskToJoinOption).isFalse() + assertThat(isKnockEnabled).isFalse() } with(awaitItem()) { assertThat(editedSettings).isEqualTo(savedSettings) @@ -52,7 +52,7 @@ class SecurityAndPrivacyPresenterTest { assertThat(showRoomVisibilitySections).isFalse() assertThat(showHistoryVisibilitySection).isTrue() assertThat(showEncryptionSection).isTrue() - assertThat(showAskToJoinOption).isFalse() + assertThat(isKnockEnabled).isFalse() } } } @@ -341,7 +341,7 @@ class SecurityAndPrivacyPresenterTest { } @Test - fun `present - showAskToJoinOption is true if the Knock feature flag is enabled`() = runTest { + fun `present - isKnockEnabled is true if the Knock feature flag is enabled`() = runTest { val presenter = createSecurityAndPrivacyPresenter( featureFlagService = FakeFeatureFlagService( initialState = mapOf( @@ -350,30 +350,8 @@ class SecurityAndPrivacyPresenterTest { ) ) presenter.test { - assertThat(awaitItem().showAskToJoinOption).isFalse() - assertThat(awaitItem().showAskToJoinOption).isTrue() - } - } - - @Test - fun `present - showAskToJoinOption is true if ask to join is the current value Knock feature flag is enabled`() = runTest { - val presenter = createSecurityAndPrivacyPresenter( - featureFlagService = FakeFeatureFlagService( - initialState = mapOf( - FeatureFlags.Knock.key to false, - ) - ), - room = FakeJoinedRoom( - baseRoom = FakeBaseRoom( - canSendStateResult = { _, _ -> Result.success(true) }, - getRoomVisibilityResult = { Result.success(RoomVisibility.Private) }, - initialRoomInfo = aRoomInfo(historyVisibility = RoomHistoryVisibility.Shared, joinRule = JoinRule.Knock) - ), - ) - ) - presenter.test { - assertThat(awaitItem().showAskToJoinOption).isTrue() - cancelAndIgnoreRemainingEvents() + assertThat(awaitItem().isKnockEnabled).isFalse() + assertThat(awaitItem().isKnockEnabled).isTrue() } }