diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index eb8aff66ed..ad6562a83c 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -68,7 +68,6 @@ dependencies { implementation(libs.jsoup) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.constraintlayout.compose) - implementation(libs.androidx.datastore.preferences) implementation(libs.androidx.media3.exoplayer) implementation(libs.androidx.media3.ui) implementation(libs.sigpwned.emoji4j) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 93f7746858..22c4cdbda1 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -29,7 +29,6 @@ import io.element.android.appconfig.MessageComposerConfig import io.element.android.features.messages.api.timeline.HtmlConverterProvider import io.element.android.features.messages.impl.actionlist.ActionListState import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction -import io.element.android.features.messages.impl.crypto.historyvisible.HistoryVisibleState import io.element.android.features.messages.impl.crypto.identity.IdentityChangeState import io.element.android.features.messages.impl.link.LinkState import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvent @@ -102,7 +101,6 @@ class MessagesPresenter( @Assisted private val timelinePresenter: Presenter, private val timelineProtectionPresenter: Presenter, private val identityChangeStatePresenter: Presenter, - private val historyVisibleStatePresenter: Presenter, private val linkPresenter: Presenter, @Assisted private val actionListPresenter: Presenter, private val customReactionPresenter: Presenter, @@ -154,7 +152,6 @@ class MessagesPresenter( val timelineState = timelinePresenter.present() val timelineProtectionState = timelineProtectionPresenter.present() val identityChangeState = identityChangeStatePresenter.present() - val historyVisibleState = historyVisibleStatePresenter.present() val actionListState = actionListPresenter.present() val linkState = linkPresenter.present() val customReactionState = customReactionPresenter.present() @@ -286,7 +283,6 @@ class MessagesPresenter( timelineState = timelineState, timelineProtectionState = timelineProtectionState, identityChangeState = identityChangeState, - historyVisibleState = historyVisibleState, linkState = linkState, actionListState = actionListState, customReactionState = customReactionState, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt index 18d3c17a81..b37a916b2e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesState.kt @@ -10,7 +10,6 @@ package io.element.android.features.messages.impl import io.element.android.features.messages.api.timeline.voicemessages.composer.VoiceMessageComposerState import io.element.android.features.messages.impl.actionlist.ActionListState -import io.element.android.features.messages.impl.crypto.historyvisible.HistoryVisibleState import io.element.android.features.messages.impl.crypto.identity.IdentityChangeState import io.element.android.features.messages.impl.link.LinkState import io.element.android.features.messages.impl.messagecomposer.MessageComposerState @@ -41,7 +40,6 @@ data class MessagesState( val timelineState: TimelineState, val timelineProtectionState: TimelineProtectionState, val identityChangeState: IdentityChangeState, - val historyVisibleState: HistoryVisibleState, val linkState: LinkState, val actionListState: ActionListState, val customReactionState: CustomReactionState, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index 592aab6d35..b657b4bbb4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -14,8 +14,6 @@ import io.element.android.features.messages.api.timeline.voicemessages.composer. import io.element.android.features.messages.api.timeline.voicemessages.composer.aVoiceMessagePreviewState import io.element.android.features.messages.impl.actionlist.ActionListState import io.element.android.features.messages.impl.actionlist.anActionListState -import io.element.android.features.messages.impl.crypto.historyvisible.HistoryVisibleState -import io.element.android.features.messages.impl.crypto.historyvisible.aHistoryVisibleState import io.element.android.features.messages.impl.crypto.identity.IdentityChangeState import io.element.android.features.messages.impl.crypto.identity.aRoomMemberIdentityStateChange import io.element.android.features.messages.impl.crypto.identity.anIdentityChangeState @@ -92,15 +90,6 @@ open class MessagesStateProvider : PreviewParameterProvider { composerState = aMessageComposerState(textEditorState = aTextEditorStateMarkdown()), identityChangeState = anIdentityChangeState(listOf(aRoomMemberIdentityStateChange())) ), - aMessagesState( - composerState = aMessageComposerState(textEditorState = aTextEditorStateMarkdown()), - historyVisibleState = aHistoryVisibleState(showAlert = true) - ), - aMessagesState( - composerState = aMessageComposerState(textEditorState = aTextEditorStateMarkdown()), - identityChangeState = anIdentityChangeState(listOf(aRoomMemberIdentityStateChange())), - historyVisibleState = aHistoryVisibleState(showAlert = true) - ) ) } @@ -121,7 +110,6 @@ fun aMessagesState( ), timelineProtectionState: TimelineProtectionState = aTimelineProtectionState(), identityChangeState: IdentityChangeState = anIdentityChangeState(), - historyVisibleState: HistoryVisibleState = aHistoryVisibleState(), linkState: LinkState = aLinkState(), readReceiptBottomSheetState: ReadReceiptBottomSheetState = aReadReceiptBottomSheetState(), actionListState: ActionListState = anActionListState(), @@ -145,7 +133,6 @@ fun aMessagesState( voiceMessageComposerState = voiceMessageComposerState, timelineProtectionState = timelineProtectionState, identityChangeState = identityChangeState, - historyVisibleState = historyVisibleState, linkState = linkState, timelineState = timelineState, readReceiptBottomSheetState = readReceiptBottomSheetState, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt index 95f7333845..5d4ccf2d78 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt @@ -55,7 +55,6 @@ import io.element.android.features.messages.api.timeline.voicemessages.composer. import io.element.android.features.messages.impl.actionlist.ActionListEvent import io.element.android.features.messages.impl.actionlist.ActionListView import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction -import io.element.android.features.messages.impl.crypto.historyvisible.HistoryVisibleStateView import io.element.android.features.messages.impl.crypto.identity.IdentityChangeStateView import io.element.android.features.messages.impl.link.LinkEvent import io.element.android.features.messages.impl.link.LinkView @@ -520,17 +519,10 @@ private fun MessagesViewComposerBottomSheetContents( // Do not show the identity change if user is composing a Rich message or is seeing suggestion(s). if (state.composerState.suggestions.isEmpty() && state.composerState.textEditorState is TextEditorState.Markdown) { - if (state.identityChangeState.roomMemberIdentityStateChanges.isNotEmpty()) { - IdentityChangeStateView( - state = state.identityChangeState, - onLinkClick = onLinkClick, - ) - } else { - HistoryVisibleStateView( - state = state.historyVisibleState, - onLinkClick = onLinkClick, - ) - } + IdentityChangeStateView( + state = state.identityChangeState, + onLinkClick = onLinkClick, + ) } val verificationViolation = state.identityChangeState.roomMemberIdentityStateChanges.firstOrNull { it.identityState == IdentityState.VerificationViolation diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleAcknowledgementRepository.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleAcknowledgementRepository.kt deleted file mode 100644 index 1fa992fc3e..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleAcknowledgementRepository.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -import androidx.datastore.preferences.core.booleanPreferencesKey -import androidx.datastore.preferences.core.edit -import dev.zacsweers.metro.ContributesBinding -import io.element.android.libraries.androidutils.hash.hash -import io.element.android.libraries.di.SessionScope -import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.matrix.api.core.SessionId -import io.element.android.libraries.preferences.api.store.PreferenceDataStoreFactory -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map - -interface HistoryVisibleAcknowledgementRepository { - fun hasAcknowledged(roomId: RoomId): Flow - suspend fun setAcknowledged(roomId: RoomId, value: Boolean) -} - -@ContributesBinding(SessionScope::class) -class DefaultHistoryVisibleAcknowledgementRepository( - sessionId: SessionId, - preferenceDataStoreFactory: PreferenceDataStoreFactory, -) : HistoryVisibleAcknowledgementRepository { - val store = - sessionId.value.hash().take(16).let { hash -> - preferenceDataStoreFactory.create("elementx_historyvisible_$hash") - } - - override fun hasAcknowledged(roomId: RoomId): Flow { - return store.data.map { prefs -> - val acknowledged = prefs[booleanPreferencesKey(roomId.value)] ?: false - acknowledged - } - } - - override suspend fun setAcknowledged(roomId: RoomId, value: Boolean) { - store.edit { prefs -> - prefs[booleanPreferencesKey(roomId.value)] = value - } - } -} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleEvent.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleEvent.kt deleted file mode 100644 index 775d9c00d4..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleEvent.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -sealed interface HistoryVisibleEvent { - data object Acknowledge : HistoryVisibleEvent -} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleState.kt deleted file mode 100644 index 3f980eb086..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleState.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -data class HistoryVisibleState( - val showAlert: Boolean, - val eventSink: (HistoryVisibleEvent) -> Unit, -) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStatePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStatePresenter.kt deleted file mode 100644 index e79681cd5c..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStatePresenter.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.rememberCoroutineScope -import dev.zacsweers.metro.Inject -import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags -import io.element.android.libraries.matrix.api.core.RoomId -import io.element.android.libraries.matrix.api.room.JoinedRoom -import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -@Inject -class HistoryVisibleStatePresenter( - private val featureFlagService: FeatureFlagService, - private val repository: HistoryVisibleAcknowledgementRepository, - private val room: JoinedRoom, -) : Presenter { - @Composable - override fun present(): HistoryVisibleState { - val isFeatureEnabled by featureFlagService.isFeatureEnabledFlow(FeatureFlags.EnableKeyShareOnInvite).collectAsState(initial = false) - val roomInfo by room.roomInfoFlow.collectAsState() - // Implicitly assume the alert is initially acknowledged to avoid flashes in UI. - val acknowledged by repository.hasAcknowledged(room.roomId).collectAsState(initial = true) - val isHistoryVisible = roomInfo.historyVisibility == RoomHistoryVisibility.Shared || roomInfo.historyVisibility == RoomHistoryVisibility.WorldReadable - - val coroutineScope = rememberCoroutineScope() - - LaunchedEffect(isHistoryVisible, acknowledged) { - if (!isHistoryVisible && acknowledged) { - // Clear the dismissed flag, if it is set to ensure that if a room is changed public -> private -> public, - // we show the banner again when it is set back to public. - repository.setAcknowledged(room.roomId, false) - } - } - - fun handleEvent(event: HistoryVisibleEvent) { - when (event) { - is HistoryVisibleEvent.Acknowledge -> coroutineScope.setAcknowledged(room.roomId, true) - } - } - - return HistoryVisibleState( - showAlert = isFeatureEnabled && isHistoryVisible && roomInfo.isEncrypted == true && !acknowledged, - eventSink = ::handleEvent, - ) - } - - private fun CoroutineScope.setAcknowledged(roomId: RoomId, value: Boolean) = launch { - repository.setAcknowledged(roomId, value) - } -} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStateProvider.kt deleted file mode 100644 index 752abdc76b..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStateProvider.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -import androidx.compose.ui.tooling.preview.PreviewParameterProvider - -class HistoryVisibleStateProvider : PreviewParameterProvider { - override val values: Sequence - get() = sequenceOf( - aHistoryVisibleState(showAlert = true), - ) -} - -internal fun aHistoryVisibleState( - showAlert: Boolean = false, - eventSink: (HistoryVisibleEvent) -> Unit = {}, -) = HistoryVisibleState( - showAlert, - eventSink = eventSink, -) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStateView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStateView.kt deleted file mode 100644 index d0655f695d..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStateView.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.PreviewParameter -import io.element.android.appconfig.LearnMoreConfig -import io.element.android.libraries.designsystem.atomic.molecules.ComposerAlertLevel -import io.element.android.libraries.designsystem.atomic.molecules.ComposerAlertMolecule -import io.element.android.libraries.designsystem.preview.ElementPreview -import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.designsystem.text.stringWithLink -import io.element.android.libraries.ui.strings.CommonStrings - -@Composable -fun HistoryVisibleStateView( - state: HistoryVisibleState, - onLinkClick: (String, Boolean) -> Unit, - modifier: Modifier = Modifier, -) { - if (!state.showAlert) { - return - } - ComposerAlertMolecule( - modifier = modifier, - avatar = null, - showIcon = true, - level = ComposerAlertLevel.Info, - content = stringWithLink( - textRes = CommonStrings.crypto_history_visible, - url = LearnMoreConfig.HISTORY_VISIBLE_URL, - onLinkClick = { url -> onLinkClick(url, true) }, - ), - submitText = stringResource(CommonStrings.action_dismiss), - onSubmitClick = { state.eventSink(HistoryVisibleEvent.Acknowledge) }, - ) -} - -@PreviewsDayNight -@Composable -internal fun HistoryVisibleStateViewPreview( - @PreviewParameter(HistoryVisibleStateProvider::class) state: HistoryVisibleState, -) = ElementPreview { - HistoryVisibleStateView( - state = state, - onLinkClick = { _, _ -> }, - ) -} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/MessagesViewWithHistoryVisiblePreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/MessagesViewWithHistoryVisiblePreview.kt deleted file mode 100644 index 07cf5170d3..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/MessagesViewWithHistoryVisiblePreview.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -import androidx.compose.runtime.Composable -import io.element.android.features.messages.impl.MessagesView -import io.element.android.features.messages.impl.aMessagesState -import io.element.android.features.messages.impl.messagecomposer.aMessageComposerState -import io.element.android.libraries.designsystem.preview.ElementPreview -import io.element.android.libraries.designsystem.preview.PreviewsDayNight -import io.element.android.libraries.textcomposer.model.aTextEditorStateMarkdown - -@PreviewsDayNight -@Composable -internal fun MessagesViewWithHistoryVisiblePreview() = ElementPreview { - MessagesView( - state = aMessagesState( - composerState = aMessageComposerState( - textEditorState = aTextEditorStateMarkdown( - initialText = "", - initialFocus = false, - ) - ), - historyVisibleState = aHistoryVisibleState(showAlert = true), - ), - onBackClick = {}, - onRoomDetailsClick = {}, - onEventContentClick = { _, _ -> false }, - onUserDataClick = {}, - onLinkClick = { _, _ -> }, - onSendLocationClick = {}, - onCreatePollClick = {}, - onJoinCallClick = {}, - onViewAllPinnedMessagesClick = {}, - knockRequestsBannerView = {} - ) -} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesBindsModule.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesBindsModule.kt index a88dbb1b49..a345e09fa2 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesBindsModule.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/di/MessagesBindsModule.kt @@ -11,8 +11,6 @@ package io.element.android.features.messages.impl.di import dev.zacsweers.metro.BindingContainer import dev.zacsweers.metro.Binds import dev.zacsweers.metro.ContributesTo -import io.element.android.features.messages.impl.crypto.historyvisible.HistoryVisibleState -import io.element.android.features.messages.impl.crypto.historyvisible.HistoryVisibleStatePresenter import io.element.android.features.messages.impl.crypto.identity.IdentityChangeState import io.element.android.features.messages.impl.crypto.identity.IdentityChangeStatePresenter import io.element.android.features.messages.impl.crypto.sendfailure.resolve.ResolveVerifiedUserSendFailurePresenter @@ -63,7 +61,4 @@ interface MessagesBindsModule { @Binds fun bindIdentityChangeStatePresenter(presenter: IdentityChangeStatePresenter): Presenter - - @Binds - fun bindHistoryVisibleStatePresenter(presenter: HistoryVisibleStatePresenter): Presenter } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt index 8a4f5aad58..8fe20cbebe 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt @@ -17,7 +17,6 @@ import io.element.android.features.messages.impl.actionlist.ActionListEvent import io.element.android.features.messages.impl.actionlist.ActionListState import io.element.android.features.messages.impl.actionlist.anActionListState import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction -import io.element.android.features.messages.impl.crypto.historyvisible.aHistoryVisibleState import io.element.android.features.messages.impl.crypto.identity.anIdentityChangeState import io.element.android.features.messages.impl.fixtures.aMessageEvent import io.element.android.features.messages.impl.link.aLinkState @@ -1310,7 +1309,6 @@ class MessagesPresenterTest { timelinePresenter = { aTimelineState(eventSink = timelineEventSink) }, timelineProtectionPresenter = { aTimelineProtectionState() }, identityChangeStatePresenter = { anIdentityChangeState() }, - historyVisibleStatePresenter = { aHistoryVisibleState() }, linkPresenter = { aLinkState() }, actionListPresenter = { anActionListState(eventSink = actionListEventSink) }, customReactionPresenter = { aCustomReactionState() }, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/FakeHistoryVisibleAcknowledgementRepository.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/FakeHistoryVisibleAcknowledgementRepository.kt deleted file mode 100644 index faf21720fa..0000000000 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/FakeHistoryVisibleAcknowledgementRepository.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -import io.element.android.libraries.matrix.api.core.RoomId -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow - -class FakeHistoryVisibleAcknowledgementRepository( - private val acknowledgements: MutableMap> = mutableMapOf() -) : HistoryVisibleAcknowledgementRepository { - override fun hasAcknowledged(roomId: RoomId): Flow { - return acknowledgements.getOrPut(roomId) { - MutableStateFlow(false) - } - } - - override suspend fun setAcknowledged(roomId: RoomId, value: Boolean) { - val flow = acknowledgements.getOrPut(roomId) { - MutableStateFlow(value) - } - flow.emit(value) - } - - companion object { - /** - * Create the repository with a pre-existing entry. - */ - fun withRoom(roomId: RoomId, acknowledged: Boolean = false): FakeHistoryVisibleAcknowledgementRepository { - return FakeHistoryVisibleAcknowledgementRepository( - mutableMapOf( - roomId to MutableStateFlow(acknowledged) - ) - ) - } - } -} diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStatePresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStatePresenterTest.kt deleted file mode 100644 index afa1992cac..0000000000 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/crypto/historyvisible/HistoryVisibleStatePresenterTest.kt +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.crypto.historyvisible - -import com.google.common.truth.Truth.assertThat -import io.element.android.libraries.featureflag.api.FeatureFlags -import io.element.android.libraries.featureflag.test.FakeFeatureFlagService -import io.element.android.libraries.matrix.api.room.JoinedRoom -import io.element.android.libraries.matrix.api.room.history.RoomHistoryVisibility -import io.element.android.libraries.matrix.test.room.FakeJoinedRoom -import io.element.android.libraries.matrix.test.room.aRoomInfo -import io.element.android.tests.testutils.WarmUpRule -import io.element.android.tests.testutils.awaitLastSequentialItem -import io.element.android.tests.testutils.test -import kotlinx.coroutines.test.runTest -import org.junit.Rule -import org.junit.Test - -class HistoryVisibleStatePresenterTest { - @get:Rule - val warmUpRule = WarmUpRule() - - @Test - fun `present - not visible if feature disabled`() = runTest { - val room = FakeJoinedRoom() - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Shared, isEncrypted = true)) - val presenter = createHistoryVisibleStatePresenter(room, enabled = false, acknowledged = false) - presenter.test { - assertThat(awaitLastSequentialItem().showAlert).isFalse() - } - } - - @Test - fun `present - initial with room shared, unencrypted`() = runTest { - val room = FakeJoinedRoom() - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Shared, isEncrypted = false)) - val presenter = createHistoryVisibleStatePresenter(room) - presenter.test { - assertThat(awaitLastSequentialItem().showAlert).isFalse() - } - } - - @Test - fun `present - initial with room joined, encrypted`() = runTest { - val room = FakeJoinedRoom() - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Joined, isEncrypted = true)) - val presenter = createHistoryVisibleStatePresenter(room) - presenter.test { - assertThat(awaitLastSequentialItem().showAlert).isFalse() - } - } - - @Test - fun `present - initial with room invited, encrypted`() = runTest { - val room = FakeJoinedRoom() - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Invited, isEncrypted = true)) - val presenter = createHistoryVisibleStatePresenter(room) - presenter.test { - assertThat(awaitLastSequentialItem().showAlert).isFalse() - } - } - - @Test - fun `present - initial with room shared, encrypted, unacknowledged`() = runTest { - val room = FakeJoinedRoom() - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Shared, isEncrypted = true)) - val presenter = createHistoryVisibleStatePresenter(room, acknowledged = false) - presenter.test { - val initialState = awaitItem() - assertThat(initialState.showAlert).isFalse() - val nextState = awaitItem() - assertThat(nextState.showAlert).isTrue() - } - } - - @Test - fun `present - initial with room shared, encrypted, acknowledged`() = runTest { - val room = FakeJoinedRoom() - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Shared, isEncrypted = true)) - val presenter = createHistoryVisibleStatePresenter(room, acknowledged = true) - presenter.test { - assertThat(awaitLastSequentialItem().showAlert).isFalse() - } - } - - @Test - fun `present - transition from joined + unencrypted, to shared + encrypted`() = runTest { - val room = FakeJoinedRoom() - val featureFlagService = FakeFeatureFlagService(mapOf(FeatureFlags.EnableKeyShareOnInvite.key to true)) - val repository = FakeHistoryVisibleAcknowledgementRepository() - - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Joined, isEncrypted = false)) - - val presenter = HistoryVisibleStatePresenter( - featureFlagService, - repository, - room, - ) - - presenter.test { - // emitted by the feature flag service(?) - assertThat(awaitItem().showAlert).isFalse() - - // emitted state from room info assignment - assertThat(awaitItem().showAlert).isFalse() - - // room is marked as encrypted - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Joined, isEncrypted = true)) - assertThat(awaitItem().showAlert).isFalse() - - // room history visibility is changed to shared - room.givenRoomInfo(aRoomInfo(historyVisibility = RoomHistoryVisibility.Shared, isEncrypted = true)) - assertThat(awaitItem().showAlert).isTrue() - - // alert is acknowledged - repository.setAcknowledged(room.roomId, true) - assertThat(awaitItem().showAlert).isFalse() - } - } - - private fun createHistoryVisibleStatePresenter( - room: JoinedRoom = FakeJoinedRoom(), - enabled: Boolean = true, - acknowledged: Boolean = false - ): HistoryVisibleStatePresenter { - return HistoryVisibleStatePresenter( - room = room, - featureFlagService = FakeFeatureFlagService(mapOf("feature.enableKeyShareOnInvite" to enabled)), - repository = FakeHistoryVisibleAcknowledgementRepository.withRoom(room.roomId, acknowledged) - ) - } -} diff --git a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt index e4a9d60679..245f841d1a 100644 --- a/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt +++ b/tests/konsist/src/test/kotlin/io/element/android/tests/konsist/KonsistPreviewTest.kt @@ -101,7 +101,6 @@ class KonsistPreviewTest { "MessageComposerViewVoicePreview", "MessagesReactionButtonAddPreview", "MessagesReactionButtonExtraPreview", - "MessagesViewWithHistoryVisiblePreview", "MessagesViewWithIdentityChangePreview", "PendingMemberRowWithLongNamePreview", "PinUnlockViewInAppPreview", diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_HistoryVisibleStateView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_HistoryVisibleStateView_Day_0_en.png deleted file mode 100644 index 82395ab3e4..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_HistoryVisibleStateView_Day_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0489a15e6f8b358780484ea33807aaa2079512f7077b81b1e7e455092968cd61 -size 25463 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_HistoryVisibleStateView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_HistoryVisibleStateView_Night_0_en.png deleted file mode 100644 index 75c8eb8e45..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_HistoryVisibleStateView_Night_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da4fa289d3a4f32da964a47392458a09bdf80d4410e9ab9519225d077bb4a168 -size 28316 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_MessagesViewWithHistoryVisible_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_MessagesViewWithHistoryVisible_Day_0_en.png deleted file mode 100644 index 6ebf12ac3d..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_MessagesViewWithHistoryVisible_Day_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cf7b2508bdf41e2ee9b8b26207c604232f54314797237aceec5675524a7c8ab5 -size 66644 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_MessagesViewWithHistoryVisible_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_MessagesViewWithHistoryVisible_Night_0_en.png deleted file mode 100644 index 02b6564855..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.crypto.historyvisible_MessagesViewWithHistoryVisible_Night_0_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e58f097893ebc5f8664283d3e22b055b7294ce6d6bf571b34507e2242f70e677 -size 68988 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_11_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_11_en.png deleted file mode 100644 index 3fe678a873..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_11_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47c0b2a5dedb5b8ca1a027dfe93b27b97069f4c65b9e1553d7847f5f06348678 -size 68593 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png deleted file mode 100644 index 826ba15d61..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Day_12_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e0581c343abffc4a71db827cdc5f8b183525daed8b17b80cd6b511cb70ae9a05 -size 66428 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_11_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_11_en.png deleted file mode 100644 index 5b2e6c0429..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_11_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1ea74e00b157d5e0f7caf71ba839f1523bfbc0684335ba270aec05187a88c3e5 -size 70237 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png deleted file mode 100644 index 57fac247d9..0000000000 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl_MessagesView_Night_12_en.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c5d618df3faa09281e59897b7f478d12f5a0d907b47f58747607e1de8cbc6e61 -size 68146