Skip to content

Commit

Permalink
Merge pull request #20080 from wordpress-mobile/issue/19952-granulari…
Browse files Browse the repository at this point in the history
…ty-function-of-traffic-tab

Handle granularity on Traffic tab pages
  • Loading branch information
ravishanker committed Jan 31, 2024
2 parents 7320dcf + 3cfdce5 commit 69fe5f0
Show file tree
Hide file tree
Showing 20 changed files with 265 additions and 256 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ import javax.inject.Named
import javax.inject.Singleton

const val INSIGHTS_USE_CASE = "InsightsUseCase"
const val TRAFFIC_USE_CASE = "TrafficStatsUseCase"
const val DAY_STATS_USE_CASE = "DayStatsUseCase"
const val WEEK_STATS_USE_CASE = "WeekStatsUseCase"
const val MONTH_STATS_USE_CASE = "MonthStatsUseCase"
Expand Down Expand Up @@ -265,6 +266,32 @@ class StatsModule {
)
}

/**
* Provides a singleton usecase that represents the TRAFFIC stats screen.
* @param useCasesFactories build the use cases for the DAYS granularity
*/
@Provides
@Singleton
@Named(TRAFFIC_USE_CASE)
@Suppress("LongParameterList")
fun provideTrafficUseCase(
statsStore: StatsStore,
@Named(BG_THREAD) bgDispatcher: CoroutineDispatcher,
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
statsSiteProvider: StatsSiteProvider,
@Named(GRANULAR_USE_CASE_FACTORIES) useCasesFactories: List<@JvmSuppressWildcards GranularUseCaseFactory>,
uiModelMapper: UiModelMapper
): BaseListUseCase {
return BaseListUseCase(
bgDispatcher,
mainDispatcher,
statsSiteProvider,
useCasesFactories.map { it.build(DAYS, BLOCK) },
{ statsStore.getTimeStatsTypes(it) },
uiModelMapper::mapTimeStats
)
}

