Skip to content

Commit

Permalink
Merge pull request #19982 from wordpress-mobile/issue/19952-add-stats…
Browse files Browse the repository at this point in the history
…-granularity-spinner

Add stats granularity spinner to Traffic tab
  • Loading branch information
ravishanker authored Jan 22, 2024
2 parents 9db2e21 + 0886b49 commit 2c6da28
Show file tree
Hide file tree
Showing 10 changed files with 132 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
import org.wordpress.android.ui.stats.refresh.lists.TotalCommentsDetailListViewModel;
import org.wordpress.android.ui.stats.refresh.lists.TotalFollowersDetailListViewModel;
import org.wordpress.android.ui.stats.refresh.lists.TotalLikesDetailListViewModel;
import org.wordpress.android.ui.stats.refresh.lists.TrafficListViewModel;
import org.wordpress.android.ui.stats.refresh.lists.WeeksListViewModel;
import org.wordpress.android.ui.stats.refresh.lists.YearsListViewModel;
import org.wordpress.android.ui.stats.refresh.lists.detail.DetailListViewModel;
Expand Down Expand Up @@ -158,6 +159,11 @@ abstract class ViewModelModule {
@ViewModelKey(InsightsListViewModel.class)
abstract ViewModel insightsTabViewModel(InsightsListViewModel viewModel);

@Binds
@IntoMap
@ViewModelKey(TrafficListViewModel.class)
abstract ViewModel trafficTabViewModel(TrafficListViewModel viewModel);

@Binds
@IntoMap
@ViewModelKey(DaysListViewModel.class)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,7 @@ class StatsViewModel

data class DateSelectorUiModel(
val isVisible: Boolean = false,
val isGranularitySpinnerVisible: Boolean = false,
val date: String? = null,
val timeZone: String? = null,
val enableSelectPrevious: Boolean = false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
Expand All @@ -16,6 +18,7 @@ import androidx.recyclerview.widget.StaggeredGridLayoutManager
import dagger.hilt.android.AndroidEntryPoint
import org.wordpress.android.R
import org.wordpress.android.databinding.StatsListFragmentBinding
import org.wordpress.android.fluxc.network.utils.StatsGranularity
import org.wordpress.android.ui.ViewPagerFragment
import org.wordpress.android.ui.stats.refresh.StatsViewModel.DateSelectorUiModel
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection
Expand All @@ -27,6 +30,8 @@ import org.wordpress.android.ui.stats.refresh.lists.detail.DetailListViewModel
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
import org.wordpress.android.ui.stats.refresh.utils.toNameResource
import org.wordpress.android.util.config.StatsTrafficTabFeatureConfig
import org.wordpress.android.util.extensions.getParcelableCompat
import org.wordpress.android.util.extensions.getSerializableCompat
import org.wordpress.android.util.extensions.getSerializableExtraCompat
Expand All @@ -48,6 +53,10 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) {

@Inject
lateinit var navigator: StatsNavigator

@Inject
lateinit var statsTrafficTabFeatureConfig: StatsTrafficTabFeatureConfig

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

Expand Down Expand Up @@ -142,6 +151,24 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) {
}
})

if (statsTrafficTabFeatureConfig.isEnabled()) {
dateSelector.granularitySpinner.adapter = ArrayAdapter(
requireContext(),
R.layout.filter_spinner_item,
StatsGranularity.entries.map { getString(it.toNameResource()) }
).apply { setDropDownViewResource(R.layout.toolbar_spinner_dropdown_item) }

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

@Suppress("EmptyFunctionBlock")
override fun onNothingSelected(parent: AdapterView<*>?) {
}
}
}

dateSelector.nextDateButton.setOnClickListener {
viewModel.onNextDateSelected()
}
Expand Down Expand Up @@ -183,8 +210,8 @@ class StatsListFragment : ViewPagerFragment(R.layout.stats_list_fragment) {
StatsSection.TOTAL_LIKES_DETAIL -> TotalLikesDetailListViewModel::class.java
StatsSection.TOTAL_COMMENTS_DETAIL -> TotalCommentsDetailListViewModel::class.java
StatsSection.TOTAL_FOLLOWERS_DETAIL -> TotalFollowersDetailListViewModel::class.java
StatsSection.TRAFFIC -> TrafficListViewModel::class.java
StatsSection.ANNUAL_STATS,
StatsSection.TRAFFIC -> DaysListViewModel::class.java // Replace with TrafficListViewModel
StatsSection.INSIGHTS -> InsightsListViewModel::class.java
StatsSection.DAYS -> DaysListViewModel::class.java
StatsSection.WEEKS -> WeeksListViewModel::class.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ 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
Expand Down Expand Up @@ -226,6 +227,13 @@ class DaysListViewModel @Inject constructor(
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))

