diff --git a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt index 0feaf47029..313f4aafe0 100644 --- a/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt +++ b/appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInPresenter.kt @@ -71,7 +71,9 @@ class LoggedInPresenter @Inject constructor( } val verificationState by sessionVerificationService.sessionVerifiedStatus.collectAsState() val recoveryState by encryptionService.recoveryStateStateFlow.collectAsState() - reportCryptoStatusToAnalytics(verificationState, recoveryState) + LaunchedEffect(verificationState, recoveryState) { + reportCryptoStatusToAnalytics(verificationState, recoveryState) + } return LoggedInState( showSyncSpinner = showSyncSpinner, diff --git a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt index 2678c125e5..f57f648599 100644 --- a/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt +++ b/appnav/src/test/kotlin/io/element/android/appnav/loggedin/LoggedInPresenterTest.kt @@ -73,10 +73,11 @@ class LoggedInPresenterTest { @Test fun `present - report crypto status analytics`() = runTest { val analyticsService = FakeAnalyticsService() + val roomListService = FakeRoomListService() val verificationService = FakeSessionVerificationService() val encryptionService = FakeEncryptionService() val presenter = LoggedInPresenter( - matrixClient = FakeMatrixClient(encryptionService = encryptionService), + matrixClient = FakeMatrixClient(roomListService = roomListService, encryptionService = encryptionService), networkMonitor = FakeNetworkMonitor(NetworkStatus.Online), pushService = FakePushService(), sessionVerificationService = verificationService, @@ -90,17 +91,19 @@ class LoggedInPresenterTest { encryptionService.emitRecoveryState(RecoveryState.INCOMPLETE) verificationService.emitVerifiedStatus(SessionVerifiedStatus.Verified) - // Should only capture once (not report while checking state -like unknown-) - consumeItemsUntilPredicate { - analyticsService.capturedEvents.size == 1 && - analyticsService.capturedEvents[0] is CryptoSessionStateChange - } - consumeItemsUntilPredicate { - analyticsService.capturedUserProperties.size == 1 && - analyticsService.capturedUserProperties[0].recoveryState == UserProperties.RecoveryState.Incomplete && - analyticsService.capturedUserProperties[0].verificationState == UserProperties.VerificationState.Verified - } - cancelAndConsumeRemainingEvents() + skipItems(4) + + assertThat(analyticsService.capturedEvents.size).isEqualTo(1) + assertThat(analyticsService.capturedEvents[0]).isInstanceOf(CryptoSessionStateChange::class.java) + + assertThat(analyticsService.capturedUserProperties.size).isEqualTo(1) + assertThat(analyticsService.capturedUserProperties[0].recoveryState).isEqualTo(UserProperties.RecoveryState.Incomplete) + assertThat(analyticsService.capturedUserProperties[0].verificationState).isEqualTo(UserProperties.VerificationState.Verified) + + // ensure a sync status change does not trigger a new capture + roomListService.postSyncIndicator(RoomListService.SyncIndicator.Show) + skipItems(1) + assertThat(analyticsService.capturedEvents.size).isEqualTo(1) } }