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 3b8843eb6b..e32421e7f4 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 @@ -191,6 +191,8 @@ object EventsDictionary { const val CLICK_ONBOARDING_TOOLTIP_TYPE_CLOSE = "Close" // Sharing spaces + + const val clickQuote = "ClickQuote" const val shareSpace = "ShareSpace" const val screenSettingsSpaceShare = "ScreenSettingsSpaceShare" const val screenStopShare = "ScreenStopShare" diff --git a/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreen.kt b/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreen.kt index 178b3e66f5..d1e684c1e0 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreen.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreen.kt @@ -91,11 +91,11 @@ fun HomeScreen( onHomeButtonClicked: () -> Unit, onCreateNewObjectClicked: () -> Unit, onCreateNewObjectLongClicked: () -> Unit, - onShareButtonClicked: () -> Unit, + onNavBarShareButtonClicked: () -> Unit, onObjectCheckboxClicked: (Id, Boolean) -> Unit, onSpaceWidgetClicked: () -> Unit, onMove: (List, FromIndex, ToIndex) -> Unit, - onSpaceShareIconClicked: (ObjectWrapper.SpaceView) -> Unit, + onSpaceWidgetShareIconClicked: (ObjectWrapper.SpaceView) -> Unit, onSeeAllObjectsClicked: (WidgetView.Gallery) -> Unit, onCreateObjectInsideWidget: (Id) -> Unit, onCreateDataViewObject: (WidgetId, ViewId?) -> Unit @@ -116,7 +116,7 @@ fun HomeScreen( onSpaceWidgetClicked = onSpaceWidgetClicked, onMove = onMove, onObjectCheckboxClicked = onObjectCheckboxClicked, - onSpaceShareIconClicked = onSpaceShareIconClicked, + onSpaceWidgetShareIconClicked = onSpaceWidgetShareIconClicked, onSeeAllObjectsClicked = onSeeAllObjectsClicked, onCreateWidget = onCreateWidget, onCreateObjectInsideWidget = onCreateObjectInsideWidget, @@ -162,7 +162,7 @@ fun HomeScreen( searchClick = onSearchClicked, addDocClick = onCreateNewObjectClicked, addDocLongClick = onCreateNewObjectLongClicked, - onShareButtonClicked = onShareButtonClicked, + onShareButtonClicked = onNavBarShareButtonClicked, onHomeButtonClicked = onHomeButtonClicked ) } @@ -187,7 +187,7 @@ private fun WidgetList( onMove: (List, FromIndex, ToIndex) -> Unit, onObjectCheckboxClicked: (Id, Boolean) -> Unit, onSpaceWidgetClicked: () -> Unit, - onSpaceShareIconClicked: (ObjectWrapper.SpaceView) -> Unit, + onSpaceWidgetShareIconClicked: (ObjectWrapper.SpaceView) -> Unit, onSeeAllObjectsClicked: (WidgetView.Gallery) -> Unit, onCreateWidget: () -> Unit, onCreateObjectInsideWidget: (Id) -> Unit, @@ -229,7 +229,7 @@ private fun WidgetList( name = item.space.name.orEmpty(), icon = item.icon, spaceType = item.type, - onSpaceShareIconClicked = { onSpaceShareIconClicked(item.space) }, + onSpaceShareIconClicked = { onSpaceWidgetShareIconClicked(item.space) }, isShared = item.isShared, membersCount = item.membersCount ) diff --git a/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreenFragment.kt b/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreenFragment.kt index cb7b82ed4b..52740891da 100644 --- a/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreenFragment.kt +++ b/app/src/main/java/com/anytypeio/anytype/ui/home/HomeScreenFragment.kt @@ -112,7 +112,7 @@ class HomeScreenFragment : BaseComposeFragment(), ) { HomeScreenToolbar( spaceIconView = view?.icon ?: SpaceIconView.Loading, - onSpaceIconClicked = vm::onSpaceSettingsClicked, + onSpaceIconClicked = vm::onSpaceWidgetClicked, membersCount = view?.membersCount ?: 0, name = view?.space?.name.orEmpty(), onBackButtonClicked = { @@ -176,16 +176,16 @@ class HomeScreenFragment : BaseComposeFragment(), onClick = { vm.onCreateNewObjectLongClicked() } ), onSpaceWidgetClicked = throttledClick( - onClick = vm::onSpaceSettingsClicked + onClick = vm::onSpaceWidgetClicked ), onBundledWidgetClicked = vm::onBundledWidgetClicked, onMove = vm::onMove, onObjectCheckboxClicked = vm::onObjectCheckboxClicked, - onSpaceShareIconClicked = vm::onSpaceShareIconClicked, + onSpaceWidgetShareIconClicked = vm::onSpaceWidgetShareIconClicked, onSeeAllObjectsClicked = vm::onSeeAllObjectsClicked, onCreateObjectInsideWidget = vm::onCreateObjectInsideWidget, onCreateDataViewObject = vm::onCreateDataViewObject, - onShareButtonClicked = vm::onSpaceShareIconClicked, + onNavBarShareButtonClicked = vm::onNavBarShareIconClicked, navPanelState = vm.navPanelState.collectAsStateWithLifecycle().value, onHomeButtonClicked = vm::onHomeButtonClicked, ) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/EditorViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/EditorViewModel.kt index 2e56052da3..5b77ee97c0 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/EditorViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/editor/EditorViewModel.kt @@ -257,6 +257,7 @@ import com.anytypeio.anytype.presentation.editor.model.OnEditorDatePickerEvent.O import com.anytypeio.anytype.presentation.extension.getFileDetailsForBlock import com.anytypeio.anytype.presentation.extension.getUrlForFileContent import com.anytypeio.anytype.presentation.navigation.NavPanelState +import com.anytypeio.anytype.presentation.navigation.leftButtonClickAnalytics import com.anytypeio.anytype.presentation.objects.getCreateObjectParams import com.anytypeio.anytype.presentation.objects.getObjectTypeViewsForSBPage import com.anytypeio.anytype.presentation.objects.getProperType @@ -292,6 +293,7 @@ import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach @@ -1196,12 +1198,14 @@ class EditorViewModel( } fun onShareButtonClicked() { + proceedWithLeftButtonAnalytics() dispatch( Command.OpenShareScreen(vmParams.space) ) } fun onHomeButtonClicked() { + proceedWithLeftButtonAnalytics() Timber.d("onHomeButtonClicked, ") if (stateData.value == ViewState.NotExist) { exitToSpaceHome() @@ -1214,6 +1218,12 @@ class EditorViewModel( exitBack() } + private fun proceedWithLeftButtonAnalytics() { + viewModelScope.launch { + navPanelState.firstOrNull()?.leftButtonClickAnalytics(analytics) + } + } + private fun exitBack() { when (session.value) { Session.ERROR -> navigate(EventWrapper(AppNavigation.Command.Exit)) diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt index 35bda38c68..b11f588079 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/home/HomeScreenViewModel.kt @@ -91,6 +91,7 @@ import com.anytypeio.anytype.presentation.home.Command.ChangeWidgetType.Companio import com.anytypeio.anytype.presentation.navigation.DeepLinkToObjectDelegate import com.anytypeio.anytype.presentation.navigation.NavPanelState import com.anytypeio.anytype.presentation.navigation.NavigationViewModel +import com.anytypeio.anytype.presentation.navigation.leftButtonClickAnalytics import com.anytypeio.anytype.presentation.objects.getCreateObjectParams import com.anytypeio.anytype.presentation.search.Subscriptions import com.anytypeio.anytype.presentation.sets.prefillNewObjectDetails @@ -1764,7 +1765,7 @@ class HomeScreenViewModel( } } - fun onSpaceShareIconClicked(spaceView: ObjectWrapper.SpaceView) { + fun onSpaceWidgetShareIconClicked(spaceView: ObjectWrapper.SpaceView) { viewModelScope.launch { val space = spaceView.targetSpaceId if (space != null) { @@ -1775,19 +1776,20 @@ class HomeScreenViewModel( } } - fun onSpaceShareIconClicked() { + fun onNavBarShareIconClicked() { viewModelScope.launch { - commands.emit( - Command.ShareSpace(SpaceId(spaceManager.get())) - ) + navPanelState.value.leftButtonClickAnalytics(analytics) + } + viewModelScope.launch { + commands.emit(Command.ShareSpace(SpaceId(spaceManager.get()))) } } fun onHomeButtonClicked() { - // Do nothing + // Do nothing, as home button is not visible on space home screen. } - fun onSpaceSettingsClicked() { + fun onSpaceWidgetClicked() { viewModelScope.launch { commands.emit( Command.OpenSpaceSettings( @@ -1825,10 +1827,6 @@ class HomeScreenViewModel( } } - fun onBackLongClicked() { - navigate(destination = Navigation.OpenSpaceSwitcher) - } - override fun onCleared() { super.onCleared() Timber.d("onCleared") diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/navigation/NavPanelState.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/navigation/NavPanelState.kt index 770785be20..5fd319e0b2 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/navigation/NavPanelState.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/navigation/NavPanelState.kt @@ -1,5 +1,10 @@ package com.anytypeio.anytype.presentation.navigation +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.multiplayer.SpaceMemberPermissions sealed class NavPanelState { @@ -68,4 +73,46 @@ sealed class NavPanelState { } } } +} + +suspend fun NavPanelState.leftButtonClickAnalytics(analytics: Analytics) { + when (val state = this) { + is NavPanelState.Default -> { + when (state.leftButtonState) { + is NavPanelState.LeftButtonState.AddMembers -> { + analytics.sendEvent( + eventName = EventsDictionary.screenSettingsSpaceShare, + props = Props( + mapOf( + EventsPropertiesKey.route to EventsDictionary.Routes.navigation + ) + ) + ) + } + + is NavPanelState.LeftButtonState.Comment -> { + analytics.sendEvent(eventName = EventsDictionary.clickQuote) + } + + NavPanelState.LeftButtonState.Home -> { + // Do nothing. + } + + NavPanelState.LeftButtonState.ViewMembers -> { + analytics.sendEvent( + eventName = EventsDictionary.screenSettingsSpaceMembers, + props = Props( + mapOf( + EventsPropertiesKey.route to EventsDictionary.Routes.navigation + ) + ) + ) + } + } + } + + NavPanelState.Init -> { + // Do nothing. + } + } } \ No newline at end of file diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt index 961aced6f1..768296173e 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/sets/ObjectSetViewModel.kt @@ -77,6 +77,7 @@ import com.anytypeio.anytype.presentation.navigation.SupportNavigation import com.anytypeio.anytype.core_models.SupportedLayouts import com.anytypeio.anytype.core_models.TimeInMillis import com.anytypeio.anytype.presentation.navigation.NavPanelState +import com.anytypeio.anytype.presentation.navigation.leftButtonClickAnalytics import com.anytypeio.anytype.presentation.objects.getCreateObjectParams import com.anytypeio.anytype.presentation.objects.isCreateObjectAllowed import com.anytypeio.anytype.presentation.objects.isTemplatesAllowed @@ -126,6 +127,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapLatest @@ -1624,6 +1626,9 @@ class ObjectSetViewModel( } fun onHomeButtonClicked() { + viewModelScope.launch { + navPanelState.firstOrNull()?.leftButtonClickAnalytics(analytics) + } viewModelScope.launch { dispatch(AppNavigation.Command.ExitToSpaceHome) } @@ -1631,11 +1636,10 @@ class ObjectSetViewModel( fun onShareButtonClicked() { viewModelScope.launch { - dispatch( - AppNavigation.Command.OpenShareScreen( - vmParams.space - ) - ) + navPanelState.firstOrNull()?.leftButtonClickAnalytics(analytics) + } + viewModelScope.launch { + dispatch(AppNavigation.Command.OpenShareScreen(vmParams.space)) } } 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 7b68edee05..287e33ad53 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 @@ -13,7 +13,9 @@ import com.anytypeio.anytype.core_models.Block import com.anytypeio.anytype.core_models.Filepath import com.anytypeio.anytype.core_models.Id import com.anytypeio.anytype.core_models.ObjectWrapper +import com.anytypeio.anytype.core_models.PRIVATE_SPACE_TYPE import com.anytypeio.anytype.core_models.Relations +import com.anytypeio.anytype.core_models.SHARED_SPACE_TYPE import com.anytypeio.anytype.core_models.SpaceType import com.anytypeio.anytype.core_models.UNKNOWN_SPACE_TYPE import com.anytypeio.anytype.core_models.asSpaceType @@ -289,6 +291,38 @@ class SpaceSettingsViewModel( } fun onSharePrivateSpaceClicked() { + viewModelScope.launch { + val data = spaceViewState.value + when(data) { + is ViewState.Success -> { + when(data.data.spaceType) { + PRIVATE_SPACE_TYPE -> { + analytics.sendEvent( + eventName = EventsDictionary.screenSettingsSpaceShare, + props = Props( + mapOf( + EventsPropertiesKey.route to EventsDictionary.Routes.settings + ) + ) + ) + } + SHARED_SPACE_TYPE -> { + analytics.sendEvent( + eventName = EventsDictionary.screenSettingsSpaceMembers, + props = Props( + mapOf( + EventsPropertiesKey.route to EventsDictionary.Routes.settings + ) + ) + ) + } + } + } + else -> { + // Do nothing. + } + } + } viewModelScope.launch { val data = spaceViewState.value if (data is ViewState.Success) { diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/collection/CollectionViewModel.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/collection/CollectionViewModel.kt index 4a02556b9f..cb7cb69e88 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/collection/CollectionViewModel.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/widgets/collection/CollectionViewModel.kt @@ -50,6 +50,7 @@ import com.anytypeio.anytype.presentation.home.OpenObjectNavigation import com.anytypeio.anytype.presentation.home.navigation import com.anytypeio.anytype.presentation.navigation.DefaultObjectView import com.anytypeio.anytype.presentation.navigation.NavPanelState +import com.anytypeio.anytype.presentation.navigation.leftButtonClickAnalytics import com.anytypeio.anytype.presentation.objects.ObjectAction import com.anytypeio.anytype.presentation.objects.getCreateObjectParams import com.anytypeio.anytype.presentation.objects.mapFileObjectToView @@ -74,6 +75,7 @@ import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map @@ -874,13 +876,12 @@ class CollectionViewModel( } fun onShareButtonClicked() { + viewModelScope.launch { + navPanelState.value.leftButtonClickAnalytics(analytics) + } launch { commands.emit(OpenShareScreen(vmParams.spaceId)) } } - fun onBackLongClicked() { - launch { commands.emit(ExitToSpaceWidgets) } - } - fun onSearchClicked(space: Id) { viewModelScope.sendEvent( analytics = analytics,