// Using Weeks granularity on new insight details screens
class InsightsDetailListViewModel @Inject constructor(
@Named(UI_THREAD) mainDispatcher: CoroutineDispatcher,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.wordpress.android.ui.stats.refresh.utils

import android.view.View
import androidx.core.view.isVisible
import org.wordpress.android.databinding.StatsListFragmentBinding
import org.wordpress.android.ui.stats.refresh.StatsViewModel.DateSelectorUiModel

Expand All @@ -26,5 +27,8 @@ fun StatsListFragmentBinding.drawDateSelector(dateSelectorUiModel: DateSelectorU
if (nextDateButton.isEnabled != enableNextButton) {
nextDateButton.isEnabled = enableNextButton
}
granularitySpinner.isVisible = dateSelectorUiModel?.isGranularitySpinnerVisible == true
granularitySpace.isVisible = dateSelectorUiModel?.isGranularitySpinnerVisible == true
dateSpace.isVisible = dateSelectorUiModel?.isGranularitySpinnerVisible != true
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package org.wordpress.android.ui.stats.refresh.utils
import android.content.SharedPreferences
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import org.wordpress.android.R
import org.wordpress.android.fluxc.network.utils.StatsGranularity
import org.wordpress.android.fluxc.network.utils.StatsGranularity.DAYS
import org.wordpress.android.fluxc.network.utils.StatsGranularity.MONTHS
Expand Down Expand Up @@ -64,3 +65,10 @@ fun StatsGranularity.toStatsSection(): StatsSection {
YEARS -> StatsSection.YEARS
}
}

fun StatsGranularity.toNameResource() = when {
this == DAYS -> R.string.stats_timeframe_by_day
this == WEEKS -> R.string.stats_timeframe_by_week
this == MONTHS -> R.string.stats_timeframe_by_month
else -> R.string.stats_timeframe_by_year
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSect
import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.TRAFFIC
import org.wordpress.android.ui.stats.refresh.lists.sections.granular.SelectedDateProvider
import org.wordpress.android.ui.stats.refresh.lists.sections.granular.SelectedDateProvider.SelectedDate
import org.wordpress.android.util.config.StatsTrafficTabFeatureConfig
import org.wordpress.android.util.perform
import javax.inject.Inject

Expand All @@ -21,6 +22,7 @@ constructor(
private val selectedDateProvider: SelectedDateProvider,
private val statsDateFormatter: StatsDateFormatter,
private val siteProvider: StatsSiteProvider,
private val statsTrafficTabFeatureConfig: StatsTrafficTabFeatureConfig,
private val statsSection: StatsSection
) {
private val _dateSelectorUiModel = MutableLiveData<DateSelectorUiModel>()
Expand All @@ -37,15 +39,21 @@ constructor(

fun updateDateSelector() {
val shouldShowDateSelection = this.statsSection != INSIGHTS
val shouldShowGranularitySpinner = statsTrafficTabFeatureConfig.isEnabled() && this.statsSection == TRAFFIC

val updatedDate = getDateLabelForSection()
val currentState = dateSelectorData.value
if (!shouldShowDateSelection && currentState?.isVisible != false) {
emitValue(currentState, DateSelectorUiModel(false))
} else {
val timeZone = statsDateFormatter.printTimeZone(siteProvider.siteModel)
val timeZone = if (statsTrafficTabFeatureConfig.isEnabled()) {
null
} else {
statsDateFormatter.printTimeZone(siteProvider.siteModel)
}
val updatedState = DateSelectorUiModel(
shouldShowDateSelection,
shouldShowGranularitySpinner,
updatedDate,
enableSelectPrevious = selectedDateProvider.hasPreviousDate(statsSection),
enableSelectNext = selectedDateProvider.hasNextDate(statsSection),
Expand Down Expand Up @@ -107,13 +115,15 @@ constructor(
@Inject constructor(
private val selectedDateProvider: SelectedDateProvider,
private val siteProvider: StatsSiteProvider,
private val statsDateFormatter: StatsDateFormatter
private val statsDateFormatter: StatsDateFormatter,
private val statsTrafficTabFeatureConfig: StatsTrafficTabFeatureConfig
) {
fun build(statsSection: StatsSection): StatsDateSelector {
return StatsDateSelector(
selectedDateProvider,
statsDateFormatter,
siteProvider,
statsTrafficTabFeatureConfig,
statsSection
)
}
Expand Down
101 changes: 54 additions & 47 deletions WordPress/src/main/res/layout/stats_date_selector.xml
Original file line number Diff line number Diff line change
@@ -1,72 +1,79 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/date_selector_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="@dimen/one_line_list_item_height">
android:gravity="center_vertical"
android:minHeight="52dp"
android:orientation="horizontal"
android:paddingEnd="@dimen/margin_extra_large"
android:paddingVertical="@dimen/margin_extra_small"
tools:ignore="RtlSymmetry">

<org.wordpress.android.widgets.MaterialTextViewWithNumerals
android:id="@+id/selectedDateTextView"
style="@style/StatsDateSelectorTitle"
android:layout_width="0dp"
<Spinner
android:id="@+id/granularity_spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="1dp"
android:text="@string/unknown"
app:layout_constraintBottom_toTopOf="@+id/currentSiteTimeZone"
app:layout_constraintEnd_toStartOf="@+id/previousDateButton"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_chainStyle="packed"
app:layout_goneMarginBottom="10dp" />
android:minHeight="@dimen/min_touch_target_sz"
android:overlapAnchor="false"
app:popupTheme="@style/ThemeOverlay.AppCompat.DayNight" />

<com.google.android.material.textview.MaterialTextView
android:id="@+id/currentSiteTimeZone"
style="@style/StatsDateTimeZone"
<Space
android:id="@+id/granularity_space"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:text="@string/unknown"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/previousDateButton"
app:layout_constraintStart_toStartOf="@+id/selectedDateTextView"
app:layout_constraintTop_toBottomOf="@+id/selectedDateTextView" />
android:layout_height="0dp"
android:layout_weight="1" />

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical">

<org.wordpress.android.widgets.MaterialTextViewWithNumerals
android:id="@+id/selectedDateTextView"
style="@style/StatsDateSelectorTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/unknown" />

<com.google.android.material.textview.MaterialTextView
android:id="@+id/currentSiteTimeZone"
style="@style/StatsDateTimeZone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/unknown"
android:visibility="gone" />
</LinearLayout>

<Space
android:id="@+id/date_space"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_weight="1"
android:visibility="gone" />

<ImageButton
android:id="@+id/previousDateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginEnd="16dp"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/margin_medium"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/stats_select_previous_period_description"
android:padding="4dp"
android:src="@drawable/ic_chevron_left_white_24dp"
app:tint="@color/on_surface_disabled_selector"
android:tintMode="src_in"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/nextDateButton"
app:layout_constraintStart_toEndOf="@+id/selectedDateTextView"
app:layout_constraintTop_toTopOf="parent" />
app:tint="@color/on_surface_disabled_selector" />

<ImageButton
android:id="@+id/nextDateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:layout_height="match_parent"
android:layout_marginStart="@dimen/margin_medium"
android:background="?selectableItemBackgroundBorderless"
android:contentDescription="@string/stats_select_next_period_description"
android:padding="4dp"
android:src="@drawable/ic_chevron_right_white_24dp"
app:tint="@color/on_surface_disabled_selector"
android:tintMode="src_in"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
app:tint="@color/on_surface_disabled_selector" />
</LinearLayout>
4 changes: 4 additions & 0 deletions WordPress/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1280,6 +1280,10 @@
<string name="stats_timeframe_weeks">Weeks</string>
<string name="stats_timeframe_months">Months</string>
<string name="stats_timeframe_years">Years</string>
<string name="stats_timeframe_by_day">By day</string>
<string name="stats_timeframe_by_week">By week</string>
<string name="stats_timeframe_by_month">By month</string>
<string name="stats_timeframe_by_year">By year</string>
<string name="stats_timeframe_last_seven_days">Last 7-days</string>
<string name="stats_timeframe_previous_seven_days">Previous 7-days</string>
<string name="stats_views">Views</string>
Expand Down
Loading

0 comments on commit 2c6da28

Please sign in to comment.