From 8ab32bfaa09d78611e46322afede5ca077bd82cc Mon Sep 17 00:00:00 2001 From: Yoan Pintas Date: Thu, 29 Jun 2023 15:39:34 +0200 Subject: [PATCH] Add analytics tracking for some screens (#698) --- features/roomdetails/impl/build.gradle.kts | 1 + .../features/roomdetails/impl/RoomDetailsNode.kt | 12 ++++++++++++ .../roomdetails/impl/edit/RoomDetailsEditNode.kt | 12 ++++++++++++ .../roomdetails/impl/invite/RoomInviteMembersNode.kt | 12 ++++++++++++ .../roomdetails/impl/members/RoomMemberListNode.kt | 12 ++++++++++++ .../impl/members/details/RoomMemberDetailsNode.kt | 12 ++++++++++++ features/roomlist/impl/build.gradle.kts | 1 + .../android/features/roomlist/impl/RoomListNode.kt | 12 ++++++++++++ 8 files changed, 74 insertions(+) diff --git a/features/roomdetails/impl/build.gradle.kts b/features/roomdetails/impl/build.gradle.kts index a1d12ba40e..0965cf484a 100644 --- a/features/roomdetails/impl/build.gradle.kts +++ b/features/roomdetails/impl/build.gradle.kts @@ -47,6 +47,7 @@ dependencies { api(projects.services.apperror.api) implementation(libs.coil.compose) implementation(projects.features.leaveroom.api) + implementation(projects.services.analytics.api) testImplementation(libs.test.junit) testImplementation(libs.coroutines.test) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt index 77153ad62d..4eb70d96e3 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/RoomDetailsNode.kt @@ -20,18 +20,21 @@ import android.content.Context import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject +import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode import io.element.android.libraries.androidutils.system.startSharePlainTextIntent import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.matrix.api.room.RoomMember +import io.element.android.services.analytics.api.AnalyticsService import timber.log.Timber import io.element.android.libraries.androidutils.R as AndroidUtilsR @@ -41,6 +44,7 @@ class RoomDetailsNode @AssistedInject constructor( @Assisted plugins: List, private val presenter: RoomDetailsPresenter, private val room: MatrixRoom, + private val analyticsService: AnalyticsService, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { @@ -51,6 +55,14 @@ class RoomDetailsNode @AssistedInject constructor( private val callbacks = plugins() + init { + lifecycle.subscribe( + onResume = { + analyticsService.screen(MobileScreen(screenName = MobileScreen.ScreenName.RoomDetails)) + } + ) + } + private fun openRoomMemberList() { callbacks.forEach { it.openRoomMemberList() } } diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditNode.kt index af05b547b2..e81cd84c24 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/edit/RoomDetailsEditNode.kt @@ -18,21 +18,33 @@ package io.element.android.features.roomdetails.impl.edit import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import dagger.assisted.Assisted import dagger.assisted.AssistedInject +import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode import io.element.android.libraries.di.RoomScope +import io.element.android.services.analytics.api.AnalyticsService @ContributesNode(RoomScope::class) class RoomDetailsEditNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, private val presenter: RoomDetailsEditPresenter, + private val analyticsService: AnalyticsService, ) : Node(buildContext, plugins = plugins) { + init { + lifecycle.subscribe( + onResume = { + analyticsService.screen(MobileScreen(screenName = MobileScreen.ScreenName.RoomSettings)) + } + ) + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt index 8b318e7ead..37646aedfc 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/invite/RoomInviteMembersNode.kt @@ -19,16 +19,19 @@ package io.element.android.features.roomdetails.impl.invite import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import dagger.assisted.Assisted import dagger.assisted.AssistedInject +import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.room.MatrixRoom import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.services.analytics.api.AnalyticsService import io.element.android.services.apperror.api.AppErrorStateService import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob @@ -42,10 +45,19 @@ class RoomInviteMembersNode @AssistedInject constructor( private val room: MatrixRoom, private val presenter: RoomInviteMembersPresenter, private val appErrorStateService: AppErrorStateService, + private val analyticsService: AnalyticsService, ) : Node(buildContext, plugins = plugins) { private val coroutineScope = CoroutineScope(SupervisorJob() + coroutineDispatchers.io) + init { + lifecycle.subscribe( + onResume = { + analyticsService.screen(MobileScreen(screenName = MobileScreen.ScreenName.Invites)) + } + ) + } + @Composable override fun View(modifier: Modifier) { val state = presenter.present() diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt index f37ea1229b..6145ca79d8 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListNode.kt @@ -18,21 +18,25 @@ package io.element.android.features.roomdetails.impl.members import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject +import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.UserId +import io.element.android.services.analytics.api.AnalyticsService @ContributesNode(RoomScope::class) class RoomMemberListNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, private val presenter: RoomMemberListPresenter, + private val analyticsService: AnalyticsService, ) : Node(buildContext, plugins = plugins) { interface Callback : Plugin { @@ -42,6 +46,14 @@ class RoomMemberListNode @AssistedInject constructor( private val callbacks = plugins() + init { + lifecycle.subscribe( + onResume = { + analyticsService.screen(MobileScreen(screenName = MobileScreen.ScreenName.RoomMembers)) + } + ) + } + private fun openRoomMemberDetails(roomMemberId: UserId) { callbacks.forEach { it.openRoomMemberDetails(roomMemberId) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt index bd4258ac88..5425fdf79a 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/details/RoomMemberDetailsNode.kt @@ -19,11 +19,13 @@ package io.element.android.features.roomdetails.impl.members.details import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import dagger.assisted.Assisted import dagger.assisted.AssistedInject +import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode import io.element.android.features.roomdetails.impl.R import io.element.android.libraries.androidutils.system.startSharePlainTextIntent @@ -32,6 +34,7 @@ import io.element.android.libraries.architecture.inputs import io.element.android.libraries.di.RoomScope import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.permalink.PermalinkBuilder +import io.element.android.services.analytics.api.AnalyticsService import timber.log.Timber import io.element.android.libraries.androidutils.R as AndroidUtilsR @@ -39,6 +42,7 @@ import io.element.android.libraries.androidutils.R as AndroidUtilsR class RoomMemberDetailsNode @AssistedInject constructor( @Assisted buildContext: BuildContext, @Assisted plugins: List, + private val analyticsService: AnalyticsService, presenterFactory: RoomMemberDetailsPresenter.Factory, ) : Node(buildContext, plugins = plugins) { @@ -49,6 +53,14 @@ class RoomMemberDetailsNode @AssistedInject constructor( private val inputs = inputs() private val presenter = presenterFactory.create(inputs.roomMemberId) + init { + lifecycle.subscribe( + onResume = { + analyticsService.screen(MobileScreen(screenName = MobileScreen.ScreenName.User)) + } + ) + } + @Composable override fun View(modifier: Modifier) { val context = LocalContext.current diff --git a/features/roomlist/impl/build.gradle.kts b/features/roomlist/impl/build.gradle.kts index be5ac09484..302e54fe09 100644 --- a/features/roomlist/impl/build.gradle.kts +++ b/features/roomlist/impl/build.gradle.kts @@ -52,6 +52,7 @@ dependencies { implementation(projects.features.invitelist.api) implementation(projects.features.networkmonitor.api) implementation(projects.features.leaveroom.api) + implementation(projects.services.analytics.api) implementation(libs.accompanist.placeholder) api(projects.features.roomlist.api) ksp(libs.showkase.processor) diff --git a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt index 55903fb961..6e1bbd64d3 100644 --- a/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt +++ b/features/roomlist/impl/src/main/kotlin/io/element/android/features/roomlist/impl/RoomListNode.kt @@ -20,18 +20,21 @@ import android.app.Activity import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import com.bumble.appyx.core.lifecycle.subscribe import com.bumble.appyx.core.modality.BuildContext import com.bumble.appyx.core.node.Node import com.bumble.appyx.core.plugin.Plugin import com.bumble.appyx.core.plugin.plugins import dagger.assisted.Assisted import dagger.assisted.AssistedInject +import im.vector.app.features.analytics.plan.MobileScreen import io.element.android.anvilannotations.ContributesNode import io.element.android.features.roomlist.api.RoomListEntryPoint import io.element.android.features.roomlist.impl.components.RoomListMenuAction import io.element.android.libraries.deeplink.usecase.InviteFriendsUseCase import io.element.android.libraries.di.SessionScope import io.element.android.libraries.matrix.api.core.RoomId +import io.element.android.services.analytics.api.AnalyticsService @ContributesNode(SessionScope::class) class RoomListNode @AssistedInject constructor( @@ -39,8 +42,17 @@ class RoomListNode @AssistedInject constructor( @Assisted plugins: List, private val presenter: RoomListPresenter, private val inviteFriendsUseCase: InviteFriendsUseCase, + private val analyticsService: AnalyticsService, ) : Node(buildContext, plugins = plugins) { + init { + lifecycle.subscribe( + onResume = { + analyticsService.screen(MobileScreen(screenName = MobileScreen.ScreenName.Home)) + } + ) + } + private fun onRoomClicked(roomId: RoomId) { plugins().forEach { it.onRoomClicked(roomId) } }