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 60e8088504..f008f78d66 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 @@ -36,6 +36,7 @@ import androidx.compose.runtime.setValue import androidx.media3.common.MimeTypes import androidx.media3.common.util.UnstableApi import im.vector.app.features.analytics.plan.Composer +import im.vector.app.features.analytics.plan.Interaction import io.element.android.features.messages.impl.attachments.Attachment import io.element.android.features.messages.impl.attachments.preview.error.sendAttachmentError import io.element.android.features.messages.impl.mentions.MentionSuggestionsProcessor @@ -68,6 +69,7 @@ import io.element.android.libraries.textcomposer.model.Suggestion import io.element.android.libraries.textcomposer.model.TextEditorState import io.element.android.libraries.textcomposer.model.rememberMarkdownTextEditorState import io.element.android.services.analytics.api.AnalyticsService +import io.element.android.services.analyticsproviders.api.trackers.captureInteraction import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.CancellationException @@ -388,6 +390,9 @@ class MessageComposerPresenter @Inject constructor( is MessageComposerEvents.ToggleTextFormatting -> { showAttachmentSourcePicker = false showTextFormatting = event.enabled + if (showTextFormatting) { + analyticsService.captureInteraction(Interaction.Name.MobileRoomComposerFormattingEnabled) + } } is MessageComposerEvents.Error -> { analyticsService.trackError(event.error) diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt index 91f507fc51..a9a5dfe356 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/textcomposer/MessageComposerPresenterTest.kt @@ -26,6 +26,7 @@ import app.cash.turbine.ReceiveTurbine import app.cash.turbine.test import com.google.common.truth.Truth.assertThat import im.vector.app.features.analytics.plan.Composer +import im.vector.app.features.analytics.plan.Interaction import io.element.android.features.messages.impl.messagecomposer.AttachmentsState import io.element.android.features.messages.impl.messagecomposer.DefaultMessageComposerContext import io.element.android.features.messages.impl.messagecomposer.MessageComposerEvents @@ -768,10 +769,15 @@ class MessageComposerPresenterTest { val showTextFormatting = awaitItem() assertThat(showTextFormatting.showAttachmentSourcePicker).isFalse() assertThat(showTextFormatting.showTextFormatting).isTrue() + assertThat(analyticsService.capturedEvents).containsExactly( + Interaction(index = null, interactionType = null, name = Interaction.Name.MobileRoomComposerFormattingEnabled) + ) + analyticsService.capturedEvents.clear() showTextFormatting.eventSink(MessageComposerEvents.ToggleTextFormatting(false)) skipItems(1) val finished = awaitItem() assertThat(finished.showTextFormatting).isFalse() + assertThat(analyticsService.capturedEvents).isEmpty() } }