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 e945a5ce74..dd5bd4f60c 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 @@ -230,6 +230,20 @@ object EventsDictionary { const val galleryParamNew = "New" const val galleryParamExisting = "Existing" + //Membership + const val screenMembership = "ScreenMembership" + const val clickMembership = "ClickMembership" + const val changePlan = "ChangePlan" + + enum class MembershipTierButton(val value: String) { + INFO("LearnMore"), + MANAGE("ManagePayment"), + PAY("Pay"), + SUBMIT("Submit"), + CHANGE_EMAIL("ChangeEmail"), + CONTACT_US("ContactUs") + } + enum class ScreenOnboardingStep(val value: String) { VOID("Void"), PHRASE("Phrase") diff --git a/payments/src/main/java/com/anytypeio/anytype/payments/viewmodel/MembershipViewModel.kt b/payments/src/main/java/com/anytypeio/anytype/payments/viewmodel/MembershipViewModel.kt index 4a21b8ac32..64dc3b4be9 100644 --- a/payments/src/main/java/com/anytypeio/anytype/payments/viewmodel/MembershipViewModel.kt +++ b/payments/src/main/java/com/anytypeio/anytype/payments/viewmodel/MembershipViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.viewModelScope import com.android.billingclient.api.BillingFlowParams import com.android.billingclient.api.ProductDetails import com.anytypeio.anytype.analytics.base.Analytics +import com.anytypeio.anytype.analytics.base.EventsDictionary import com.anytypeio.anytype.core_models.membership.EmailVerificationStatus import com.anytypeio.anytype.core_models.membership.MembershipErrors import com.anytypeio.anytype.core_models.membership.MembershipPaymentMethod @@ -30,6 +31,9 @@ import com.anytypeio.anytype.payments.models.Tier import com.anytypeio.anytype.payments.playbilling.BillingClientLifecycle import com.anytypeio.anytype.payments.playbilling.BillingClientState import com.anytypeio.anytype.payments.playbilling.BillingPurchaseState +import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipClickEvent +import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipPurchaseEvent +import com.anytypeio.anytype.presentation.extension.sendAnalyticsMembershipScreenEvent import com.anytypeio.anytype.presentation.membership.models.MembershipStatus import com.anytypeio.anytype.presentation.membership.models.TierId import com.anytypeio.anytype.presentation.membership.provider.MembershipProvider @@ -142,6 +146,12 @@ class MembershipViewModel( val tierView = (tierState.value as? MembershipTierState.Visible)?.tier ?: return proceedWithHideTier() welcomeState.value = WelcomeState.Initial(tierView) + viewModelScope.launch { + sendAnalyticsMembershipPurchaseEvent( + analytics = analytics, + tier = tierView.title + ) + } proceedWithNavigation(MembershipNavigation.Welcome) } } @@ -166,6 +176,12 @@ class MembershipViewModel( private fun proceedWithShowingTier(tierId: TierId) { val visibleTier = getTierById(tierId) ?: return tierState.value = MembershipTierState.Visible(visibleTier) + viewModelScope.launch { + sendAnalyticsMembershipScreenEvent( + analytics = analytics, + tier = visibleTier.title + ) + } proceedWithNavigation(MembershipNavigation.Tier) } @@ -178,13 +194,21 @@ class MembershipViewModel( fun onTierAction(action: TierAction) { Timber.d("onTierAction: action:$action") when (action) { - is TierAction.PayClicked -> onPayButtonClicked(action.tierId) - is TierAction.ManagePayment -> onManageTierClicked(action.tierId) + is TierAction.PayClicked -> { + sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.PAY) + onPayButtonClicked(action.tierId) + } + is TierAction.ManagePayment -> { + sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.MANAGE) + onManageTierClicked(action.tierId) + } is TierAction.OpenUrl -> { + sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.INFO) proceedWithNavigation(MembershipNavigation.OpenUrl(action.url)) } TierAction.OpenEmail -> proceedWithSupportEmail() is TierAction.SubmitClicked -> { + sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.SUBMIT) proceedWithSettingEmail( email = anyEmailState.text.toString(), ) @@ -198,6 +222,7 @@ class MembershipViewModel( proceedWithValidatingEmailCode(action.code) } TierAction.ChangeEmail -> { + sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.CHANGE_EMAIL) val tierView = (tierState.value as? MembershipTierState.Visible)?.tier ?: return val updatedTierState = tierView.copy( email = TierEmail.Visible.Enter, @@ -207,6 +232,7 @@ class MembershipViewModel( } is TierAction.ContactUsError -> { + sendAnalyticsClickEvent(EventsDictionary.MembershipTierButton.CONTACT_US) proceedWithSupportErrorEmail(action.error) } } @@ -507,6 +533,15 @@ class MembershipViewModel( errorState.value = MembershipErrorState.Hidden } + private fun sendAnalyticsClickEvent(buttonType: EventsDictionary.MembershipTierButton) { + viewModelScope.launch { + sendAnalyticsMembershipClickEvent( + analytics = analytics, + buttonType = buttonType + ) + } + } + //region Google Play Billing /** * Use the Google Play Billing Library to make a purchase. diff --git a/presentation/src/main/java/com/anytypeio/anytype/presentation/extension/AnalyticsExt.kt b/presentation/src/main/java/com/anytypeio/anytype/presentation/extension/AnalyticsExt.kt index 656b10d776..ef6cfbc071 100644 --- a/presentation/src/main/java/com/anytypeio/anytype/presentation/extension/AnalyticsExt.kt +++ b/presentation/src/main/java/com/anytypeio/anytype/presentation/extension/AnalyticsExt.kt @@ -2016,4 +2016,39 @@ fun CoroutineScope.sendAnalyticsUploadConfigFileEvent( ) } +//endregion + +//region Membership +fun CoroutineScope.sendAnalyticsMembershipScreenEvent( + analytics: Analytics, + tier: String +) { + sendEvent( + analytics = analytics, + eventName = EventsDictionary.screenMembership, + props = Props(mapOf(EventsPropertiesKey.name to tier)) + ) +} + +fun CoroutineScope.sendAnalyticsMembershipClickEvent( + analytics: Analytics, + buttonType: EventsDictionary.MembershipTierButton +) { + sendEvent( + analytics = analytics, + eventName = EventsDictionary.clickMembership, + props = Props(mapOf(EventsPropertiesKey.type to buttonType.value)) + ) +} + +fun CoroutineScope.sendAnalyticsMembershipPurchaseEvent( + analytics: Analytics, + tier: String +) { + sendEvent( + analytics = analytics, + eventName = EventsDictionary.changePlan, + props = Props(mapOf(EventsPropertiesKey.name to tier)) + ) +} //endregion \ No newline at end of file