From 24cd6a06f35a6a2beefa57c10b7943309bccd8ed Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Tue, 9 Dec 2025 18:04:12 +0100 Subject: [PATCH 1/3] DROID-4168 fix --- .../anytype/analytics/base/EventsDictionary.kt | 4 ++++ .../di/feature/widgets/CreateChatObjectDI.kt | 2 ++ .../feature_chats/presentation/ChatViewModel.kt | 9 +++++++++ .../presentation/spaces/SpaceSettingsViewModel.kt | 11 +++++++++++ .../widgets/CreateChatObjectViewModel.kt | 15 +++++++++++++++ 5 files changed, 41 insertions(+) diff --git a/analytics/src/main/java/com/anytypeio/anytype/analytics/base/EventsDictionary.kt b/analytics/src/main/java/com/anytypeio/anytype/analytics/base/EventsDictionary.kt index 1d415c4a21..28a536c9d0 100644 --- a/analytics/src/main/java/com/anytypeio/anytype/analytics/base/EventsDictionary.kt +++ b/analytics/src/main/java/com/anytypeio/anytype/analytics/base/EventsDictionary.kt @@ -194,6 +194,7 @@ object EventsDictionary { // Vault events const val screenVault = "ScreenVault" + const val screenChatInfo = "ScreenChatInfo" // About-app screen @@ -362,6 +363,9 @@ object EventsDictionary { const val chatClickScrollToMention = "ClickScrollToMention" const val chatClickScrollToReply = "ClickScrollToReply" + // Notification changes + const val changeMessageNotificationState = "ChangeMessageNotificationState" + // --- Vault menu --- const val chatScreenVaultCreateMenu = "ScreenVaultCreateMenu" const val chatClickVaultCreateMenuChat = "ClickVaultCreateMenuChat" diff --git a/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/CreateChatObjectDI.kt b/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/CreateChatObjectDI.kt index bb47273fc4..1a7bded2ae 100644 --- a/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/CreateChatObjectDI.kt +++ b/app/src/main/java/com/anytypeio/anytype/di/feature/widgets/CreateChatObjectDI.kt @@ -1,6 +1,7 @@ package com.anytypeio.anytype.di.feature.widgets import androidx.lifecycle.ViewModelProvider +import com.anytypeio.anytype.analytics.base.Analytics import com.anytypeio.anytype.core_utils.di.scope.PerScreen import com.anytypeio.anytype.di.common.ComponentDependencies import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers @@ -44,6 +45,7 @@ object CreateChatObjectModule { } interface CreateChatObjectDependencies : ComponentDependencies { + fun analytics(): Analytics fun repo(): BlockRepository fun dispatchers(): AppCoroutineDispatchers fun settings(): UserSettingsRepository diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt index 8c2417ce79..68d10b4c3b 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt @@ -1636,6 +1636,8 @@ class ChatViewModel @Inject constructor( val headerView = header.value if (headerView is HeaderView.ChatObject) { val name = headerView.title + // Fire analytics event for opening chat info screen + analytics.sendEvent(eventName = EventsDictionary.screenChatInfo) commands.emit( ViewModelCommand.OpenChatInfo( name = name, @@ -2126,6 +2128,13 @@ class ChatViewModel @Inject constructor( ) ).onSuccess { payload -> Timber.d("Notification setting changed successfully to: $setting") + // Fire analytics event for chat-level notification change + analytics.sendEvent( + eventName = EventsDictionary.changeMessageNotificationState, + props = Props( + mapOf(EventsPropertiesKey.uxType to "Space") + ) + ) }.onFailure { e -> Timber.e(e, "Failed to change notification setting") // Revert header to previous state on error diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/spaces/SpaceSettingsViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/spaces/SpaceSettingsViewModel.kt index 133d3bd944..bcd981c6d8 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/spaces/SpaceSettingsViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/spaces/SpaceSettingsViewModel.kt @@ -1000,6 +1000,17 @@ class SpaceSettingsViewModel( onSuccess = { _notificationState.value = newState Timber.d("Successfully set notification state to: $newState for space: $targetSpaceId") + // Fire analytics event for space-level notification change if it's a chat/one-to-one space + val spaceView = spaceViewContainer.get(vmParams.space) + if (spaceView != null && + (spaceView.spaceUxType == SpaceUxType.CHAT || spaceView.spaceUxType == SpaceUxType.ONE_TO_ONE)) { + analytics.sendEvent( + eventName = EventsDictionary.changeMessageNotificationState, + props = Props( + mapOf(EventsPropertiesKey.uxType to "Chat") + ) + ) + } }, onFailure = { error -> Timber.e("Failed to set notification state: $error") diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/CreateChatObjectViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/CreateChatObjectViewModel.kt index 5982d25d2e..8a888d5133 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/CreateChatObjectViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/CreateChatObjectViewModel.kt @@ -3,6 +3,11 @@ package com.anytypeio.anytype.presentation.widgets import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope +import com.anytypeio.anytype.analytics.base.Analytics +import com.anytypeio.anytype.analytics.base.EventsDictionary +import com.anytypeio.anytype.analytics.base.EventsPropertiesKey +import com.anytypeio.anytype.analytics.base.sendEvent +import com.anytypeio.anytype.analytics.props.Props import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.Name @@ -26,6 +31,7 @@ import timber.log.Timber class CreateChatObjectViewModel( private val vmParams: VmParams, + private val analytics: Analytics, private val createObject: CreateObject, private val uploadFile: UploadFile, private val setObjectDetails: SetObjectDetails @@ -139,6 +145,13 @@ class CreateChatObjectViewModel( } private suspend fun finishCreation(objectId: Id) { + // Fire CreateObject analytics event + analytics.sendEvent( + eventName = EventsDictionary.objectCreate, + props = Props( + mapOf(EventsPropertiesKey.objectType to "_otchatDerived") + ) + ) isLoading.value = false commands.emit(Command.ChatObjectCreated(objectId = objectId)) } @@ -171,6 +184,7 @@ class CreateChatObjectViewModel( class Factory @Inject constructor( private val vmParams: VmParams, + private val analytics: Analytics, private val createObject: CreateObject, private val uploadFile: UploadFile, private val setObjectDetails: SetObjectDetails @@ -180,6 +194,7 @@ class CreateChatObjectViewModel( modelClass: Class ) = CreateChatObjectViewModel( vmParams = vmParams, + analytics = analytics, createObject = createObject, uploadFile = uploadFile, setObjectDetails = setObjectDetails From 4dbf33213fd5492438813cebd5b441c36bcbe1a1 Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Tue, 9 Dec 2025 18:08:24 +0100 Subject: [PATCH 2/3] DROID-4168 fixes --- .../anytype/feature_chats/presentation/ChatViewModel.kt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt index 68d10b4c3b..c1bdc18eb5 100644 --- a/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt +++ b/feature-chats/src/main/java/com/anytypeio/anytype/feature_chats/presentation/ChatViewModel.kt @@ -2130,10 +2130,7 @@ class ChatViewModel @Inject constructor( Timber.d("Notification setting changed successfully to: $setting") // Fire analytics event for chat-level notification change analytics.sendEvent( - eventName = EventsDictionary.changeMessageNotificationState, - props = Props( - mapOf(EventsPropertiesKey.uxType to "Space") - ) + eventName = EventsDictionary.changeMessageNotificationState ) }.onFailure { e -> Timber.e(e, "Failed to change notification setting") From 1e669cfb476a78c8c4dfc45cff8c93a5c1726572 Mon Sep 17 00:00:00 2001 From: Evgenii Kozlov Date: Tue, 9 Dec 2025 18:16:01 +0100 Subject: [PATCH 3/3] DROID-4168 fix --- .../anytype/presentation/widgets/CreateChatObjectViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/CreateChatObjectViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/CreateChatObjectViewModel.kt index 8a888d5133..6ccbf17de6 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/CreateChatObjectViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/CreateChatObjectViewModel.kt @@ -149,7 +149,7 @@ class CreateChatObjectViewModel( analytics.sendEvent( eventName = EventsDictionary.objectCreate, props = Props( - mapOf(EventsPropertiesKey.objectType to "_otchatDerived") + mapOf(EventsPropertiesKey.objectType to ObjectTypeIds.CHAT_DERIVED) ) ) isLoading.value = false