/**
* Provides a singleton usecase that represents the Day stats screen.
* @param useCasesFactories build the use cases for the DAYS granularity
Expand Down Expand Up @@ -374,15 +401,18 @@ class StatsModule {
@Provides
@Singleton
@Named(LIST_STATS_USE_CASES)
@Suppress("LongParameterList")
fun provideListStatsUseCases(
@Named(INSIGHTS_USE_CASE) insightsUseCase: BaseListUseCase,
@Named(TRAFFIC_USE_CASE) trafficUseCase: BaseListUseCase,
@Named(DAY_STATS_USE_CASE) dayStatsUseCase: BaseListUseCase,
@Named(WEEK_STATS_USE_CASE) weekStatsUseCase: BaseListUseCase,
@Named(MONTH_STATS_USE_CASE) monthStatsUseCase: BaseListUseCase,
@Named(YEAR_STATS_USE_CASE) yearStatsUseCase: BaseListUseCase
): Map<StatsSection, BaseListUseCase> {
return mapOf(
StatsSection.INSIGHTS to insightsUseCase,
StatsSection.TRAFFIC to trafficUseCase,
StatsSection.DAYS to dayStatsUseCase,
StatsSection.WEEKS to weekStatsUseCase,
StatsSection.MONTHS to monthStatsUseCase,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import org.wordpress.android.ui.stats.StatsViewType.SEARCH_TERMS
import org.wordpress.android.ui.stats.StatsViewType.TAGS_AND_CATEGORIES
import org.wordpress.android.ui.stats.StatsViewType.TOP_POSTS_AND_PAGES
import org.wordpress.android.ui.stats.StatsViewType.VIDEO_PLAYS
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection
import org.wordpress.android.ui.stats.refresh.lists.detail.PostAverageViewsPerDayUseCase
import org.wordpress.android.ui.stats.refresh.lists.detail.PostMonthsAndYearsUseCase
import org.wordpress.android.ui.stats.refresh.lists.detail.PostRecentWeeksUseCase
Expand All @@ -55,7 +54,6 @@ import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.T
import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.ViewsAndVisitorsUseCase
import org.wordpress.android.ui.stats.refresh.utils.StatsDateSelector
import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider
import org.wordpress.android.ui.stats.refresh.utils.toStatsSection
import java.security.InvalidParameterException
import javax.inject.Inject
import javax.inject.Named
Expand Down Expand Up @@ -106,7 +104,7 @@ class StatsViewAllViewModelFactory(
val dateSelector = if (granularity == null) {
null
} else {
dateSelectorFactory.build(granularity.toStatsSection())
dateSelectorFactory.build(granularity)
}
return StatsViewAllViewModelFactory(
mainDispatcher,
Expand All @@ -127,7 +125,7 @@ class StatsViewAllViewModelFactory(
bgDispatcher,
useCase,
statsSiteProvider,
dateSelectorFactory.build(StatsSection.ANNUAL_STATS),
dateSelectorFactory.build(StatsGranularity.YEARS),
R.string.stats_insights_annual_site_stats
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.wordpress.android.R
import org.wordpress.android.fluxc.model.SiteModel
import org.wordpress.android.fluxc.network.utils.StatsGranularity
import org.wordpress.android.fluxc.store.StatsStore.StatsType
import org.wordpress.android.ui.pages.SnackbarMessageHolder
import org.wordpress.android.ui.stats.refresh.NavigationTarget
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.UiModel
import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase
import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.UseCaseModel
Expand Down Expand Up @@ -140,8 +140,8 @@ class BaseListUseCase(
data.value = null
}

suspend fun onDateChanged(selectedSection: StatsSection) {
onParamChanged(UseCaseParam.SelectedDateParam(selectedSection))
suspend fun onDateChanged(selectedGranularity: StatsGranularity) {
onParamChanged(UseCaseParam.SelectedDateParam(selectedGranularity))
}

fun onListSelected() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.UiModel.E
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.UiModel.Error
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.UiModel.Success
import org.wordpress.android.ui.stats.refresh.lists.detail.DetailListViewModel
import org.wordpress.android.ui.stats.refresh.utils.SelectedTrafficGranularityManager
import org.wordpress.android.ui.stats.refresh.utils.StatsDateFormatter
import org.wordpress.android.ui.stats.refresh.utils.StatsNavigator
import org.wordpress.android.ui.stats.refresh.utils.drawDateSelector
Expand Down Expand Up @@ -57,6 +58,9 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) {
@Inject
lateinit var statsTrafficTabFeatureConfig: StatsTrafficTabFeatureConfig

@Inject
lateinit var selectedTrafficGranularityManager: SelectedTrafficGranularityManager

private lateinit var viewModel: StatsListViewModel
private lateinit var statsSection: StatsSection

Expand Down Expand Up @@ -158,9 +162,14 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) {
StatsGranularity.entries.map { getString(it.toNameResource()) }
).apply { setDropDownViewResource(R.layout.toolbar_spinner_dropdown_item) }

val selectedGranularityItemPos = StatsGranularity.entries.indexOf(
selectedTrafficGranularityManager.getSelectedTrafficGranularity()
)
dateSelector.granularitySpinner.setSelection(selectedGranularityItemPos)

dateSelector.granularitySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
// TODO update TRAFFIC tab
selectedTrafficGranularityManager.setSelectedTrafficGranularity(StatsGranularity.entries[position])
}

@Suppress("EmptyFunctionBlock")
Expand Down Expand Up @@ -245,7 +254,7 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) {

viewModel.selectedDate?.observe(viewLifecycleOwner) { event ->
if (event != null) {
viewModel.onDateChanged(event.selectedSection)
viewModel.onDateChanged(event.selectedGranularity)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import org.wordpress.android.R
import org.wordpress.android.analytics.AnalyticsTracker.Stat
import org.wordpress.android.fluxc.network.utils.StatsGranularity
import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.ui.stats.refresh.DAY_STATS_USE_CASE
import org.wordpress.android.ui.stats.refresh.INSIGHTS_USE_CASE
Expand All @@ -20,15 +21,10 @@ import org.wordpress.android.ui.stats.refresh.StatsViewModel.DateSelectorUiModel
import org.wordpress.android.ui.stats.refresh.TOTAL_COMMENTS_DETAIL_USE_CASE
import org.wordpress.android.ui.stats.refresh.TOTAL_FOLLOWERS_DETAIL_USE_CASE
import org.wordpress.android.ui.stats.refresh.TOTAL_LIKES_DETAIL_USE_CASE
import org.wordpress.android.ui.stats.refresh.TRAFFIC_USE_CASE
import org.wordpress.android.ui.stats.refresh.VIEWS_AND_VISITORS_USE_CASE
import org.wordpress.android.ui.stats.refresh.WEEK_STATS_USE_CASE
import org.wordpress.android.ui.stats.refresh.YEAR_STATS_USE_CASE
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.DAYS
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.INSIGHTS
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.MONTHS
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.TRAFFIC
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.WEEKS
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.YEARS
import org.wordpress.android.ui.stats.refresh.utils.ActionCardHandler
import org.wordpress.android.ui.stats.refresh.utils.ItemPopupMenuHandler
import org.wordpress.android.ui.stats.refresh.utils.NewsCardHandler
Expand Down Expand Up @@ -131,9 +127,9 @@ abstract class StatsListViewModel(
}
}

fun onDateChanged(selectedSection: StatsSection) {
fun onDateChanged(selectedGranularity: StatsGranularity) {
launch {
statsUseCase.onDateChanged(selectedSection)
statsUseCase.onDateChanged(selectedGranularity)
}
}

Expand Down Expand Up @@ -185,80 +181,124 @@ class InsightsListViewModel
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(INSIGHTS_USE_CASE) private val insightsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory,
popupMenuHandler: ItemPopupMenuHandler,
newsCardHandler: NewsCardHandler,
actionCardHandler: ActionCardHandler
) : StatsListViewModel(
mainDispatcher,
insightsUseCase,
analyticsTracker,
dateSelectorFactory.build(INSIGHTS),
null,
popupMenuHandler,
newsCardHandler,
actionCardHandler
)

class TrafficListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(TRAFFIC_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.DAYS, isGranularitySpinnerVisible = true)
)

class YearsListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(YEAR_STATS_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(YEARS))
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.YEARS)
)

class MonthsListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(MONTH_STATS_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(MONTHS))
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.MONTHS)
)

class WeeksListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(WEEK_STATS_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(WEEKS))
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.WEEKS)
)

class DaysListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(DAY_STATS_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(DAYS))

class TrafficListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(DAY_STATS_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(TRAFFIC))
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.DAYS)
)

// Using Weeks granularity on new insight details screens
// Using Weeks granularity on insight details screens
class InsightsDetailListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(VIEWS_AND_VISITORS_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(WEEKS))
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.WEEKS)
)

class TotalLikesDetailListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(TOTAL_LIKES_DETAIL_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(WEEKS))
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.WEEKS)
)

class TotalCommentsDetailListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(TOTAL_COMMENTS_DETAIL_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(WEEKS))
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.WEEKS)
)

class TotalFollowersDetailListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
@Named(TOTAL_FOLLOWERS_DETAIL_USE_CASE) statsUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, statsUseCase, analyticsTracker, dateSelectorFactory.build(WEEKS))
) : StatsListViewModel(
mainDispatcher,
statsUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.WEEKS)
)
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package org.wordpress.android.ui.stats.refresh.lists.detail

import kotlinx.coroutines.CoroutineDispatcher
import org.wordpress.android.fluxc.network.utils.StatsGranularity
import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.ui.stats.refresh.BLOCK_DETAIL_USE_CASE
import org.wordpress.android.ui.stats.refresh.lists.BaseListUseCase
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.DETAIL
import org.wordpress.android.ui.stats.refresh.utils.StatsDateSelector
import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper
import javax.inject.Inject
Expand All @@ -17,7 +17,12 @@ class DetailListViewModel
@Named(BLOCK_DETAIL_USE_CASE) private val detailUseCase: BaseListUseCase,
analyticsTracker: AnalyticsTrackerWrapper,
dateSelectorFactory: StatsDateSelector.Factory
) : StatsListViewModel(mainDispatcher, detailUseCase, analyticsTracker, dateSelectorFactory.build(DETAIL)) {
) : StatsListViewModel(
mainDispatcher,
detailUseCase,
analyticsTracker,
dateSelectorFactory.build(StatsGranularity.DAYS)
) {
override fun onCleared() {
super.onCleared()
dateSelector?.clear()
Expand Down
Loading

0 comments on commit 69fe5f0

Please sign in to comment.