From 766c23721e4511c37b6d3bbdd0a024959043b51f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mart=C3=ADn?= Date: Wed, 19 Nov 2025 17:24:35 +0100 Subject: [PATCH] Have long running analytic transactions return actual transactions. Also add `AnalyticsService.getLongRunningTransaction` and change `AnalyticsService.stopLongRunningTransaction` to `removeLongRunningTransaction`. --- .../matrix/impl/roomlist/RoomListFactory.kt | 2 +- .../services/analytics/api/AnalyticsService.kt | 15 +++++++++++++-- .../analytics/impl/DefaultAnalyticsService.kt | 14 ++++++++++---- .../analytics/noop/NoopAnalyticsService.kt | 5 +++-- .../analytics/test/FakeAnalyticsService.kt | 15 +++++++++++++-- 5 files changed, 40 insertions(+), 11 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt index 4e342f3a48..1fd0871019 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/roomlist/RoomListFactory.kt @@ -73,7 +73,7 @@ internal class RoomListFactory( initialFilterKind = RoomListEntriesDynamicFilterKind.All(ROOM_LIST_RUST_FILTERS), ).onEach { update -> if (!firstRoomsTransaction.isFinished()) { - analyticsService.stopLongRunningTransaction(AnalyticsLongRunningTransaction.FirstRoomsDisplayed) + analyticsService.removeLongRunningTransaction(AnalyticsLongRunningTransaction.FirstRoomsDisplayed)?.finish() firstRoomsTransaction.finish() } processor.postUpdate(update) diff --git a/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt b/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt index a936f47be1..726ec4180d 100644 --- a/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt +++ b/services/analytics/api/src/main/kotlin/io/element/android/services/analytics/api/AnalyticsService.kt @@ -55,9 +55,20 @@ interface AnalyticsService : AnalyticsTracker, ErrorTracker { */ fun startTransaction(name: String, operation: String? = null): AnalyticsTransaction - fun startLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) + /** + * Starts an [AnalyticsLongRunningTransaction], that can be shared with other components. + */ + fun startLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction - fun stopLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) + /** + * Gets an ongoing [AnalyticsLongRunningTransaction], if it exists. + */ + fun getLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? + + /** + * Removes an ongoing [AnalyticsLongRunningTransaction] so it's no longer shared. + */ + fun removeLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? } inline fun AnalyticsService.recordTransaction(name: String, operation: String, block: (AnalyticsTransaction) -> T): T { diff --git a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt index e773212f33..83c76dc2fe 100644 --- a/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt +++ b/services/analytics/impl/src/main/kotlin/io/element/android/services/analytics/impl/DefaultAnalyticsService.kt @@ -153,11 +153,17 @@ class DefaultAnalyticsService( } ?: NoopAnalyticsTransaction } - override fun startLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) { - pendingLongRunningTransactions[longRunningTransaction] = startTransaction(longRunningTransaction.name, longRunningTransaction.operation) + override fun startLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction { + val transaction = startTransaction(longRunningTransaction.name, longRunningTransaction.operation) + pendingLongRunningTransactions[longRunningTransaction] = transaction + return transaction } - override fun stopLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) { - pendingLongRunningTransactions.remove(longRunningTransaction)?.finish() + override fun getLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? { + return pendingLongRunningTransactions[longRunningTransaction] + } + + override fun removeLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? { + return pendingLongRunningTransactions.remove(longRunningTransaction) } } diff --git a/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt b/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt index a2175231a4..36eeaa0aa2 100644 --- a/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt +++ b/services/analytics/noop/src/main/kotlin/io/element/android/services/analytics/noop/NoopAnalyticsService.kt @@ -39,6 +39,7 @@ class NoopAnalyticsService : AnalyticsService { override fun trackError(throwable: Throwable) = Unit override fun updateSuperProperties(updatedProperties: SuperProperties) = Unit override fun startTransaction(name: String, operation: String?): AnalyticsTransaction = NoopAnalyticsTransaction - override fun startLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) {} - override fun stopLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) {} + override fun startLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction = NoopAnalyticsTransaction + override fun getLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? = null + override fun removeLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) = NoopAnalyticsTransaction } diff --git a/services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt b/services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt index c83e0119ed..9899ced193 100644 --- a/services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt +++ b/services/analytics/test/src/main/kotlin/io/element/android/services/analytics/test/FakeAnalyticsService.kt @@ -31,6 +31,7 @@ class FakeAnalyticsService( val screenEvents = mutableListOf() val trackedErrors = mutableListOf() val capturedUserProperties = mutableListOf() + val longRunningTransactions = mutableMapOf() override fun getAvailableAnalyticsProviders(): Set = emptySet() @@ -70,6 +71,16 @@ class FakeAnalyticsService( } override fun startTransaction(name: String, operation: String?): AnalyticsTransaction = NoopAnalyticsTransaction - override fun startLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) {} - override fun stopLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction) {} + override fun startLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction { + longRunningTransactions[longRunningTransaction] = NoopAnalyticsTransaction + return NoopAnalyticsTransaction + } + + override fun getLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? { + return longRunningTransactions[longRunningTransaction] + } + + override fun removeLongRunningTransaction(longRunningTransaction: AnalyticsLongRunningTransaction): AnalyticsTransaction? { + return longRunningTransactions.remove(longRunningTransaction) + } }