diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt index 7a7fff21286..4c6c312f842 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/analytics/AnalyticsEvent.kt @@ -137,6 +137,11 @@ enum class AnalyticsEvent(override val siteless: Boolean = false) : IAnalyticsEv SITE_PICKER_SITE_DISCOVERY(siteless = true), SITE_PICKER_JETPACK_TIMEOUT_ERROR_SHOWN(siteless = true), SITE_PICKER_JETPACK_TIMEOUT_CONTACT_SUPPORT_CLICKED(siteless = true), + SITE_PICKER_EDIT_BUTTON_SHOWN(siteless = true), + SITE_PICKER_EDIT_BUTTON_TAPPED(siteless = true), + SITE_PICKER_LIST_SAVE_BUTTON_TAPPED(siteless = true), + SITE_PICKER_LIST_SAVING_SUCCESS(siteless = true), + SITE_PICKER_LIST_SAVING_FAILURE(siteless = true), // -- Jetpack Installation for Login LOGIN_JETPACK_SITE_CREDENTIAL_SCREEN_VIEWED(siteless = true), diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt index f2b26d1dc62..76bb8a81ef7 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerFragment.kt @@ -19,6 +19,7 @@ import com.woocommerce.android.NavGraphMainDirections import com.woocommerce.android.R import com.woocommerce.android.analytics.AnalyticsEvent import com.woocommerce.android.analytics.AnalyticsTracker +import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.databinding.FragmentSitePickerBinding import com.woocommerce.android.extensions.handleNotice import com.woocommerce.android.extensions.handleResult @@ -76,6 +77,9 @@ class SitePickerFragment : @Inject lateinit var uiMessageResolver: UIMessageResolver + @Inject + lateinit var analyticsTrackerWrapper: AnalyticsTrackerWrapper + private var skeletonView = SkeletonView() private var progressDialog: CustomProgressDialog? = null @@ -117,6 +121,7 @@ class SitePickerFragment : } R.id.menu_edit_store_list -> { + analyticsTrackerWrapper.track(stat = AnalyticsEvent.SITE_PICKER_EDIT_BUTTON_TAPPED) findNavController().navigateSafely( SitePickerFragmentDirections.actionSitePickerFragmentToStoreVisibilityFragment() ) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt index 0dc59d01d98..456dc04bfa0 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/SitePickerViewModel.kt @@ -226,12 +226,17 @@ class SitePickerViewModel @Inject constructor( val selectedSiteId = selectedSiteId.value ?: wooSites.getOrNull(0)?.id _sites.value = buildSitesList(wooSites, selectedSiteId, nonWooSites) + val isEditListEnabled = FeatureFlag.HIDE_SITES_FROM_SITE_PICKER.isEnabled() && wooSites.size > 1 + if (isEditListEnabled && sitePickerViewState.editStoreListEnabled.not()) { + analyticsTrackerWrapper.track(stat = AnalyticsEvent.SITE_PICKER_EDIT_BUTTON_SHOWN) + } + sitePickerViewState = sitePickerViewState.copy( hasConnectedStores = sites.isNotEmpty(), isPrimaryBtnVisible = wooSites.isNotEmpty(), isNoStoresViewVisible = false, currentSitePickerState = SitePickerState.StoreListState, - editStoreListEnabled = FeatureFlag.HIDE_SITES_FROM_SITE_PICKER.isEnabled() && wooSites.size > 1 + editStoreListEnabled = isEditListEnabled ) loginSiteAddress?.let { processLoginSiteAddress(it) diff --git a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/sitevisibility/WooSitesVisibilityViewModel.kt b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/sitevisibility/WooSitesVisibilityViewModel.kt index 1b9f4b9d6e1..243e79152eb 100644 --- a/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/sitevisibility/WooSitesVisibilityViewModel.kt +++ b/WooCommerce/src/main/kotlin/com/woocommerce/android/ui/sitepicker/sitevisibility/WooSitesVisibilityViewModel.kt @@ -3,6 +3,9 @@ package com.woocommerce.android.ui.sitepicker.sitevisibility import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.asLiveData import com.woocommerce.android.R +import com.woocommerce.android.analytics.AnalyticsEvent +import com.woocommerce.android.analytics.AnalyticsTracker.Companion.KEY_ERROR +import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.sitepicker.SitePickerRepository import com.woocommerce.android.viewmodel.MultiLiveEvent.Event @@ -15,6 +18,7 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.launch import org.wordpress.android.fluxc.model.SiteModel import org.wordpress.android.fluxc.store.NotificationStore +import org.wordpress.android.fluxc.store.NotificationStore.NotificationSettingsUpdateError import org.wordpress.android.fluxc.store.NotificationStore.SiteNotificationSetting import javax.inject.Inject @@ -24,6 +28,7 @@ class WooSitesVisibilityViewModel @Inject constructor( private val selectedSite: SelectedSite, private val visibleSitesDataStore: VisibleWooSitesDataStore, private val notificationsStore: NotificationStore, + private val trackerWrapper: AnalyticsTrackerWrapper, savedStateHandle: SavedStateHandle ) : ScopedViewModel(savedStateHandle) { private var initiallySelectedSiteIds: List = emptyList() @@ -55,6 +60,12 @@ class WooSitesVisibilityViewModel @Inject constructor( } fun onSaveTapped() { + trackerWrapper.track( + stat = AnalyticsEvent.SITE_PICKER_LIST_SAVE_BUTTON_TAPPED, + properties = mapOf( + "hidden_site_count" to _wooStoresState.value.wooStores.count { !it.isSelected } + ) + ) _wooStoresState.value = _wooStoresState.value.copy(isLoading = true) launch { notificationsStore.updateNotificationSettingsFor( @@ -67,6 +78,7 @@ class WooSitesVisibilityViewModel @Inject constructor( } ).fold( onSuccess = { + trackerWrapper.track(stat = AnalyticsEvent.SITE_PICKER_LIST_SAVING_SUCCESS) visibleSitesDataStore.updateSiteVisibilityStatus( _wooStoresState.value.wooStores .associate { it.siteId to it.isSelected } @@ -74,6 +86,12 @@ class WooSitesVisibilityViewModel @Inject constructor( triggerEvent(ExitWithResult(data = true)) }, onFailure = { + if (it is NotificationSettingsUpdateError) { + trackerWrapper.track( + stat = AnalyticsEvent.SITE_PICKER_LIST_SAVING_FAILURE, + properties = mapOf(KEY_ERROR to it.type.toString()) + ) + } triggerEvent( Event.ShowDialog( titleId = R.string.site_picker_edit_store_list_error_title, diff --git a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/sitepicker/sitevisibility/WooSitesVisibilityViewModelTest.kt b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/sitepicker/sitevisibility/WooSitesVisibilityViewModelTest.kt index 47a7892d958..145a7433366 100644 --- a/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/sitepicker/sitevisibility/WooSitesVisibilityViewModelTest.kt +++ b/WooCommerce/src/test/kotlin/com/woocommerce/android/ui/sitepicker/sitevisibility/WooSitesVisibilityViewModelTest.kt @@ -1,5 +1,6 @@ package com.woocommerce.android.ui.sitepicker.sitevisibility +import com.woocommerce.android.analytics.AnalyticsTrackerWrapper import com.woocommerce.android.tools.SelectedSite import com.woocommerce.android.ui.sitepicker.SitePickerRepository import com.woocommerce.android.ui.sitepicker.SitePickerTestUtils @@ -66,6 +67,7 @@ class WooSitesVisibilityViewModelTest : BaseUnitTest() { private val visibleWooSitesDataStore: VisibleWooSitesDataStore = mock { onBlocking { isSiteVisible(any()) } doReturn flowOf(true) } + private val trackerWrapper: AnalyticsTrackerWrapper = mock() private val notificationStore: NotificationStore = mock() @@ -78,6 +80,7 @@ class WooSitesVisibilityViewModelTest : BaseUnitTest() { selectedSite = selectedSite, visibleSitesDataStore = visibleWooSitesDataStore, notificationsStore = notificationStore, + trackerWrapper = trackerWrapper, savedStateHandle = mock() ) }