From 28c97e25f4ab961308599fdfda2c41a825e22a66 Mon Sep 17 00:00:00 2001 From: Irfan Omur Date: Mon, 5 Feb 2024 19:47:02 +0300 Subject: [PATCH 1/7] Make TRAFFIC_USE_CASE not singleton --- .../java/org/wordpress/android/ui/stats/refresh/StatsModule.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt index 74984c278010..0954456df7d5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt @@ -271,7 +271,6 @@ class StatsModule { * @param useCasesFactories build the use cases for the DAYS granularity */ @Provides - @Singleton @Named(TRAFFIC_USE_CASE) @Suppress("LongParameterList") fun provideTrafficUseCase( From 69996b769eaddfc44fc85d5ee7769888fd8f3a3b Mon Sep 17 00:00:00 2001 From: Irfan Omur Date: Mon, 5 Feb 2024 19:50:07 +0300 Subject: [PATCH 2/7] Update StatsDateSelector when granularity changed --- .../refresh/lists/sections/granular/SelectedDateProvider.kt | 5 +---- .../android/ui/stats/refresh/utils/StatsDateSelector.kt | 5 +++-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/granular/SelectedDateProvider.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/granular/SelectedDateProvider.kt index 1ce18f0db9b7..c4e5c0879c9a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/granular/SelectedDateProvider.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/granular/SelectedDateProvider.kt @@ -16,7 +16,6 @@ import org.wordpress.android.ui.stats.refresh.utils.trackWithGranularity import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper import org.wordpress.android.util.extensions.getParcelableCompat import org.wordpress.android.util.extensions.readListCompat -import org.wordpress.android.util.filter import java.util.Date import javax.inject.Inject import javax.inject.Singleton @@ -38,9 +37,7 @@ class SelectedDateProvider private val selectedDateChanged = MutableLiveData() - fun granularSelectedDateChanged(statsGranularity: StatsGranularity): LiveData { - return selectedDateChanged.filter { it?.selectedGranularity == statsGranularity } - } + fun granularSelectedDateChanged(): LiveData = selectedDateChanged fun selectDate(date: Date, statsGranularity: StatsGranularity) { val selectedDate = getSelectedDateState(statsGranularity) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/utils/StatsDateSelector.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/utils/StatsDateSelector.kt index bf7d89e37a20..c9b52de596c2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/utils/StatsDateSelector.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/utils/StatsDateSelector.kt @@ -22,10 +22,11 @@ constructor( private val _dateSelectorUiModel = MutableLiveData() val dateSelectorData: LiveData = _dateSelectorUiModel - val selectedDate = selectedDateProvider.granularSelectedDateChanged(statsGranularity) - .perform { + var selectedDate = selectedDateProvider.granularSelectedDateChanged().perform { + if (statsGranularity == it?.selectedGranularity) { updateDateSelector() } + } fun start(startDate: SelectedDate) { selectedDateProvider.updateSelectedDate(startDate, statsGranularity) From 4d934dae0aff11b7497c3559ac11df523a8157ba Mon Sep 17 00:00:00 2001 From: Irfan Omur Date: Mon, 5 Feb 2024 19:56:21 +0300 Subject: [PATCH 3/7] Handle granularity change from TrafficListViewModel --- .../android/ui/stats/refresh/StatsModule.kt | 6 ++- .../ui/stats/refresh/lists/BaseListUseCase.kt | 11 +++++- .../stats/refresh/lists/StatsListFragment.kt | 5 ++- .../stats/refresh/lists/StatsListViewModel.kt | 39 +++++++++++++++---- .../stats/refresh/utils/StatsDateSelector.kt | 2 +- 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt index 0954456df7d5..377388b1113b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt @@ -62,6 +62,7 @@ import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.T import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.TotalFollowersUseCase.TotalFollowersUseCaseFactory import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.TotalLikesUseCase.TotalLikesUseCaseFactory import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.ViewsAndVisitorsUseCase.ViewsAndVisitorsUseCaseFactory +import org.wordpress.android.ui.stats.refresh.utils.SelectedTrafficGranularityManager import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider import javax.inject.Named import javax.inject.Singleton @@ -279,13 +280,16 @@ class StatsModule { @Named(UI_THREAD) mainDispatcher: CoroutineDispatcher, statsSiteProvider: StatsSiteProvider, @Named(GRANULAR_USE_CASE_FACTORIES) useCasesFactories: List<@JvmSuppressWildcards GranularUseCaseFactory>, + selectedTrafficGranularityManager: SelectedTrafficGranularityManager, uiModelMapper: UiModelMapper ): BaseListUseCase { return BaseListUseCase( bgDispatcher, mainDispatcher, statsSiteProvider, - useCasesFactories.map { it.build(DAYS, BLOCK) }, + useCasesFactories.map { + it.build(selectedTrafficGranularityManager.getSelectedTrafficGranularity(), BLOCK) + }, { statsStore.getTimeStatsTypes(it) }, uiModelMapper::mapTimeStats ) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/BaseListUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/BaseListUseCase.kt index b01c21f2abc7..a64406487935 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/BaseListUseCase.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/BaseListUseCase.kt @@ -22,8 +22,8 @@ import org.wordpress.android.ui.utils.UiString.UiStringRes import org.wordpress.android.util.PackageUtils import org.wordpress.android.util.combineMap import org.wordpress.android.util.distinct -import org.wordpress.android.util.mapSafe import org.wordpress.android.util.mapAsync +import org.wordpress.android.util.mapSafe import org.wordpress.android.util.mergeAsyncNotNull import org.wordpress.android.util.mergeNotNull import org.wordpress.android.viewmodel.Event @@ -147,4 +147,13 @@ class BaseListUseCase( fun onListSelected() { mutableListSelected.call() } + + fun clone(newUseCases: List>) = BaseListUseCase( + bgDispatcher, + mainDispatcher, + statsSiteProvider, + newUseCases, + getStatsTypes, + mapUiModel + ) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt index 1469325b5c26..2d6a8c78277a 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt @@ -169,7 +169,10 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { dateSelector.granularitySpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { - selectedTrafficGranularityManager.setSelectedTrafficGranularity(StatsGranularity.entries[position]) + with(StatsGranularity.entries[position]) { + selectedTrafficGranularityManager.setSelectedTrafficGranularity(this) + (viewModel as TrafficListViewModel).onGranularitySelected(this) + } } @Suppress("EmptyFunctionBlock") diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt index 1643bedabaae..dfc27d1db615 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt @@ -43,9 +43,9 @@ const val SCROLL_EVENT_DELAY = 2000L abstract class StatsListViewModel( defaultDispatcher: CoroutineDispatcher, - private val statsUseCase: BaseListUseCase, + protected var statsUseCase: BaseListUseCase, private val analyticsTracker: AnalyticsTrackerWrapper, - protected val dateSelector: StatsDateSelector?, + protected var dateSelector: StatsDateSelector?, popupMenuHandler: ItemPopupMenuHandler? = null, private val newsCardHandler: NewsCardHandler? = null, actionCardHandler: ActionCardHandler? = null @@ -196,15 +196,40 @@ class InsightsListViewModel class TrafficListViewModel @Inject constructor( @Named(UI_THREAD) mainDispatcher: CoroutineDispatcher, - @Named(TRAFFIC_USE_CASE) statsUseCase: BaseListUseCase, + @Named(TRAFFIC_USE_CASE) private val trafficStatsUseCase: BaseListUseCase, analyticsTracker: AnalyticsTrackerWrapper, - dateSelectorFactory: StatsDateSelector.Factory + dateSelectorFactory: StatsDateSelector.Factory, + @Named(GRANULAR_USE_CASE_FACTORIES) + private val useCasesFactories: List<@JvmSuppressWildcards GranularUseCaseFactory>, + private val selectedTrafficGranularityManager: SelectedTrafficGranularityManager, ) : StatsListViewModel( mainDispatcher, - statsUseCase, + trafficStatsUseCase, analyticsTracker, - dateSelectorFactory.build(StatsGranularity.DAYS, isGranularitySpinnerVisible = true) -) + dateSelectorFactory.build( + selectedTrafficGranularityManager.getSelectedTrafficGranularity(), + isGranularitySpinnerVisible = true + ) +) { + fun onGranularitySelected(statsGranularity: StatsGranularity) { + if (dateSelector?.statsGranularity != statsGranularity) { + dateSelector?.statsGranularity = statsGranularity + val newUseCases = useCasesFactories.map { + it.build( + selectedTrafficGranularityManager.getSelectedTrafficGranularity(), + BaseStatsUseCase.UseCaseMode.BLOCK + ) + } + statsUseCase.onCleared() + statsUseCase = statsUseCase.clone(newUseCases) // Create new BaseListUseCase with updated useCases + launch { + statsUseCase.loadData() + dateSelector?.updateDateSelector() + } + setUiLiveData() + } + } +} class YearsListViewModel @Inject constructor( @Named(UI_THREAD) mainDispatcher: CoroutineDispatcher, diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/utils/StatsDateSelector.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/utils/StatsDateSelector.kt index c9b52de596c2..1e092d4f2812 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/utils/StatsDateSelector.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/utils/StatsDateSelector.kt @@ -15,7 +15,7 @@ constructor( private val selectedDateProvider: SelectedDateProvider, private val statsDateFormatter: StatsDateFormatter, private val siteProvider: StatsSiteProvider, - private val statsGranularity: StatsGranularity, + var statsGranularity: StatsGranularity, private val isGranularitySpinnerVisible: Boolean, private val statsTrafficTabFeatureConfig: StatsTrafficTabFeatureConfig ) { From a64917841f4b50539323fc4e650900cad46bdcab Mon Sep 17 00:00:00 2001 From: Irfan Omur Date: Mon, 5 Feb 2024 19:57:41 +0300 Subject: [PATCH 4/7] Update LIST_STATS_USE_CASES by state of StatsTrafficTabFeatureConfig --- .../android/ui/stats/refresh/StatsModule.kt | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt index 377388b1113b..08881ec68a44 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt @@ -64,6 +64,7 @@ import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.T import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.ViewsAndVisitorsUseCase.ViewsAndVisitorsUseCaseFactory import org.wordpress.android.ui.stats.refresh.utils.SelectedTrafficGranularityManager import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider +import org.wordpress.android.util.config.StatsTrafficTabFeatureConfig import javax.inject.Named import javax.inject.Singleton @@ -411,16 +412,20 @@ class StatsModule { @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 + @Named(YEAR_STATS_USE_CASE) yearStatsUseCase: BaseListUseCase, + trafficTabFeatureConfig: StatsTrafficTabFeatureConfig ): Map { - return mapOf( - StatsSection.INSIGHTS to insightsUseCase, - StatsSection.TRAFFIC to trafficUseCase, - StatsSection.DAYS to dayStatsUseCase, - StatsSection.WEEKS to weekStatsUseCase, - StatsSection.MONTHS to monthStatsUseCase, - StatsSection.YEARS to yearStatsUseCase - ) + return if (trafficTabFeatureConfig.isEnabled()) { + mapOf(StatsSection.TRAFFIC to trafficUseCase, StatsSection.INSIGHTS to insightsUseCase) + } else { + mapOf( + StatsSection.INSIGHTS to insightsUseCase, + StatsSection.DAYS to dayStatsUseCase, + StatsSection.WEEKS to weekStatsUseCase, + StatsSection.MONTHS to monthStatsUseCase, + StatsSection.YEARS to yearStatsUseCase + ) + } } /** From 707832682d17b18670f79723bffccbfae3a29c0e Mon Sep 17 00:00:00 2001 From: Irfan Omur Date: Mon, 5 Feb 2024 20:04:49 +0300 Subject: [PATCH 5/7] Observe use case changes from StatsListFragment --- .../stats/refresh/lists/StatsListFragment.kt | 23 +++++++------- .../stats/refresh/lists/StatsListViewModel.kt | 30 ++++++++++++++----- 2 files changed, 35 insertions(+), 18 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt index 2d6a8c78277a..01dc2cb9d3bb 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt @@ -238,8 +238,8 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { } private fun StatsListFragmentBinding.setupObservers(activity: FragmentActivity) { - viewModel.uiModel.observe(viewLifecycleOwner) { - showUiModel(it) + viewModel.uiSourceUpdated.observe(viewLifecycleOwner) { + observeUiChanges(activity) } viewModel.dateSelectorData.observe(viewLifecycleOwner) { dateSelectorUiModel -> @@ -251,20 +251,12 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { } } - viewModel.navigationTarget.observeEvent(viewLifecycleOwner) { target -> - navigator.navigate(activity, target) - } - viewModel.selectedDate?.observe(viewLifecycleOwner) { event -> if (event != null) { viewModel.onDateChanged(event.selectedGranularity) } } - viewModel.listSelected.observe(viewLifecycleOwner) { - viewModel.onListSelected() - } - viewModel.typesChanged.observeEvent(viewLifecycleOwner) { viewModel.onTypesChanged() } @@ -274,6 +266,16 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { recyclerView.smoothScrollToPosition(adapter.positionOf(statsType)) } } + } + + private fun StatsListFragmentBinding.observeUiChanges(activity: FragmentActivity) { + viewModel.uiModel.observe(viewLifecycleOwner) { + showUiModel(it) + } + + viewModel.navigationTarget.observeEvent(viewLifecycleOwner) { target -> navigator.navigate(activity, target) } + + viewModel.listSelected.observe(viewLifecycleOwner) { viewModel.onListSelected() } viewModel.scrollToNewCard.observeEvent(viewLifecycleOwner) { (recyclerView.adapter as? StatsBlockAdapter)?.let { adapter -> @@ -334,6 +336,7 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { val layoutManager = recyclerView.layoutManager val recyclerViewState = layoutManager?.onSaveInstanceState() adapter.update(statsState) + recyclerView.scrollToPosition(0) layoutManager?.onRestoreInstanceState(recyclerViewState) } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt index dfc27d1db615..3d1fd90673cf 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt @@ -11,8 +11,10 @@ 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.fluxc.store.StatsStore 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.GRANULAR_USE_CASE_FACTORIES import org.wordpress.android.ui.stats.refresh.INSIGHTS_USE_CASE import org.wordpress.android.ui.stats.refresh.MONTH_STATS_USE_CASE import org.wordpress.android.ui.stats.refresh.NavigationTarget @@ -25,9 +27,12 @@ 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.sections.BaseStatsUseCase +import org.wordpress.android.ui.stats.refresh.lists.sections.granular.GranularUseCaseFactory 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 +import org.wordpress.android.ui.stats.refresh.utils.SelectedTrafficGranularityManager import org.wordpress.android.ui.stats.refresh.utils.StatsDateSelector import org.wordpress.android.util.analytics.AnalyticsTrackerWrapper import org.wordpress.android.util.mapNullable @@ -36,6 +41,7 @@ import org.wordpress.android.util.mergeNotNull import org.wordpress.android.util.throttle import org.wordpress.android.viewmodel.Event import org.wordpress.android.viewmodel.ScopedViewModel +import org.wordpress.android.viewmodel.SingleLiveEvent import javax.inject.Inject import javax.inject.Named @@ -71,15 +77,14 @@ abstract class StatsListViewModel( val selectedDate = dateSelector?.selectedDate private val mutableNavigationTarget = MutableLiveData>() - val navigationTarget: LiveData> = mergeNotNull( - statsUseCase.navigationTarget, mutableNavigationTarget - ) + lateinit var navigationTarget: LiveData> - val listSelected = statsUseCase.listSelected + lateinit var listSelected: LiveData - val uiModel: LiveData by lazy { - statsUseCase.data.throttle(viewModelScope, distinct = true) - } + private val mutableUiSourceUpdated = SingleLiveEvent() + val uiSourceUpdated: LiveData = mutableUiSourceUpdated + + lateinit var uiModel: LiveData val dateSelectorData: LiveData = dateSelector?.dateSelectorData?.mapNullable { it ?: DateSelectorUiModel(false) @@ -93,7 +98,7 @@ abstract class StatsListViewModel( val scrollTo = newsCardHandler?.scrollTo - val scrollToNewCard = statsUseCase.scrollTo + lateinit var scrollToNewCard: LiveData> override fun onCleared() { statsUseCase.onCleared() @@ -150,6 +155,7 @@ abstract class StatsListViewModel( fun start() { if (!isInitialized) { isInitialized = true + setUiLiveData() launch { statsUseCase.loadData() dateSelector?.updateDateSelector() @@ -158,6 +164,14 @@ abstract class StatsListViewModel( dateSelector?.updateDateSelector() } + protected fun setUiLiveData() { + uiModel = statsUseCase.data.throttle(viewModelScope, distinct = true) + listSelected = statsUseCase.listSelected + navigationTarget = mergeNotNull(statsUseCase.navigationTarget, mutableNavigationTarget) + scrollToNewCard = statsUseCase.scrollTo + mutableUiSourceUpdated.call() + } + sealed class UiModel { data class Success(val data: List) : UiModel() data class Error(val message: Int = R.string.stats_loading_error) : UiModel() From 3c71970ba17a0be45a363c9f9ca424170b4d8234 Mon Sep 17 00:00:00 2001 From: Irfan Omur Date: Mon, 5 Feb 2024 20:13:06 +0300 Subject: [PATCH 6/7] Fix `StatsDateSelectorTest` --- .../android/ui/stats/refresh/lists/StatsDateSelectorTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/StatsDateSelectorTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/StatsDateSelectorTest.kt index af7fd0adf5f2..48ba3faf6764 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/StatsDateSelectorTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/StatsDateSelectorTest.kt @@ -44,7 +44,7 @@ class StatsDateSelectorTest : BaseUnitTest() { @Before fun setUp() { dateProviderSelectedDate.value = GranularityChange(statsGranularity) - whenever(selectedDateProvider.granularSelectedDateChanged(statsGranularity)) + whenever(selectedDateProvider.granularSelectedDateChanged()) .thenReturn(dateProviderSelectedDate) dateSelector = StatsDateSelector( From 70e624a8f90210d31d5f2e388ed50982482a6aa6 Mon Sep 17 00:00:00 2001 From: Irfan Omur Date: Sun, 11 Feb 2024 19:30:01 +0300 Subject: [PATCH 7/7] Fix the issue with updating granularity on the traffic tab --- .../ui/stats/refresh/lists/StatsListFragment.kt | 9 ++++++++- .../ui/stats/refresh/lists/StatsListViewModel.kt | 15 +++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt index 01dc2cb9d3bb..f45f39109267 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListFragment.kt @@ -238,7 +238,14 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) { } private fun StatsListFragmentBinding.setupObservers(activity: FragmentActivity) { - viewModel.uiSourceUpdated.observe(viewLifecycleOwner) { + viewModel.uiSourceRemoved.observe(viewLifecycleOwner) { + viewModel.uiModel.removeObservers(viewLifecycleOwner) + viewModel.navigationTarget.removeObservers(viewLifecycleOwner) + viewModel.listSelected.removeObservers(viewLifecycleOwner) + viewModel.scrollToNewCard.removeObservers(viewLifecycleOwner) + } + + viewModel.uiSourceAdded.observe(viewLifecycleOwner) { observeUiChanges(activity) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt index 3d1fd90673cf..366d1f7073f1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/StatsListViewModel.kt @@ -81,8 +81,11 @@ abstract class StatsListViewModel( lateinit var listSelected: LiveData - private val mutableUiSourceUpdated = SingleLiveEvent() - val uiSourceUpdated: LiveData = mutableUiSourceUpdated + private val mutableUiSourceAdded = SingleLiveEvent() + val uiSourceAdded: LiveData = mutableUiSourceAdded + + protected val mutableUiSourceRemoved = SingleLiveEvent() + val uiSourceRemoved: LiveData = mutableUiSourceRemoved lateinit var uiModel: LiveData @@ -169,7 +172,7 @@ abstract class StatsListViewModel( listSelected = statsUseCase.listSelected navigationTarget = mergeNotNull(statsUseCase.navigationTarget, mutableNavigationTarget) scrollToNewCard = statsUseCase.scrollTo - mutableUiSourceUpdated.call() + mutableUiSourceAdded.call() } sealed class UiModel { @@ -227,6 +230,10 @@ class TrafficListViewModel @Inject constructor( ) { fun onGranularitySelected(statsGranularity: StatsGranularity) { if (dateSelector?.statsGranularity != statsGranularity) { + // Remove observers from the UI before changing the statsUseCase. This prevents removed use cases from + // affecting the UI. + mutableUiSourceRemoved.call() + dateSelector?.statsGranularity = statsGranularity val newUseCases = useCasesFactories.map { it.build( @@ -240,7 +247,7 @@ class TrafficListViewModel @Inject constructor( statsUseCase.loadData() dateSelector?.updateDateSelector() } - setUiLiveData() + setUiLiveData() // Set UI live data and observers again } } }