From 9b57a8724208f1a2977c27552be3e4d94f2b9adc Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Thu, 20 Mar 2025 09:40:50 +0100
Subject: [PATCH 1/9] feat(Matomo): Track 3 principal screens

---
 .../swisstransfer/ui/MatomoSwissTransfer.kt   |  8 ++++++++
 .../ui/navigation/NavigationDestination.kt    | 20 +++++++++++++------
 .../ui/screen/main/MainScreen.kt              |  4 ++++
 3 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
index 241ac01e6..a99c0adb4 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
@@ -47,4 +47,12 @@ object MatomoSwissTransfer : Matomo {
             }
         }
     }
+
+    fun trackScreen(title: String) {
+        trackScreen(path = "/$title", title = title)
+    }
+
+    fun trackTransferTypeEvent(name: String) {
+        trackEvent("transferType", name)
+    }
 }
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
index 1c60f2a62..bc6aa831e 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
@@ -26,6 +26,7 @@ import androidx.navigation.navDeepLink
 import androidx.navigation.toRoute
 import com.infomaniak.core.sentry.SentryLog
 import com.infomaniak.swisstransfer.BuildConfig
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.navigation.MainNavigation.SettingsDestination.getDeeplinkDirection
 import com.infomaniak.swisstransfer.ui.screen.main.DeeplinkViewModel.Companion.SENT_DEEPLINK_SUFFIX
 import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.components.TransferTypeUi
@@ -35,7 +36,7 @@ import kotlinx.serialization.Serializable
  * Sealed class representing the navigation arguments for the main navigation flow.
  */
 @Serializable
