From 92990b27f36adce435773b40a1501cffab86c488 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 12 Aug 2025 14:24:18 +0200 Subject: [PATCH] Remove FeatureFlag.LocationSharing and FeatureFlag.Polls --- .../messagecomposer/AttachmentsBottomSheet.kt | 20 +++++++++---------- .../MessageComposerPresenter.kt | 12 +---------- .../messagecomposer/MessageComposerState.kt | 1 - .../MessageComposerStateProvider.kt | 2 -- .../event/TimelineItemContentPollFactory.kt | 5 ----- .../fixtures/TimelineItemsFactoryFixtures.kt | 2 +- .../MessageComposerPresenterTest.kt | 8 -------- .../libraries/featureflag/api/FeatureFlags.kt | 13 ------------ 8 files changed, 11 insertions(+), 52 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/AttachmentsBottomSheet.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/AttachmentsBottomSheet.kt index dc0e3dfdca..fe40b21499 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/AttachmentsBottomSheet.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/AttachmentsBottomSheet.kt @@ -132,17 +132,15 @@ private fun AttachmentSourcePickerMenu( style = ListItemStyle.Primary, ) } - if (state.canCreatePoll) { - ListItem( - modifier = Modifier.clickable { - state.eventSink(MessageComposerEvents.PickAttachmentSource.Poll) - onCreatePollClick() - }, - leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Polls())), - headlineContent = { Text(stringResource(R.string.screen_room_attachment_source_poll)) }, - style = ListItemStyle.Primary, - ) - } + ListItem( + modifier = Modifier.clickable { + state.eventSink(MessageComposerEvents.PickAttachmentSource.Poll) + onCreatePollClick() + }, + leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Polls())), + headlineContent = { Text(stringResource(R.string.screen_room_attachment_source_poll)) }, + style = ListItemStyle.Primary, + ) if (enableTextFormatting) { ListItem( modifier = Modifier.clickable { state.eventSink(MessageComposerEvents.ToggleTextFormatting(enabled = true)) }, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt index 1301a6ddff..8e0cce0e9b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenter.kt @@ -45,8 +45,6 @@ import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.di.annotations.SessionCoroutineScope -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder import io.element.android.libraries.matrix.api.permalink.PermalinkParser @@ -103,7 +101,6 @@ class MessageComposerPresenter @AssistedInject constructor( private val sessionCoroutineScope: CoroutineScope, private val room: JoinedRoom, private val mediaPickerProvider: PickerProvider, - private val featureFlagService: FeatureFlagService, private val sessionPreferencesStore: SessionPreferencesStore, private val localMediaFactory: LocalMediaFactory, private val mediaSender: MediaSender, @@ -156,13 +153,7 @@ class MessageComposerPresenter @AssistedInject constructor( val canShareLocation = remember { mutableStateOf(false) } LaunchedEffect(Unit) { - canShareLocation.value = featureFlagService.isFeatureEnabled(FeatureFlags.LocationSharing) && - locationService.isServiceAvailable() - } - - val canCreatePoll = remember { mutableStateOf(false) } - LaunchedEffect(Unit) { - canCreatePoll.value = featureFlagService.isFeatureEnabled(FeatureFlags.Polls) + canShareLocation.value = locationService.isServiceAvailable() } val galleryMediaPicker = mediaPickerProvider.registerGalleryPicker { uri, mimeType -> @@ -376,7 +367,6 @@ class MessageComposerPresenter @AssistedInject constructor( showAttachmentSourcePicker = showAttachmentSourcePicker, showTextFormatting = showTextFormatting, canShareLocation = canShareLocation.value, - canCreatePoll = canCreatePoll.value, suggestions = suggestions.toPersistentList(), resolveMentionDisplay = resolveMentionDisplay, resolveAtRoomMentionDisplay = resolveAtRoomMentionDisplay, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt index 1f1f80b203..6eadc14260 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerState.kt @@ -22,7 +22,6 @@ data class MessageComposerState( val showAttachmentSourcePicker: Boolean, val showTextFormatting: Boolean, val canShareLocation: Boolean, - val canCreatePoll: Boolean, val suggestions: ImmutableList, val resolveMentionDisplay: (String, String) -> TextDisplay, val resolveAtRoomMentionDisplay: () -> TextDisplay, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt index 590cfd20cf..36e2c69f96 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerStateProvider.kt @@ -30,7 +30,6 @@ fun aMessageComposerState( showTextFormatting: Boolean = false, showAttachmentSourcePicker: Boolean = false, canShareLocation: Boolean = true, - canCreatePoll: Boolean = true, suggestions: ImmutableList = persistentListOf(), eventSink: (MessageComposerEvents) -> Unit = {}, ) = MessageComposerState( @@ -40,7 +39,6 @@ fun aMessageComposerState( showTextFormatting = showTextFormatting, showAttachmentSourcePicker = showAttachmentSourcePicker, canShareLocation = canShareLocation, - canCreatePoll = canCreatePoll, suggestions = suggestions, resolveMentionDisplay = { _, _ -> TextDisplay.Plain }, resolveAtRoomMentionDisplay = { TextDisplay.Plain }, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt index ba3d397b61..c0da622d15 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/factories/event/TimelineItemContentPollFactory.kt @@ -9,23 +9,18 @@ package io.element.android.features.messages.impl.timeline.factories.event import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEventContent import io.element.android.features.messages.impl.timeline.model.event.TimelineItemPollContent -import io.element.android.features.messages.impl.timeline.model.event.TimelineItemUnknownContent import io.element.android.features.poll.api.pollcontent.PollContentStateFactory -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.timeline.item.event.EventTimelineItem import io.element.android.libraries.matrix.api.timeline.item.event.PollContent import javax.inject.Inject class TimelineItemContentPollFactory @Inject constructor( - private val featureFlagService: FeatureFlagService, private val pollContentStateFactory: PollContentStateFactory, ) { suspend fun create( event: EventTimelineItem, content: PollContent, ): TimelineItemEventContent { - if (!featureFlagService.isFeatureEnabled(FeatureFlags.Polls)) return TimelineItemUnknownContent val pollContentState = pollContentStateFactory.create(event, content) return TimelineItemPollContent( isMine = pollContentState.isMine, diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/TimelineItemsFactoryFixtures.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/TimelineItemsFactoryFixtures.kt index b62e77e08e..7628c7bbfc 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/TimelineItemsFactoryFixtures.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/fixtures/TimelineItemsFactoryFixtures.kt @@ -70,7 +70,7 @@ internal fun TestScope.aTimelineItemsFactory( fileSizeFormatter = FakeFileSizeFormatter(), fileExtensionExtractor = FileExtensionExtractorWithoutValidation() ), - pollFactory = TimelineItemContentPollFactory(FakeFeatureFlagService(), FakePollContentStateFactory()), + pollFactory = TimelineItemContentPollFactory(FakePollContentStateFactory()), utdFactory = TimelineItemContentUTDFactory(), roomMembershipFactory = TimelineItemContentRoomMembershipFactory(timelineEventFormatter), profileChangeFactory = TimelineItemContentProfileChangeFactory(timelineEventFormatter), diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt index a677207b13..9a98438566 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/messagecomposer/MessageComposerPresenterTest.kt @@ -32,9 +32,6 @@ import io.element.android.features.messages.impl.utils.FakeTextPillificationHelp import io.element.android.features.messages.impl.utils.TextPillificationHelper import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher -import io.element.android.libraries.featureflag.api.FeatureFlagService -import io.element.android.libraries.featureflag.api.FeatureFlags -import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.ThreadId @@ -125,9 +122,6 @@ class MessageComposerPresenterTest { private val pickerProvider = FakePickerProvider().apply { givenResult(mockk()) // Uri is not available in JVM, so the only way to have a non-null Uri is using Mockk } - private val featureFlagService = FakeFeatureFlagService( - mapOf(FeatureFlags.LocationSharing.key to true) - ) private val mediaPreProcessor = FakeMediaPreProcessor() private val snackbarDispatcher = SnackbarDispatcher() private val mockMediaUrl: Uri = mockk("localMediaUri") @@ -1529,7 +1523,6 @@ class MessageComposerPresenterTest { ), navigator: MessagesNavigator = FakeMessagesNavigator(), pickerProvider: PickerProvider = this@MessageComposerPresenterTest.pickerProvider, - featureFlagService: FeatureFlagService = this@MessageComposerPresenterTest.featureFlagService, locationService: LocationService = FakeLocationService(true), sessionPreferencesStore: SessionPreferencesStore = InMemorySessionPreferencesStore(), mediaPreProcessor: MediaPreProcessor = this@MessageComposerPresenterTest.mediaPreProcessor, @@ -1551,7 +1544,6 @@ class MessageComposerPresenterTest { sessionCoroutineScope = this, room = room, mediaPickerProvider = pickerProvider, - featureFlagService = featureFlagService, sessionPreferencesStore = sessionPreferencesStore, localMediaFactory = localMediaFactory, mediaSender = MediaSender( diff --git a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt index 02c25bb7b8..3aaeb3dd35 100644 --- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt +++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt @@ -21,19 +21,6 @@ enum class FeatureFlags( override val defaultValue: (BuildMeta) -> Boolean, override val isFinished: Boolean, ) : Feature { - LocationSharing( - key = "feature.locationsharing", - title = "Allow user to share location", - defaultValue = { true }, - isFinished = true, - ), - Polls( - key = "feature.polls", - title = "Polls", - description = "Create poll and render poll events in the timeline", - defaultValue = { true }, - isFinished = true, - ), NotificationSettings( key = "feature.notificationsettings", title = "Show notification settings",