Skip to content

Commit ba103ae

Browse files
committed
feat(Matomo): Track principal screens
1 parent 7f6d265 commit ba103ae

File tree

4 files changed

+71
-14
lines changed

4 files changed

+71
-14
lines changed

app/src/main/java/com/infomaniak/swisstransfer/ui/navigation/NavigationDestination.kt

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import androidx.navigation.navDeepLink
2626
import androidx.navigation.toRoute
2727
import com.infomaniak.core.sentry.SentryLog
2828
import com.infomaniak.swisstransfer.BuildConfig
29+
import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
2930
import com.infomaniak.swisstransfer.ui.navigation.MainNavigation.SettingsDestination.getDeeplinkDirection
3031
import com.infomaniak.swisstransfer.ui.screen.main.DeeplinkViewModel.Companion.SENT_DEEPLINK_SUFFIX
3132
import com.infomaniak.swisstransfer.ui.screen.newtransfer.importfiles.components.TransferTypeUi
@@ -35,7 +36,7 @@ import kotlinx.serialization.Serializable
3536
* Sealed class representing the navigation arguments for the main navigation flow.
3637
*/
3738
@Serializable
38-
sealed class MainNavigation : NavigationDestination() {
39+
sealed class MainNavigation(override val matomoValue: String) : NavigationDestination() {
3940

4041
protected inline fun <reified T : MainNavigation> NavGraphBuilder.getDeeplinkDirection(
4142
noinline content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit),
@@ -50,7 +51,7 @@ sealed class MainNavigation : NavigationDestination() {
5051

5152
// If it has to be renamed, don't forget to rename `*DestinationName` in the companion object too.
5253
@Serializable
53-
data class SentDestination(val transferUuid: String? = null) : MainNavigation() {
54+
data class SentDestination(val transferUuid: String? = null) : MainNavigation("SentScreen") {
5455

5556
companion object {
5657
fun NavGraphBuilder.sentDestination(content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)) {
@@ -61,7 +62,7 @@ sealed class MainNavigation : NavigationDestination() {
6162

6263
// If it has to be renamed, don't forget to rename `*DestinationName` in the companion object too.
6364
@Serializable
64-
data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation() {
65+
data class ReceivedDestination(val transferUuid: String? = null) : MainNavigation("ReceivedScreen") {
6566

6667
companion object {
6768
fun NavGraphBuilder.receivedDestination(content: @Composable (AnimatedContentScope.(NavBackStackEntry) -> Unit)) {
@@ -71,7 +72,7 @@ sealed class MainNavigation : NavigationDestination() {
7172
}
7273

7374
@Serializable
74-
data object SettingsDestination : MainNavigation()
75+
data object SettingsDestination : MainNavigation("SettingsScreen")
7576

7677
companion object {
7778
private val TAG = MainNavigation::class.java.simpleName
@@ -110,48 +111,93 @@ sealed class MainNavigation : NavigationDestination() {
110111
* Sealed class representing the navigation arguments for the new transfer flow.
111112
*/
112113
@Serializable
113-
sealed class NewTransferNavigation : NavigationDestination() {
114+
sealed class NewTransferNavigation(override val matomoValue: String) : NavigationDestination() {
114115

115116
@Serializable
116-
data object ImportFilesDestination : NewTransferNavigation()
117+
data object ImportFilesDestination : NewTransferNavigation("ImportFileScreen")
117118

118119
@Serializable
119-
data class ValidateUserEmailDestination(val authorEmail: String) : NewTransferNavigation()
120+
data class ValidateUserEmailDestination(val authorEmail: String) : NewTransferNavigation("ValidateUserEmailScreen")
120121

121122
@Serializable
122123
data class UploadProgressDestination(
123124
val transferType: TransferTypeUi,
124125
val totalSize: Long,
125126
val authorEmail: String?,
126-
) : NewTransferNavigation()
127+
) : NewTransferNavigation("UploadProgressScreen")
127128

128129
@Serializable
129130
data class UploadSuccessDestination(
130131
val transferType: TransferTypeUi,
131132
val transferUuid: String,
132133
val transferUrl: String,
133-
) : NewTransferNavigation()
134+
) : NewTransferNavigation("UploadSuccessScreen")
134135

135136
@Serializable
136137
data class UploadErrorDestination(
137138
val transferType: TransferTypeUi,
138139
val totalSize: Long,
139140
val authorEmail: String?,
140-
) : NewTransferNavigation()
141+
) : NewTransferNavigation("UploadErrorScreen")
141142

142143
@Serializable
143-
data object UploadIntegrityErrorDestination : NewTransferNavigation()
144+
data object UploadIntegrityErrorDestination : NewTransferNavigation("UploadIntegrityErrorScreen")
144145

145146
@Serializable
146-
data object NewTransferFilesDetailsDestination : NewTransferNavigation()
147+
data object NewTransferFilesDetailsDestination : NewTransferNavigation("NewTransferFilesDetailsScreen")
147148

148149
companion object {
149150
val startDestination = ImportFilesDestination
151+
152+
private val TAG = NewTransferNavigation::class.java.simpleName
153+
154+
private const val importFilesDestinationName = "ImportFilesDestination"
155+
private const val ValidateUserEmailDestinationName = "ValidateUserEmailDestination"
156+
private const val UploadProgressDestinationName = "UploadProgressDestination"
157+
private const val UploadSuccessDestinationName = "UploadSuccessDestination"
158+
private const val UploadErrorDestinationName = "UploadErrorDestination"
159+
private const val UploadIntegrityErrorDestinationName = "UploadIntegrityErrorDestination"
160+
private const val NewTransferFilesDetailsDestinationName = "NewTransferFilesDetailsDestination"
161+
val newTransferDestinationsNames = listOf(
162+
importFilesDestinationName,
163+
ValidateUserEmailDestinationName,
164+
UploadProgressDestinationName,
165+
UploadSuccessDestinationName,
166+
UploadErrorDestinationName,
167+
UploadIntegrityErrorDestinationName,
168+
NewTransferFilesDetailsDestinationName,
169+
)
170+
171+
fun NavBackStackEntry.toNewTransferDestination(): NewTransferNavigation? {
172+
return runCatching {
173+
val destinationRoute = destination.route ?: error("Destination route cannot be empty")
174+
when (newTransferDestinationsNames.firstOrNull(destinationRoute::contains)) {
175+
importFilesDestinationName -> this.toRoute<ImportFilesDestination>()
176+
ValidateUserEmailDestinationName -> this.toRoute<ValidateUserEmailDestination>()
177+
UploadProgressDestinationName -> this.toRoute<UploadProgressDestination>()
178+
UploadSuccessDestinationName -> this.toRoute<UploadSuccessDestination>()
179+
UploadErrorDestinationName -> this.toRoute<UploadErrorDestination>()
180+
UploadIntegrityErrorDestinationName -> this.toRoute<UploadIntegrityErrorDestination>()
181+
NewTransferFilesDetailsDestinationName -> this.toRoute<NewTransferFilesDetailsDestination>()
182+
else -> error("Destination $destinationRoute is not handled")
183+
}
184+
}.getOrElse { exception ->
185+
SentryLog.e(TAG, "toNewTransferDestination: Failure", exception)
186+
null
187+
}
188+
}
150189
}
151190
}
152191

153192
/**
154193
* Sealed class representing navigation arguments with a title resource.
155194
*/
156195
@Serializable
157-
sealed class NavigationDestination
196+
sealed class NavigationDestination {
197+
198+
abstract val matomoValue: String
199+
200+
fun trackScreen() {
201+
MatomoSwissTransfer.trackScreen(path = "/$matomoValue", title = matomoValue)
202+
}
203+
}

app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/MainScreen.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ fun MainScreen(deeplinkTransferDirection: TransferDirection? = null) {
3636
val hideBottomBar = rememberSaveable { mutableStateOf(false) }
3737

3838
val currentDestination by remember(navBackStackEntry) {
39-
derivedStateOf { navBackStackEntry?.toMainDestination() ?: MainNavigation.startDestination }
39+
val destination = navBackStackEntry?.toMainDestination()
40+
destination?.trackScreen()
41+
derivedStateOf { destination ?: MainNavigation.startDestination }
4042
}
4143

4244
MainScaffold(

app/src/main/java/com/infomaniak/swisstransfer/ui/screen/main/transfers/TransfersScreenWrapper.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
3333
import androidx.lifecycle.compose.collectAsStateWithLifecycle
3434
import com.infomaniak.multiplatform_swisstransfer.common.models.TransferDirection
3535
import com.infomaniak.swisstransfer.R
36+
import com.infomaniak.swisstransfer.ui.MatomoSwissTransfer
3637
import com.infomaniak.swisstransfer.ui.components.*
3738
import com.infomaniak.swisstransfer.ui.images.AppImages.AppIllus
3839
import com.infomaniak.swisstransfer.ui.images.illus.mascotWithMagnifyingGlass.MascotWithMagnifyingGlass
@@ -140,6 +141,8 @@ private fun ThreePaneScaffoldNavigator<DestinationContent>.navigateToDetails(
140141
direction: TransferDirection,
141142
transferUuid: String,
142143
) {
144+
val destinationName = "${direction.name.lowercase()}TransferDetail"
145+
MatomoSwissTransfer.trackScreen(path = destinationName, title = destinationName)
143146
selectItem(context, windowAdaptiveInfo, DestinationContent.RootLevel(direction, transferUuid))
144147
}
145148

app/src/main/java/com/infomaniak/swisstransfer/ui/screen/newtransfer/NewTransferScreen.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@ import androidx.compose.runtime.saveable.rememberSaveable
2424
import androidx.compose.runtime.setValue
2525
import androidx.compose.ui.res.stringResource
2626
import androidx.hilt.navigation.compose.hiltViewModel
27+
import androidx.navigation.compose.currentBackStackEntryAsState
2728
import androidx.navigation.compose.rememberNavController
2829
import com.infomaniak.swisstransfer.R
2930
import com.infomaniak.swisstransfer.ui.components.ButtonType
3031
import com.infomaniak.swisstransfer.ui.components.SmallButton
3132
import com.infomaniak.swisstransfer.ui.components.SwissTransferAlertDialog
3233
import com.infomaniak.swisstransfer.ui.navigation.NewTransferNavigation
34+
import com.infomaniak.swisstransfer.ui.navigation.NewTransferNavigation.Companion.toNewTransferDestination
3335
import com.infomaniak.swisstransfer.ui.theme.SwissTransferTheme
3436
import com.infomaniak.swisstransfer.ui.utils.PreviewAllWindows
3537

@@ -41,8 +43,12 @@ fun NewTransferScreen(
4143
) {
4244

4345
val navController = rememberNavController()
46+
val navBackStackEntry by navController.currentBackStackEntryAsState()
47+
4448
var displayConfirmationDialog by rememberSaveable { mutableStateOf(false) }
4549

50+
navBackStackEntry?.toNewTransferDestination()?.trackScreen()
51+
4652
NewTransferNavHost(
4753
navController = navController,
4854
startDestination = startDestination,

0 commit comments

Comments
 (0)