-sealed class MainNavigation : NavigationDestination() {
+sealed class MainNavigation(override val matomoValue: String? = null) : NavigationDestination() {
 
     protected inline fun <reified T : MainNavigation> NavGraphBuilder.getDeeplinkDirection(
         noinline content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit),
@@ -50,7 +51,7 @@ sealed class MainNavigation : NavigationDestination() {
 
     // If it has to be renamed, don't forget to rename `*DestinationName` in the companion object too.
     @Serializable
-    data class SentDestination(val transferUuid: String? = null) : MainNavigation() {
+    data class SentDestination(val transferUuid: String? = null) : MainNavigation("SentView") {
 
         companion object {
             fun NavGraphBuilder.sentDestination(content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)) {
@@ -61,7 +62,7 @@ sealed class MainNavigation : NavigationDestination() {
 
     // If it has to be renamed, don't forget to rename `*DestinationName` in the companion object too.
     @Serializable
-    data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation() {
+    data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation("ReceivedView") {
 
         companion object {
             fun NavGraphBuilder.receivedDestination(content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)) {
@@ -71,7 +72,7 @@ sealed class MainNavigation : NavigationDestination() {
     }
 
     @Serializable
-    data object SettingsDestination : MainNavigation()
+    data object SettingsDestination : MainNavigation("SettingsView")
 
     companion object {
         private val TAG = MainNavigation::class.java.simpleName
@@ -110,7 +111,7 @@ sealed class MainNavigation : NavigationDestination() {
  * Sealed class representing the navigation arguments for the new transfer flow.
  */
 @Serializable
-sealed class NewTransferNavigation : NavigationDestination() {
+sealed class NewTransferNavigation(override val matomoValue: String? = null) : NavigationDestination() {
 
     @Serializable
     data object PickFilesDestination : NewTransferNavigation()
@@ -138,4 +139,11 @@ sealed class NewTransferNavigation : NavigationDestination() {
  * Sealed class representing navigation arguments with a title resource.
  */
 @Serializable
-sealed class NavigationDestination
+sealed class NavigationDestination {
+
+    protected abstract val matomoValue: String?
+
+    fun trackScreen() {
+        matomoValue?.let { MatomoSwissTransfer.trackScreen(title = it) }
+    }
+}
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
index 12a4ae24b..2657ac1ec 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
@@ -39,6 +39,10 @@ fun MainScreen(deeplinkTransferDirection: TransferDirection? = null) {
         derivedStateOf { navBackStackEntry?.toMainDestination() ?: MainNavigation.startDestination }
     }
 
+    LaunchedEffect(currentDestination) {
+        currentDestination.trackScreen()
+    }
+
     MainScaffold(
         navController = navController,
         currentDestination = currentDestination,

From ca6e7ec7517abc9d791f4f05ae2a2eb497596e98 Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Thu, 20 Mar 2025 09:42:46 +0100
Subject: [PATCH 2/9] feat(Matomo): Add tracking on the transfer type

---
 .../ui/screen/newtransfer/pickfiles/PickFilesScreen.kt      | 6 +++++-
 .../newtransfer/pickfiles/components/TransferTypeButtons.kt | 5 +++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
index f3b7f9346..d9168ff7e 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
@@ -45,6 +45,7 @@ import com.google.accompanist.permissions.rememberPermissionState
 import com.infomaniak.core.mapSync
 import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.FileUi
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.*
 import com.infomaniak.swisstransfer.ui.previewparameter.FileUiListPreviewParameter
 import com.infomaniak.swisstransfer.ui.screen.main.settings.DownloadLimitOption
@@ -154,7 +155,10 @@ fun PickFilesScreen(
         transferMessageCallbacks = pickFilesViewModel.transferMessageCallbacks,
         selectedTransferType = GetSetCallbacks(
             get = { selectedTransferType },
-            set = pickFilesViewModel::selectTransferType,
+            set = { type ->
+                MatomoSwissTransfer.trackTransferTypeEvent(type.matomoValue)
+                pickFilesViewModel.selectTransferType(type)
+            },
         ),
         transferOptionsCallbacks = transferOptionsCallbacks,
         pickFiles = ::pickFiles,
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/components/TransferTypeButtons.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/components/TransferTypeButtons.kt
index 685392694..66fcf5a91 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/components/TransferTypeButtons.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/components/TransferTypeButtons.kt
@@ -72,6 +72,7 @@ enum class TransferTypeUi(
     @StringRes val titleRes: Int,
     @StringRes @PluralsRes val descriptionRes: Int?,
     val dbValue: TransferType,
+    val matomoValue: String,
 ) {
     QrCode(
         buttonIcon = AppIcons.QrCode,
@@ -79,6 +80,7 @@ enum class TransferTypeUi(
         titleRes = R.string.uploadSuccessQrTitle,
         descriptionRes = null,
         dbValue = TransferType.QR_CODE,
+        matomoValue = "qrCode",
     ),
     Mail(
         buttonIcon = AppIcons.Envelope,
@@ -86,6 +88,7 @@ enum class TransferTypeUi(
         titleRes = R.string.uploadSuccessEmailTitle,
         descriptionRes = R.plurals.uploadSuccessEmailDescription,
         dbValue = TransferType.MAIL,
+        matomoValue = "email",
     ),
     Link(
         buttonIcon = AppIcons.Chain,
@@ -93,6 +96,7 @@ enum class TransferTypeUi(
         titleRes = R.string.uploadSuccessLinkTitle,
         descriptionRes = R.string.uploadSuccessLinkDescription,
         dbValue = TransferType.LINK,
+        matomoValue = "link",
     ),
     Proximity(
         buttonIcon = AppIcons.WifiWave,
@@ -100,6 +104,7 @@ enum class TransferTypeUi(
         titleRes = R.string.uploadSuccessLinkTitle,
         descriptionRes = R.string.uploadSuccessLinkDescription,
         dbValue = TransferType.PROXIMITY,
+        matomoValue = "proximity",
     );
 
     companion object {

From a2e7c135ca328ddb0f5d704142260695556f86d8 Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Thu, 20 Mar 2025 09:45:26 +0100
Subject: [PATCH 3/9] feat(Matomo): Add tracking on TransferDetailsView

---
 .../ui/screen/main/transfers/TransfersScreenWrapper.kt          | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
index 6e7f7be5e..fa274a7b2 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
@@ -33,6 +33,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.*
 import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus
 import com.infomaniak.swisstransfer.ui.images.illus.mascotWithMagnifyingGlass.MascotWithMagnifyingGlass
@@ -140,6 +141,7 @@ private fun ThreePaneScaffoldNavigator<DestinationContent>.navigateToDetails(
     direction: TransferDirection,
     transferUuid: String,
 ) {
+    MatomoSwissTransfer.trackScreen("${direction.matomoValue}TransferDetailsView")
     selectItem(context, windowAdaptiveInfo, DestinationContent.RootLevel(direction, transferUuid))
 }
 

From dbc8525994a61e9234de235f68f49675c48e1ae7 Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Thu, 20 Mar 2025 11:34:16 +0100
Subject: [PATCH 4/9] feat(Matomo): Add tracking on Upload sub views

---
 .../ui/navigation/NavigationDestination.kt      | 17 +++++++----------
 .../NewTransferFilesDetailsScreen.kt            |  2 ++
 .../newtransfer/pickfiles/PickFilesScreen.kt    |  1 +
 .../newtransfer/upload/UploadFailureScreen.kt   |  5 +++++
 .../newtransfer/upload/UploadProgressScreen.kt  |  4 ++++
 .../newtransfer/upload/UploadRetryScreen.kt     |  8 ++++----
 .../newtransfer/upload/UploadSuccessScreen.kt   |  2 ++
 .../validateemail/ValidateUserEmailScreen.kt    |  4 ++++
 8 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
index bc6aa831e..4d0a37fde 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
@@ -36,7 +36,11 @@ import kotlinx.serialization.Serializable
  * Sealed class representing the navigation arguments for the main navigation flow.
  */
 @Serializable
-sealed class MainNavigation(override val matomoValue: String? = null) : NavigationDestination() {
+sealed class MainNavigation(private val matomoValue: String? = null) : NavigationDestination() {
+
+    fun trackScreen() {
+        matomoValue?.let { MatomoSwissTransfer.trackScreen(title = it) }
+    }
 
     protected inline fun <reified T : MainNavigation> NavGraphBuilder.getDeeplinkDirection(
         noinline content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit),
@@ -111,7 +115,7 @@ sealed class MainNavigation(override val matomoValue: String? = null) : Navigati
  * Sealed class representing the navigation arguments for the new transfer flow.
  */
 @Serializable
-sealed class NewTransferNavigation(override val matomoValue: String? = null) : NavigationDestination() {
+sealed class NewTransferNavigation : NavigationDestination() {
 
     @Serializable
     data object PickFilesDestination : NewTransferNavigation()
@@ -139,11 +143,4 @@ sealed class NewTransferNavigation(override val matomoValue: String? = null) : N
  * Sealed class representing navigation arguments with a title resource.
  */
 @Serializable
-sealed class NavigationDestination {
-
-    protected abstract val matomoValue: String?
-
-    fun trackScreen() {
-        matomoValue?.let { MatomoSwissTransfer.trackScreen(title = it) }
-    }
-}
+sealed class NavigationDestination
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/filesdetails/NewTransferFilesDetailsScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/filesdetails/NewTransferFilesDetailsScreen.kt
index e7ccd14f2..098c824a9 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/filesdetails/NewTransferFilesDetailsScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/filesdetails/NewTransferFilesDetailsScreen.kt
@@ -27,6 +27,7 @@ import androidx.compose.runtime.remember
 import androidx.compose.ui.tooling.preview.PreviewParameter
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.FileUi
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.SinglePaneScaffold
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
 import com.infomaniak.swisstransfer.ui.components.TopAppBarButtons
@@ -48,6 +49,7 @@ fun NewTransferFilesDetailsScreen(
 ) {
     val uiState by pickFilesViewModel.filesDetailsUiState.collectAsStateWithLifecycle()
 
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("NewTransferFileListView") }
     LaunchedEffect(uiState) {
         if (uiState is FilesDetailsUiState.EmptyFiles) navigateBack()
     }
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
index d9168ff7e..6c08a9de1 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
@@ -115,6 +115,7 @@ fun PickFilesScreen(
     HandleStartupFilePick(pickFilesViewModel.openFilePickerEvent, ::pickFiles)
 
     LaunchedEffect(Unit) {
+        MatomoSwissTransfer.trackScreen("NewTransferView")
         UploadForegroundService.uploadStateFlow.mapSync { it != null }.collect { isUploadOngoing ->
             if (isUploadOngoing) {
                 navigateToUploadProgress()
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
index 5e4e8b444..0af2804df 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
@@ -22,12 +22,14 @@ import androidx.compose.foundation.Image
 import androidx.compose.material3.ExperimentalMaterial3Api
 import androidx.compose.material3.Surface
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.State
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.res.stringResource
 import com.infomaniak.core.compose.basics.CallableState
 import com.infomaniak.swisstransfer.BuildConfig
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.*
 import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus
 import com.infomaniak.swisstransfer.ui.images.illus.appIntegrity.GhostScrollCrossPointing
@@ -41,6 +43,9 @@ fun UploadFailureScreen(
     failureState: State<UploadState.Failure>,
     cancel: CallableState<Unit>,
 ) {
+
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("UploadErrorView") }
+
     val failure: UploadState.Failure by failureState
     when (failure) {
         UploadState.Failure.AppIntegrityIssue -> UploadFailureScreen(
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt
index 92f91e797..d2a8e64a2 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt
@@ -28,6 +28,7 @@ import androidx.compose.ui.draw.alpha
 import androidx.compose.ui.res.stringResource
 import com.infomaniak.core.R
 import com.infomaniak.swisstransfer.R.string
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.BottomStickyButtonScaffold
 import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar
 import com.infomaniak.swisstransfer.ui.components.LargeButton
@@ -46,6 +47,9 @@ fun UploadOngoingScreen(
     adScreenType: UploadProgressAdType,
     onCancelClick: () -> Unit,
 ) {
+
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("UploadProgressView") }
+
     val progress by progressState
     BottomStickyButtonScaffold(
         topBar = { BrandTopAppBar() },
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
index ff7977e23..f8cb317ef 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
@@ -19,13 +19,11 @@ package com.infomaniak.swisstransfer.ui.screen.newtransfer.upload
 
 import androidx.compose.foundation.Image
 import androidx.compose.material3.Surface
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.State
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.*
 import androidx.compose.ui.res.stringResource
 import com.infomaniak.core.R
 import com.infomaniak.core.compose.basics.CallableState
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.*
 import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus
 import com.infomaniak.swisstransfer.ui.images.illus.uploadError.GhostMagnifyingGlassQuestionMark
@@ -41,6 +39,8 @@ fun UploadRetryScreen(
     retry: CallableState<Unit>,
     edit: CallableState<Unit>,
 ) {
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("UploadRetryView") }
+
     when (val error: UploadState.Retry = errorState.value) {
         is UploadState.Retry.EmailValidationRequired -> {
             ValidateUserEmailScreen(
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadSuccessScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadSuccessScreen.kt
index f15926932..d53403b17 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadSuccessScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadSuccessScreen.kt
@@ -23,6 +23,7 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.platform.LocalContext
 import androidx.datastore.preferences.core.edit
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.components.TransferTypeUi
 import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
 import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows
@@ -42,6 +43,7 @@ fun UploadSuccessScreen(
     // Now that we are done redirecting, we clear the value stored.
     LaunchedEffect(Unit) {
         context.lastTransferDataStore.edit { it.clear() }
+        MatomoSwissTransfer.trackScreen("UploadSuccessView")
     }
 
     BackHandler(onBack = dismissCompleteUpload)
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/validateemail/ValidateUserEmailScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/validateemail/ValidateUserEmailScreen.kt
index 40375d00e..cdff24cfc 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/validateemail/ValidateUserEmailScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/validateemail/ValidateUserEmailScreen.kt
@@ -39,6 +39,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.core.sentry.SentryLog
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.BottomStickyButtonScaffold
 import com.infomaniak.swisstransfer.ui.components.LargeButton
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
@@ -64,6 +65,7 @@ fun ValidateUserEmailScreen(
     state: UploadState.Retry.EmailValidationRequired,
     validateUserEmailViewModel: ValidateUserEmailViewModel = hiltViewModel(),
 ) {
+
     val emailToValidate = state.info.authorEmail
     val uiState by validateUserEmailViewModel.uiState.collectAsStateWithLifecycle()
     val isLoading by remember { derivedStateOf { uiState == ValidateEmailUiState.Loading } }
@@ -73,6 +75,8 @@ fun ValidateUserEmailScreen(
     val context = LocalContext.current
     val scope = rememberCoroutineScope()
 
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("VerifyMailView") }
+
     BackHandler { editTransfer() }
 
     HandleUnknownValidationError({ uiState }, snackbarHostState)

From d6b624e180a244410e9b2e70810ec18de16d7111 Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Thu, 20 Mar 2025 13:34:02 +0100
Subject: [PATCH 5/9] feat(Matomo): Track the same way retry and failure
 screens to be iso with iOS

---
 .../com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt    | 2 ++
 .../ui/screen/newtransfer/upload/UploadFailureScreen.kt       | 2 +-
 .../ui/screen/newtransfer/upload/UploadRetryScreen.kt         | 4 ++--
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
index a99c0adb4..443c54ada 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
@@ -30,6 +30,8 @@ import splitties.init.appCtx
 
 object MatomoSwissTransfer : Matomo {
 
+    const val UPLOAD_ERROR_SCREEN_TITLE = "UploadErrorView"
+
     private val scope = CoroutineScope(Dispatchers.Default)
 
     override val tracker: Tracker = with(appCtx) {
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
index 0af2804df..c2044c516 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
@@ -44,7 +44,7 @@ fun UploadFailureScreen(
     cancel: CallableState<Unit>,
 ) {
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("UploadErrorView") }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoSwissTransfer.UPLOAD_ERROR_SCREEN_TITLE) }
 
     val failure: UploadState.Failure by failureState
     when (failure) {
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
index f8cb317ef..37c7dbd57 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
@@ -39,8 +39,6 @@ fun UploadRetryScreen(
     retry: CallableState<Unit>,
     edit: CallableState<Unit>,
 ) {
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("UploadRetryView") }
-
     when (val error: UploadState.Retry = errorState.value) {
         is UploadState.Retry.EmailValidationRequired -> {
             ValidateUserEmailScreen(
@@ -58,6 +56,8 @@ private fun UploadRetryScreen(
     retry: CallableState<Unit>,
     edit: CallableState<Unit>,
 ) {
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoSwissTransfer.UPLOAD_ERROR_SCREEN_TITLE) }
+
     BottomStickyButtonScaffold(
         topBar = { BrandTopAppBar() },
         topButton = {

From def29b3c1398e76497982a1324025fc7d464dff8 Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Thu, 20 Mar 2025 14:02:04 +0100
Subject: [PATCH 6/9] feat(Matomo): Track the settings views

---
 .../main/settings/SettingsDownloadsLimitScreen.kt     |  1 +
 .../main/settings/SettingsEmailLanguageScreen.kt      |  1 +
 .../ui/screen/main/settings/SettingsThemeScreen.kt    |  1 +
 .../main/settings/SettingsValidityPeriodScreen.kt     |  1 +
 .../screen/main/settings/components/OptionScaffold.kt | 11 +++++++----
 5 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt
index f1000a7bf..b92de37b5 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt
@@ -38,6 +38,7 @@ fun SettingsDownloadsLimitScreen(
         optionTitleRes = R.string.settingsDownloadsLimitTitle,
         enumEntries = DownloadLimitOption.entries,
         selectedSettingOptionPosition = downloadLimit.ordinal,
+        matomoValue = "DownloadLimit",
         setSelectedSettingOptionPosition = { position -> onDownloadLimitChange(DownloadLimit.entries[position]) },
         navigateBack = navigateBack,
     )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt
index 58a2a95ce..262e7bce0 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt
@@ -39,6 +39,7 @@ fun SettingsEmailLanguageScreen(
         optionTitleRes = R.string.settingsEmailLanguageTitle,
         enumEntries = EmailLanguageOption.entries,
         selectedSettingOptionPosition = emailLanguage.ordinal,
+        matomoValue = "EmailLanguage",
         setSelectedSettingOptionPosition = { position -> onEmailLanguageChange(EmailLanguage.entries[position]) },
         navigateBack = navigateBack,
     )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
index 9289b2db0..082995ad4 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
@@ -43,6 +43,7 @@ fun SettingsThemeScreen(
         optionTitleRes = R.string.settingsThemeTitle,
         enumEntries = ThemeOption.entries,
         selectedSettingOptionPosition = theme.ordinal,
+        matomoValue = "Theme",
         setSelectedSettingOptionPosition = { position -> onThemeUpdate(Theme.entries[position]) },
         navigateBack = navigateBack,
     )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt
index 5027ff8ac..52bf4b81c 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt
@@ -39,6 +39,7 @@ fun SettingsValidityPeriodScreen(
         optionTitleRes = R.string.settingsValidityPeriodTitle,
         enumEntries = ValidityPeriodOption.entries,
         selectedSettingOptionPosition = validityPeriod.ordinal,
+        matomoValue = "ValidityPeriod",
         setSelectedSettingOptionPosition = { position -> onValidityPeriodChange(ValidityPeriod.entries[position]) },
         navigateBack = navigateBack,
     )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/OptionScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/OptionScaffold.kt
index 914500204..d33639c26 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/OptionScaffold.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/OptionScaffold.kt
@@ -21,13 +21,11 @@ import androidx.annotation.StringRes
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.rememberScrollState
 import androidx.compose.foundation.verticalScroll
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableIntStateOf
+import androidx.compose.runtime.*
 import androidx.compose.runtime.saveable.rememberSaveable
-import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
 import com.infomaniak.swisstransfer.ui.components.TopAppBarButtons
 import com.infomaniak.swisstransfer.ui.screen.main.components.SwissTransferScaffold
@@ -43,10 +41,14 @@ fun OptionScaffold(
     @StringRes optionTitleRes: Int,
     enumEntries: List<SettingOption>,
     selectedSettingOptionPosition: Int,
+    matomoValue: String,
     setSelectedSettingOptionPosition: (Int) -> Unit,
     navigateBack: (() -> Unit)?,
 ) {
     val windowAdaptiveInfo = LocalWindowAdaptiveInfo.current
+
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("${matomoValue}SettingView") }
+
     SwissTransferScaffold(
         topBar = {
             SwissTransferTopAppBar(
@@ -80,6 +82,7 @@ private fun Preview() {
             optionTitleRes = R.string.settingsThemeTitle,
             enumEntries = ThemeOption.entries,
             selectedSettingOptionPosition = 0,
+            matomoValue = "",
             setSelectedSettingOptionPosition = {},
             navigateBack = {},
         )

From 18c25a86ce9960b766698498b513c040484bc397 Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Thu, 20 Mar 2025 15:05:03 +0100
Subject: [PATCH 7/9] feat(Matomo): Stay kiss in the main view tracking to
 avoid double tracking on deeplink

---
 .../ui/navigation/NavigationDestination.kt          | 13 ++++---------
 .../swisstransfer/ui/screen/main/MainScreen.kt      |  4 ----
 .../ui/screen/main/received/ReceivedScreen.kt       |  4 ++++
 .../swisstransfer/ui/screen/main/sent/SentScreen.kt |  4 ++++
 .../ui/screen/main/settings/SettingsScreen.kt       |  4 ++++
 .../screen/main/transfers/TransfersScreenWrapper.kt |  1 +
 6 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
index 4d0a37fde..1c60f2a62 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt
@@ -26,7 +26,6 @@ import androidx.navigation.navDeepLink
 import androidx.navigation.toRoute
 import com.infomaniak.core.sentry.SentryLog
 import com.infomaniak.swisstransfer.BuildConfig
-import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.navigation.MainNavigation.SettingsDestination.getDeeplinkDirection
 import com.infomaniak.swisstransfer.ui.screen.main.DeeplinkViewModel.Companion.SENT_DEEPLINK_SUFFIX
 import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.components.TransferTypeUi
@@ -36,11 +35,7 @@ import kotlinx.serialization.Serializable
  * Sealed class representing the navigation arguments for the main navigation flow.
  */
 @Serializable
-sealed class MainNavigation(private val matomoValue: String? = null) : NavigationDestination() {
-
-    fun trackScreen() {
-        matomoValue?.let { MatomoSwissTransfer.trackScreen(title = it) }
-    }
+sealed class MainNavigation : NavigationDestination() {
 
     protected inline fun <reified T : MainNavigation> NavGraphBuilder.getDeeplinkDirection(
         noinline content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit),
@@ -55,7 +50,7 @@ sealed class MainNavigation(private val matomoValue: String? = null) : Navigatio
 
     // If it has to be renamed, don't forget to rename `*DestinationName` in the companion object too.
     @Serializable
-    data class SentDestination(val transferUuid: String? = null) : MainNavigation("SentView") {
+    data class SentDestination(val transferUuid: String? = null) : MainNavigation() {
 
         companion object {
             fun NavGraphBuilder.sentDestination(content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)) {
@@ -66,7 +61,7 @@ sealed class MainNavigation(private val matomoValue: String? = null) : Navigatio
 
     // If it has to be renamed, don't forget to rename `*DestinationName` in the companion object too.
     @Serializable
-    data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation("ReceivedView") {
+    data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation() {
 
         companion object {
             fun NavGraphBuilder.receivedDestination(content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)) {
@@ -76,7 +71,7 @@ sealed class MainNavigation(private val matomoValue: String? = null) : Navigatio
     }
 
     @Serializable
-    data object SettingsDestination : MainNavigation("SettingsView")
+    data object SettingsDestination : MainNavigation()
 
     companion object {
         private val TAG = MainNavigation::class.java.simpleName
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
index 2657ac1ec..12a4ae24b 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt
@@ -39,10 +39,6 @@ fun MainScreen(deeplinkTransferDirection: TransferDirection? = null) {
         derivedStateOf { navBackStackEntry?.toMainDestination() ?: MainNavigation.startDestination }
     }
 
-    LaunchedEffect(currentDestination) {
-        currentDestination.trackScreen()
-    }
-
     MainScaffold(
         navController = navController,
         currentDestination = currentDestination,
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt
index 7c91ec0fd..54886e269 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt
@@ -21,6 +21,7 @@ import androidx.compose.foundation.Image
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.material3.Surface
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
@@ -29,6 +30,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar
 import com.infomaniak.swisstransfer.ui.components.EmptyState
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
@@ -61,6 +63,8 @@ fun ReceivedScreen(
 
     hasTransfer((uiState as? TransferUiState.Success)?.data?.isNotEmpty() == true)
 
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("ReceivedView") }
+
     ReceivedScreen(
         uiState = { uiState },
         isFirstTransfer = { sentTransfersAreEmpty },
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt
index 2be16e6f1..159e838e6 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt
@@ -20,6 +20,7 @@ package com.infomaniak.swisstransfer.ui.screen.main.sent
 import androidx.compose.foundation.layout.fillMaxHeight
 import androidx.compose.material3.Surface
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.runtime.getValue
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.stringResource
@@ -30,6 +31,7 @@ import androidx.lifecycle.compose.LifecycleEventEffect
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar
 import com.infomaniak.swisstransfer.ui.components.NewTransferFab
 import com.infomaniak.swisstransfer.ui.components.NewTransferFabType
@@ -59,6 +61,8 @@ fun SentScreen(
 
     hasTransfer((uiState as? TransferUiState.Success)?.data?.isNotEmpty() == true)
 
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("SentView") }
+
     LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
         transfersViewModel.fetchPendingTransfers()
     }
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
index cf4a10b2f..0c86bef9d 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
@@ -26,6 +26,7 @@ import androidx.compose.foundation.verticalScroll
 import androidx.compose.material3.MaterialTheme
 import androidx.compose.material3.Surface
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.res.pluralStringResource
 import androidx.compose.ui.res.stringResource
@@ -35,6 +36,7 @@ import com.infomaniak.multiplatform_swisstransfer.common.models.Theme
 import com.infomaniak.multiplatform_swisstransfer.common.models.ValidityPeriod
 import com.infomaniak.swisstransfer.BuildConfig
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
 import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar
 import com.infomaniak.swisstransfer.ui.components.SmallWindowScreenTitle
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
@@ -66,6 +68,8 @@ fun SettingsScreen(
     val selectedSetting = getSelectedSetting()
     val windowAdaptiveInfo = LocalWindowAdaptiveInfo.current
 
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("SettingsView") }
+
     SwissTransferScaffold(
         topBar = {
             if (windowAdaptiveInfo.isWindowLarge()) {
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
index fa274a7b2..a7099d08f 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
@@ -151,6 +151,7 @@ private fun ThreePaneScaffoldNavigator<DestinationContent>.navigateToFolder(
     transferUuid: String,
     folderUuid: String,
 ) {
+    MatomoSwissTransfer.trackScreen("TransferDetailsFileListView")
     navigateTo(ListDetailPaneScaffoldRole.Detail, DestinationContent.FolderLevel(direction, transferUuid, folderUuid))
 }
 

From 070fdaa63fbf8513072a3f89788869f22fc6416c Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Thu, 20 Mar 2025 15:09:50 +0100
Subject: [PATCH 8/9] feat(Matomo): Use the new matomoValue of TransferType

---
 .../ui/screen/newtransfer/pickfiles/PickFilesScreen.kt       | 2 +-
 .../newtransfer/pickfiles/components/TransferTypeButtons.kt  | 5 -----
 2 files changed, 1 insertion(+), 6 deletions(-)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
index 6c08a9de1..1000a4cdb 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
@@ -157,7 +157,7 @@ fun PickFilesScreen(
         selectedTransferType = GetSetCallbacks(
             get = { selectedTransferType },
             set = { type ->
-                MatomoSwissTransfer.trackTransferTypeEvent(type.matomoValue)
+                MatomoSwissTransfer.trackTransferTypeEvent(type.dbValue.matomoValue)
                 pickFilesViewModel.selectTransferType(type)
             },
         ),
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/components/TransferTypeButtons.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/components/TransferTypeButtons.kt
index 66fcf5a91..685392694 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/components/TransferTypeButtons.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/components/TransferTypeButtons.kt
@@ -72,7 +72,6 @@ enum class TransferTypeUi(
     @StringRes val titleRes: Int,
     @StringRes @PluralsRes val descriptionRes: Int?,
     val dbValue: TransferType,
-    val matomoValue: String,
 ) {
     QrCode(
         buttonIcon = AppIcons.QrCode,
@@ -80,7 +79,6 @@ enum class TransferTypeUi(
         titleRes = R.string.uploadSuccessQrTitle,
         descriptionRes = null,
         dbValue = TransferType.QR_CODE,
-        matomoValue = "qrCode",
     ),
     Mail(
         buttonIcon = AppIcons.Envelope,
@@ -88,7 +86,6 @@ enum class TransferTypeUi(
         titleRes = R.string.uploadSuccessEmailTitle,
         descriptionRes = R.plurals.uploadSuccessEmailDescription,
         dbValue = TransferType.MAIL,
-        matomoValue = "email",
     ),
     Link(
         buttonIcon = AppIcons.Chain,
@@ -96,7 +93,6 @@ enum class TransferTypeUi(
         titleRes = R.string.uploadSuccessLinkTitle,
         descriptionRes = R.string.uploadSuccessLinkDescription,
         dbValue = TransferType.LINK,
-        matomoValue = "link",
     ),
     Proximity(
         buttonIcon = AppIcons.WifiWave,
@@ -104,7 +100,6 @@ enum class TransferTypeUi(
         titleRes = R.string.uploadSuccessLinkTitle,
         descriptionRes = R.string.uploadSuccessLinkDescription,
         dbValue = TransferType.PROXIMITY,
-        matomoValue = "proximity",
     );
 
     companion object {

From 0fae024ce0e5dd6a3706f0fad33e875ff085543d Mon Sep 17 00:00:00 2001
From: Fabian DEVEL <fabian.devel@infomaniak.com>
Date: Fri, 21 Mar 2025 10:32:07 +0100
Subject: [PATCH 9/9] feat(Matomo): Create a MatomoScreen enum to group all
 strings

---
 .../swisstransfer/ui/MatomoSwissTransfer.kt   | 25 ++++++++++++++++---
 .../ui/screen/main/received/ReceivedScreen.kt |  3 ++-
 .../ui/screen/main/sent/SentScreen.kt         |  3 ++-
 .../settings/SettingsDownloadsLimitScreen.kt  |  3 ++-
 .../settings/SettingsEmailLanguageScreen.kt   |  3 ++-
 .../ui/screen/main/settings/SettingsScreen.kt |  3 ++-
 .../main/settings/SettingsThemeScreen.kt      |  3 ++-
 .../settings/SettingsValidityPeriodScreen.kt  |  3 ++-
 .../settings/components/OptionScaffold.kt     |  7 +++---
 .../main/transfers/TransfersScreenWrapper.kt  |  9 +++++--
 .../NewTransferFilesDetailsScreen.kt          |  5 ++--
 .../newtransfer/pickfiles/PickFilesScreen.kt  |  3 ++-
 .../newtransfer/upload/UploadFailureScreen.kt |  3 ++-
 .../upload/UploadProgressScreen.kt            |  3 ++-
 .../newtransfer/upload/UploadRetryScreen.kt   |  3 ++-
 .../newtransfer/upload/UploadSuccessScreen.kt |  3 ++-
 .../validateemail/ValidateUserEmailScreen.kt  |  3 ++-
 17 files changed, 62 insertions(+), 23 deletions(-)

diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
index 443c54ada..6b0496d30 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/MatomoSwissTransfer.kt
@@ -30,7 +30,26 @@ import splitties.init.appCtx
 
 object MatomoSwissTransfer : Matomo {
 
-    const val UPLOAD_ERROR_SCREEN_TITLE = "UploadErrorView"
+    enum class MatomoScreen {
+        Sent,
+        Received,
+        Settings,
+        NewTransfer,
+        NewTransferFileList,
+        VerifyMail,
+        UploadProgress,
+        UploadError,
+        UploadSuccess,
+        SentTransferDetails,
+        ReceivedTransferDetails,
+        TransferDetailsFileList,
+        ThemeSetting,
+        ValidityPeriodSetting,
+        DownloadLimitSetting,
+        EmailLanguageSetting;
+
+        override fun toString() = "${name}View"
+    }
 
     private val scope = CoroutineScope(Dispatchers.Default)
 
@@ -50,8 +69,8 @@ object MatomoSwissTransfer : Matomo {
         }
     }
 
-    fun trackScreen(title: String) {
-        trackScreen(path = "/$title", title = title)
+    fun trackScreen(screen: MatomoScreen) {
+        trackScreen(path = "/$screen", title = screen.toString())
     }
 
     fun trackTransferTypeEvent(name: String) {
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt
index 54886e269..c63875463 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/received/ReceivedScreen.kt
@@ -31,6 +31,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection
 import com.infomaniak.swisstransfer.R
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar
 import com.infomaniak.swisstransfer.ui.components.EmptyState
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
@@ -63,7 +64,7 @@ fun ReceivedScreen(
 
     hasTransfer((uiState as? TransferUiState.Success)?.data?.isNotEmpty() == true)
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("ReceivedView") }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoScreen.Received) }
 
     ReceivedScreen(
         uiState = { uiState },
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt
index 159e838e6..f15fccb3c 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/sent/SentScreen.kt
@@ -32,6 +32,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection
 import com.infomaniak.swisstransfer.R
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar
 import com.infomaniak.swisstransfer.ui.components.NewTransferFab
 import com.infomaniak.swisstransfer.ui.components.NewTransferFabType
@@ -61,7 +62,7 @@ fun SentScreen(
 
     hasTransfer((uiState as? TransferUiState.Success)?.data?.isNotEmpty() == true)
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("SentView") }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoScreen.Sent) }
 
     LifecycleEventEffect(Lifecycle.Event.ON_RESUME) {
         transfersViewModel.fetchPendingTransfers()
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt
index b92de37b5..cd1f07ce2 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsDownloadsLimitScreen.kt
@@ -22,6 +22,7 @@ import androidx.compose.runtime.Composable
 import androidx.compose.ui.graphics.vector.ImageVector
 import com.infomaniak.multiplatform_swisstransfer.common.models.DownloadLimit
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.screen.main.settings.components.OptionScaffold
 import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingOption
 import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
@@ -38,7 +39,7 @@ fun SettingsDownloadsLimitScreen(
         optionTitleRes = R.string.settingsDownloadsLimitTitle,
         enumEntries = DownloadLimitOption.entries,
         selectedSettingOptionPosition = downloadLimit.ordinal,
-        matomoValue = "DownloadLimit",
+        matomoValue = MatomoScreen.DownloadLimitSetting,
         setSelectedSettingOptionPosition = { position -> onDownloadLimitChange(DownloadLimit.entries[position]) },
         navigateBack = navigateBack,
     )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt
index 262e7bce0..e8512aa6a 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsEmailLanguageScreen.kt
@@ -23,6 +23,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.res.stringResource
 import com.infomaniak.multiplatform_swisstransfer.common.models.EmailLanguage
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.screen.main.settings.components.OptionScaffold
 import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingOption
 import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
@@ -39,7 +40,7 @@ fun SettingsEmailLanguageScreen(
         optionTitleRes = R.string.settingsEmailLanguageTitle,
         enumEntries = EmailLanguageOption.entries,
         selectedSettingOptionPosition = emailLanguage.ordinal,
-        matomoValue = "EmailLanguage",
+        matomoValue = MatomoScreen.EmailLanguageSetting,
         setSelectedSettingOptionPosition = { position -> onEmailLanguageChange(EmailLanguage.entries[position]) },
         navigateBack = navigateBack,
     )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
index 0c86bef9d..a6a79d029 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsScreen.kt
@@ -37,6 +37,7 @@ import com.infomaniak.multiplatform_swisstransfer.common.models.ValidityPeriod
 import com.infomaniak.swisstransfer.BuildConfig
 import com.infomaniak.swisstransfer.R
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar
 import com.infomaniak.swisstransfer.ui.components.SmallWindowScreenTitle
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
@@ -68,7 +69,7 @@ fun SettingsScreen(
     val selectedSetting = getSelectedSetting()
     val windowAdaptiveInfo = LocalWindowAdaptiveInfo.current
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("SettingsView") }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoScreen.Settings) }
 
     SwissTransferScaffold(
         topBar = {
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
index 082995ad4..38adfdf3b 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsThemeScreen.kt
@@ -23,6 +23,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.res.stringResource
 import com.infomaniak.multiplatform_swisstransfer.common.models.Theme
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.images.AppImages.AppIcons
 import com.infomaniak.swisstransfer.ui.images.icons.CircleBlack
 import com.infomaniak.swisstransfer.ui.images.icons.CircleBlackAndWhite
@@ -43,7 +44,7 @@ fun SettingsThemeScreen(
         optionTitleRes = R.string.settingsThemeTitle,
         enumEntries = ThemeOption.entries,
         selectedSettingOptionPosition = theme.ordinal,
-        matomoValue = "Theme",
+        matomoValue = MatomoScreen.ThemeSetting,
         setSelectedSettingOptionPosition = { position -> onThemeUpdate(Theme.entries[position]) },
         navigateBack = navigateBack,
     )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt
index 52bf4b81c..3a559b49a 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/SettingsValidityPeriodScreen.kt
@@ -23,6 +23,7 @@ import androidx.compose.ui.graphics.vector.ImageVector
 import androidx.compose.ui.res.pluralStringResource
 import com.infomaniak.multiplatform_swisstransfer.common.models.ValidityPeriod
 import com.infomaniak.swisstransfer.R
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.screen.main.settings.components.OptionScaffold
 import com.infomaniak.swisstransfer.ui.screen.main.settings.components.SettingOption
 import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
@@ -39,7 +40,7 @@ fun SettingsValidityPeriodScreen(
         optionTitleRes = R.string.settingsValidityPeriodTitle,
         enumEntries = ValidityPeriodOption.entries,
         selectedSettingOptionPosition = validityPeriod.ordinal,
-        matomoValue = "ValidityPeriod",
+        matomoValue = MatomoScreen.ValidityPeriodSetting,
         setSelectedSettingOptionPosition = { position -> onValidityPeriodChange(ValidityPeriod.entries[position]) },
         navigateBack = navigateBack,
     )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/OptionScaffold.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/OptionScaffold.kt
index d33639c26..4d89a5807 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/OptionScaffold.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/settings/components/OptionScaffold.kt
@@ -26,6 +26,7 @@ import androidx.compose.runtime.saveable.rememberSaveable
 import androidx.compose.ui.Modifier
 import com.infomaniak.swisstransfer.R
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
 import com.infomaniak.swisstransfer.ui.components.TopAppBarButtons
 import com.infomaniak.swisstransfer.ui.screen.main.components.SwissTransferScaffold
@@ -41,13 +42,13 @@ fun OptionScaffold(
     @StringRes optionTitleRes: Int,
     enumEntries: List<SettingOption>,
     selectedSettingOptionPosition: Int,
-    matomoValue: String,
+    matomoValue: MatomoScreen,
     setSelectedSettingOptionPosition: (Int) -> Unit,
     navigateBack: (() -> Unit)?,
 ) {
     val windowAdaptiveInfo = LocalWindowAdaptiveInfo.current
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("${matomoValue}SettingView") }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(matomoValue) }
 
     SwissTransferScaffold(
         topBar = {
@@ -82,7 +83,7 @@ private fun Preview() {
             optionTitleRes = R.string.settingsThemeTitle,
             enumEntries = ThemeOption.entries,
             selectedSettingOptionPosition = 0,
-            matomoValue = "",
+            matomoValue = MatomoScreen.Sent,
             setSelectedSettingOptionPosition = {},
             navigateBack = {},
         )
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
index a7099d08f..082a2c911 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt
@@ -34,6 +34,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection
 import com.infomaniak.swisstransfer.R
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.*
 import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus
 import com.infomaniak.swisstransfer.ui.images.illus.mascotWithMagnifyingGlass.MascotWithMagnifyingGlass
@@ -141,7 +142,11 @@ private fun ThreePaneScaffoldNavigator<DestinationContent>.navigateToDetails(
     direction: TransferDirection,
     transferUuid: String,
 ) {
-    MatomoSwissTransfer.trackScreen("${direction.matomoValue}TransferDetailsView")
+    val matomoScreen = when (direction) {
+        TransferDirection.SENT -> MatomoScreen.SentTransferDetails
+        TransferDirection.RECEIVED -> MatomoScreen.ReceivedTransferDetails
+    }
+    MatomoSwissTransfer.trackScreen(matomoScreen)
     selectItem(context, windowAdaptiveInfo, DestinationContent.RootLevel(direction, transferUuid))
 }
 
@@ -151,7 +156,7 @@ private fun ThreePaneScaffoldNavigator<DestinationContent>.navigateToFolder(
     transferUuid: String,
     folderUuid: String,
 ) {
-    MatomoSwissTransfer.trackScreen("TransferDetailsFileListView")
+    MatomoSwissTransfer.trackScreen(MatomoScreen.TransferDetailsFileList)
     navigateTo(ListDetailPaneScaffoldRole.Detail, DestinationContent.FolderLevel(direction, transferUuid, folderUuid))
 }
 
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/filesdetails/NewTransferFilesDetailsScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/filesdetails/NewTransferFilesDetailsScreen.kt
index 098c824a9..c2d2f9535 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/filesdetails/NewTransferFilesDetailsScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/filesdetails/NewTransferFilesDetailsScreen.kt
@@ -28,14 +28,15 @@ import androidx.compose.ui.tooling.preview.PreviewParameter
 import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.FileUi
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.SinglePaneScaffold
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
 import com.infomaniak.swisstransfer.ui.components.TopAppBarButtons
 import com.infomaniak.swisstransfer.ui.components.transfer.FilesDetailsScreen
 import com.infomaniak.swisstransfer.ui.previewparameter.FileUiListPreviewParameter
 import com.infomaniak.swisstransfer.ui.screen.main.components.SwissTransferScaffold
-import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.PickFilesViewModel.FilesDetailsUiState
 import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.PickFilesViewModel
+import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.PickFilesViewModel.FilesDetailsUiState
 import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
 import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows
 
@@ -49,7 +50,7 @@ fun NewTransferFilesDetailsScreen(
 ) {
     val uiState by pickFilesViewModel.filesDetailsUiState.collectAsStateWithLifecycle()
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("NewTransferFileListView") }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoScreen.NewTransferFileList) }
     LaunchedEffect(uiState) {
         if (uiState is FilesDetailsUiState.EmptyFiles) navigateBack()
     }
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
index 1000a4cdb..a83882f3f 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/pickfiles/PickFilesScreen.kt
@@ -46,6 +46,7 @@ import com.infomaniak.core.mapSync
 import com.infomaniak.multiplatform_swisstransfer.common.interfaces.ui.FileUi
 import com.infomaniak.swisstransfer.R
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.*
 import com.infomaniak.swisstransfer.ui.previewparameter.FileUiListPreviewParameter
 import com.infomaniak.swisstransfer.ui.screen.main.settings.DownloadLimitOption
@@ -115,7 +116,7 @@ fun PickFilesScreen(
     HandleStartupFilePick(pickFilesViewModel.openFilePickerEvent, ::pickFiles)
 
     LaunchedEffect(Unit) {
-        MatomoSwissTransfer.trackScreen("NewTransferView")
+        MatomoSwissTransfer.trackScreen(MatomoScreen.NewTransfer)
         UploadForegroundService.uploadStateFlow.mapSync { it != null }.collect { isUploadOngoing ->
             if (isUploadOngoing) {
                 navigateToUploadProgress()
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
index c2044c516..84696fd16 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadFailureScreen.kt
@@ -30,6 +30,7 @@ import com.infomaniak.core.compose.basics.CallableState
 import com.infomaniak.swisstransfer.BuildConfig
 import com.infomaniak.swisstransfer.R
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.*
 import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus
 import com.infomaniak.swisstransfer.ui.images.illus.appIntegrity.GhostScrollCrossPointing
@@ -44,7 +45,7 @@ fun UploadFailureScreen(
     cancel: CallableState<Unit>,
 ) {
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoSwissTransfer.UPLOAD_ERROR_SCREEN_TITLE) }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoScreen.UploadError) }
 
     val failure: UploadState.Failure by failureState
     when (failure) {
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt
index d2a8e64a2..1b6588a44 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadProgressScreen.kt
@@ -29,6 +29,7 @@ import androidx.compose.ui.res.stringResource
 import com.infomaniak.core.R
 import com.infomaniak.swisstransfer.R.string
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.BottomStickyButtonScaffold
 import com.infomaniak.swisstransfer.ui.components.BrandTopAppBar
 import com.infomaniak.swisstransfer.ui.components.LargeButton
@@ -48,7 +49,7 @@ fun UploadOngoingScreen(
     onCancelClick: () -> Unit,
 ) {
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("UploadProgressView") }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoScreen.UploadProgress) }
 
     val progress by progressState
     BottomStickyButtonScaffold(
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
index 37c7dbd57..383dbd943 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadRetryScreen.kt
@@ -24,6 +24,7 @@ import androidx.compose.ui.res.stringResource
 import com.infomaniak.core.R
 import com.infomaniak.core.compose.basics.CallableState
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.*
 import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus
 import com.infomaniak.swisstransfer.ui.images.illus.uploadError.GhostMagnifyingGlassQuestionMark
@@ -56,7 +57,7 @@ private fun UploadRetryScreen(
     retry: CallableState<Unit>,
     edit: CallableState<Unit>,
 ) {
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoSwissTransfer.UPLOAD_ERROR_SCREEN_TITLE) }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoScreen.UploadError) }
 
     BottomStickyButtonScaffold(
         topBar = { BrandTopAppBar() },
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadSuccessScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadSuccessScreen.kt
index d53403b17..7b2eb5ea4 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadSuccessScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/upload/UploadSuccessScreen.kt
@@ -24,6 +24,7 @@ import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.platform.LocalContext
 import androidx.datastore.preferences.core.edit
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.screen.newtransfer.pickfiles.components.TransferTypeUi
 import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
 import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows
@@ -43,7 +44,7 @@ fun UploadSuccessScreen(
     // Now that we are done redirecting, we clear the value stored.
     LaunchedEffect(Unit) {
         context.lastTransferDataStore.edit { it.clear() }
-        MatomoSwissTransfer.trackScreen("UploadSuccessView")
+        MatomoSwissTransfer.trackScreen(MatomoScreen.UploadSuccess)
     }
 
     BackHandler(onBack = dismissCompleteUpload)
diff --git a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/validateemail/ValidateUserEmailScreen.kt b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/validateemail/ValidateUserEmailScreen.kt
index cdff24cfc..6d479bdbe 100644
--- a/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/validateemail/ValidateUserEmailScreen.kt
+++ b/app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/validateemail/ValidateUserEmailScreen.kt
@@ -40,6 +40,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle
 import com.infomaniak.core.sentry.SentryLog
 import com.infomaniak.swisstransfer.R
 import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
+import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer.MatomoScreen
 import com.infomaniak.swisstransfer.ui.components.BottomStickyButtonScaffold
 import com.infomaniak.swisstransfer.ui.components.LargeButton
 import com.infomaniak.swisstransfer.ui.components.SwissTransferTopAppBar
@@ -75,7 +76,7 @@ fun ValidateUserEmailScreen(
     val context = LocalContext.current
     val scope = rememberCoroutineScope()
 
-    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen("VerifyMailView") }
+    LaunchedEffect(Unit) { MatomoSwissTransfer.trackScreen(MatomoScreen.VerifyMail) }
 
     BackHandler { editTransfer() }