Skip to content

Commit d1e7e28

Browse files
committed
Merge branch 'trunk' into reorder-screen-objects-and-tests
2 parents 966c4ab + af96f6f commit d1e7e28

File tree

11 files changed

+585
-311
lines changed

11 files changed

+585
-311
lines changed

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/analytics/AnalyticsRepository.kt

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import com.woocommerce.android.ui.analytics.AnalyticsRepository.RevenueResult.Re
1313
import com.woocommerce.android.ui.analytics.AnalyticsRepository.RevenueResult.RevenueError
1414
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticTimePeriod
1515
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRange
16-
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRange.MultipleDateRange
17-
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRange.SimpleDateRange
1816
import com.woocommerce.android.ui.mystore.data.StatsRepository
1917
import com.woocommerce.android.util.CoroutineDispatchers
2018
import kotlinx.coroutines.Deferred
@@ -194,14 +192,9 @@ class AnalyticsRepository @Inject constructor(
194192
granularity: StatsGranularity,
195193
fetchStrategy: FetchStrategy
196194
): Result<WCRevenueStatsModel?> = coroutineScope {
197-
val startDate = when (dateRange) {
198-
is SimpleDateRange -> dateRange.from.formatToYYYYmmDD()
199-
is MultipleDateRange -> dateRange.to.from.formatToYYYYmmDD()
200-
}
201-
val endDate = when (dateRange) {
202-
is SimpleDateRange -> dateRange.to.formatToYYYYmmDD()
203-
is MultipleDateRange -> dateRange.to.to.formatToYYYYmmDD()
204-
}
195+
val currentPeriod = dateRange.getSelectedPeriod()
196+
val startDate = currentPeriod.from.formatToYYYYmmDD()
197+
val endDate = currentPeriod.to.formatToYYYYmmDD()
205198

206199
getCurrentRevenueMutex.withLock {
207200
if (shouldUpdateCurrentStats(startDate, endDate, fetchStrategy == FetchStrategy.ForceNew)) {
@@ -221,14 +214,9 @@ class AnalyticsRepository @Inject constructor(
221214
granularity: StatsGranularity,
222215
fetchStrategy: FetchStrategy
223216
): Result<WCRevenueStatsModel?> = coroutineScope {
224-
val startDate = when (dateRange) {
225-
is SimpleDateRange -> dateRange.from.formatToYYYYmmDD()
226-
is MultipleDateRange -> dateRange.from.from.formatToYYYYmmDD()
227-
}
228-
val endDate = when (dateRange) {
229-
is SimpleDateRange -> dateRange.from.formatToYYYYmmDD()
230-
is MultipleDateRange -> dateRange.from.to.formatToYYYYmmDD()
231-
}
217+
val previousPeriod = dateRange.getComparisonPeriod()
218+
val startDate = previousPeriod.from.formatToYYYYmmDD()
219+
val endDate = previousPeriod.to.formatToYYYYmmDD()
232220

233221
getPreviousRevenueMutex.withLock {
234222
if (shouldUpdatePreviousStats(startDate, endDate, fetchStrategy == FetchStrategy.ForceNew)) {
@@ -248,14 +236,9 @@ class AnalyticsRepository @Inject constructor(
248236
fetchStrategy: FetchStrategy,
249237
quantity: Int
250238
): Result<List<TopPerformerProductEntity>> {
251-
val startDate = when (dateRange) {
252-
is SimpleDateRange -> dateRange.from.formatToYYYYmmDD()
253-
is MultipleDateRange -> dateRange.from.from.formatToYYYYmmDD()
254-
}
255-
val endDate = when (dateRange) {
256-
is SimpleDateRange -> dateRange.to.formatToYYYYmmDD()
257-
is MultipleDateRange -> dateRange.to.to.formatToYYYYmmDD()
258-
}
239+
val totalPeriod = dateRange.getAnalyzedPeriod()
240+
val startDate = totalPeriod.from.formatToYYYYmmDD()
241+
val endDate = totalPeriod.to.formatToYYYYmmDD()
259242

260243
val site = selectedSite.get()
261244
val startDateFormatted = DateUtils.getStartDateForSite(site, startDate)

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/analytics/AnalyticsViewModel.kt

Lines changed: 25 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,20 @@ import com.woocommerce.android.ui.analytics.RefreshIndicator.NotShowIndicator
2323
import com.woocommerce.android.ui.analytics.RefreshIndicator.ShowIndicator
2424
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticTimePeriod
2525
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRange
26-
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRange.MultipleDateRange
27-
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRange.SimpleDateRange
2826
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRangeCalculator
27+
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRangeFormatter
2928
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRangeSelectorViewState
30-
import com.woocommerce.android.ui.analytics.daterangeselector.formatDatesToFriendlyPeriod
3129
import com.woocommerce.android.ui.analytics.informationcard.AnalyticsInformationSectionViewState
3230
import com.woocommerce.android.ui.analytics.informationcard.AnalyticsInformationViewState.DataViewState
3331
import com.woocommerce.android.ui.analytics.informationcard.AnalyticsInformationViewState.LoadingViewState
3432
import com.woocommerce.android.ui.analytics.informationcard.AnalyticsInformationViewState.NoDataState
3533
import com.woocommerce.android.ui.analytics.listcard.AnalyticsListCardItemViewState
3634
import com.woocommerce.android.ui.mystore.MyStoreStatsUsageTracksEventEmitter
3735
import com.woocommerce.android.util.CurrencyFormatter
38-
import com.woocommerce.android.util.DateUtils
3936
import com.woocommerce.android.util.FeatureFlag
4037
import com.woocommerce.android.viewmodel.ResourceProvider
4138
import com.woocommerce.android.viewmodel.ScopedViewModel
4239
import com.woocommerce.android.viewmodel.navArgs
43-
import com.zendesk.util.DateUtils.isSameDay
4440
import dagger.hilt.android.lifecycle.HiltViewModel
4541
import kotlinx.coroutines.flow.MutableStateFlow
4642
import kotlinx.coroutines.flow.StateFlow
@@ -57,13 +53,13 @@ import com.woocommerce.android.ui.analytics.listcard.AnalyticsListViewState.NoDa
5753
@HiltViewModel
5854
class AnalyticsViewModel @Inject constructor(
5955
private val resourceProvider: ResourceProvider,
60-
private val dateUtils: DateUtils,
6156
private val analyticsDateRange: AnalyticsDateRangeCalculator,
6257
private val currencyFormatter: CurrencyFormatter,
6358
private val analyticsRepository: AnalyticsRepository,
6459
private val selectedSite: SelectedSite,
6560
private val transactionLauncher: AnalyticsHubTransactionLauncher,
6661
private val usageTracksEventEmitter: MyStoreStatsUsageTracksEventEmitter,
62+
private val analyticsDateRangeFormatter: AnalyticsDateRangeFormatter,
6763
savedState: SavedStateHandle
6864
) : ScopedViewModel(savedState) {
6965

@@ -85,14 +81,9 @@ class AnalyticsViewModel @Inject constructor(
8581

8682
fun onCustomDateRangeClicked() {
8783
val savedRange = getSavedDateRange()
88-
val fromMillis = when (savedRange) {
89-
is SimpleDateRange -> savedRange.from.time
90-
is MultipleDateRange -> savedRange.to.from.time
91-
}
92-
val toMillis = when (savedRange) {
93-
is SimpleDateRange -> savedRange.to.time
94-
is MultipleDateRange -> savedRange.to.to.time
95-
}
84+
val currentPeriod = savedRange.getSelectedPeriod()
85+
val fromMillis = currentPeriod.from.time
86+
val toMillis = currentPeriod.to.time
9687
triggerEvent(AnalyticsViewEvent.OpenDatePicker(fromMillis, toMillis))
9788
}
9889

@@ -284,63 +275,16 @@ class AnalyticsViewModel @Inject constructor(
284275
private fun updateDateSelector() {
285276
val timePeriod = getSavedTimePeriod()
286277
val dateRange = getSavedDateRange()
278+
val timePeriodDescription = getTimePeriodDescription(timePeriod)
287279
mutableState.value = state.value.copy(
288280
analyticsDateRangeSelectorState = state.value.analyticsDateRangeSelectorState.copy(
289-
fromDatePeriod = calculateFromDatePeriod(dateRange),
290-
toDatePeriod = calculateToDatePeriod(timePeriod, dateRange),
281+
fromDatePeriod = analyticsDateRangeFormatter.fromDescription(dateRange),
282+
toDatePeriod = analyticsDateRangeFormatter.toDescription(dateRange, timePeriodDescription),
291283
selectedPeriod = getTimePeriodDescription(timePeriod)
292284
)
293285
)
294286
}
295287

296-
private fun calculateToDatePeriod(analyticTimeRange: AnalyticTimePeriod, dateRange: AnalyticsDateRange) =
297-
when (dateRange) {
298-
is SimpleDateRange -> resourceProvider.getString(
299-
R.string.analytics_date_range_to_date,
300-
getTimePeriodDescription(analyticTimeRange),
301-
dateUtils.getShortMonthDayAndYearString(
302-
dateUtils.getYearMonthDayStringFromDate(dateRange.to)
303-
).orEmpty()
304-
)
305-
is MultipleDateRange ->
306-
if (isSameDay(dateRange.to.from, dateRange.to.to)) {
307-
resourceProvider.getString(
308-
R.string.analytics_date_range_to_date,
309-
getTimePeriodDescription(analyticTimeRange),
310-
dateUtils.getShortMonthDayAndYearString(
311-
dateUtils.getYearMonthDayStringFromDate(dateRange.to.from)
312-
).orEmpty()
313-
)
314-
} else {
315-
resourceProvider.getString(
316-
R.string.analytics_date_range_to_date,
317-
getTimePeriodDescription(analyticTimeRange),
318-
dateRange.to.formatDatesToFriendlyPeriod()
319-
)
320-
}
321-
}
322-
323-
private fun calculateFromDatePeriod(dateRange: AnalyticsDateRange) = when (dateRange) {
324-
is SimpleDateRange -> resourceProvider.getString(
325-
R.string.analytics_date_range_from_date,
326-
dateUtils.getShortMonthDayAndYearString(dateUtils.getYearMonthDayStringFromDate(dateRange.from)).orEmpty()
327-
)
328-
is MultipleDateRange ->
329-
if (isSameDay(dateRange.from.from, dateRange.from.to)) {
330-
resourceProvider.getString(
331-
R.string.analytics_date_range_from_date,
332-
dateUtils.getShortMonthDayAndYearString(
333-
dateUtils.getYearMonthDayStringFromDate(dateRange.from.from)
334-
).orEmpty()
335-
)
336-
} else {
337-
resourceProvider.getString(
338-
R.string.analytics_date_range_from_date,
339-
dateRange.from.formatDatesToFriendlyPeriod()
340-
)
341-
}
342-
}
343-
344288
private fun getAvailableDateRanges() =
345289
resourceProvider.getStringArray(R.array.analytics_date_range_selectors).asList()
346290

@@ -367,12 +311,18 @@ class AnalyticsViewModel @Inject constructor(
367311
?.let { currencyFormatter.formatCurrency(value, it) }
368312
?: value
369313

370-
private fun buildAnalyticsDateRangeSelectorViewState() = AnalyticsDateRangeSelectorViewState(
371-
fromDatePeriod = calculateFromDatePeriod(getSavedDateRange()),
372-
toDatePeriod = calculateToDatePeriod(getSavedTimePeriod(), getSavedDateRange()),
373-
availableRangeDates = getAvailableDateRanges(),
374-
selectedPeriod = getTimePeriodDescription(getSavedTimePeriod())
375-
)
314+
private fun buildAnalyticsDateRangeSelectorViewState(): AnalyticsDateRangeSelectorViewState {
315+
val timePeriod = getSavedTimePeriod()
316+
val dateRange = getSavedDateRange()
317+
val timePeriodDescription = getTimePeriodDescription(timePeriod)
318+
319+
return AnalyticsDateRangeSelectorViewState(
320+
fromDatePeriod = analyticsDateRangeFormatter.fromDescription(dateRange),
321+
toDatePeriod = analyticsDateRangeFormatter.toDescription(dateRange, timePeriodDescription),
322+
availableRangeDates = getAvailableDateRanges(),
323+
selectedPeriod = getTimePeriodDescription(getSavedTimePeriod())
324+
)
325+
}
376326

377327
private fun buildRevenueDataViewState(data: RevenueData) =
378328
DataViewState(
@@ -426,14 +376,14 @@ class AnalyticsViewModel @Inject constructor(
426376
listRightHeader = resourceProvider.getString(R.string.analytics_products_list_header_subtitle),
427377
items = products
428378
.sortedByDescending { it.quantity }
429-
.mapIndexed { index, it ->
379+
.mapIndexed { index, product ->
430380
AnalyticsListCardItemViewState(
431-
it.image,
432-
it.name,
433-
it.quantity.toString(),
381+
product.image,
382+
product.name,
383+
product.quantity.toString(),
434384
resourceProvider.getString(
435385
R.string.analytics_products_list_item_description,
436-
formatValue(it.netSales.toString(), it.currencyCode)
386+
formatValue(product.netSales.toString(), product.currencyCode)
437387
),
438388
index != products.size - 1
439389
)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.woocommerce.android.ui.analytics.daterangeselector
2+
3+
import android.os.Parcelable
4+
import kotlinx.parcelize.Parcelize
5+
import java.util.Date
6+
7+
data class DateRange(val from: Date, val to: Date)
8+
9+
interface AnalyticsDateRange {
10+
fun getSelectedPeriod(): DateRange
11+
fun getComparisonPeriod(): DateRange
12+
fun getAnalyzedPeriod(): DateRange
13+
}
14+
15+
@Parcelize
16+
class SimpleDateRange(
17+
val from: Date,
18+
val to: Date
19+
) : AnalyticsDateRange, Parcelable {
20+
override fun getSelectedPeriod(): DateRange = DateRange(from = from, to = to)
21+
override fun getComparisonPeriod(): DateRange = DateRange(from = from, to = from)
22+
override fun getAnalyzedPeriod(): DateRange = DateRange(from = from, to = to)
23+
}
24+
25+
@Parcelize
26+
class MultipleDateRange(
27+
val from: SimpleDateRange,
28+
val to: SimpleDateRange
29+
) : AnalyticsDateRange, Parcelable {
30+
override fun getSelectedPeriod(): DateRange = DateRange(from = to.from, to = to.to)
31+
override fun getComparisonPeriod(): DateRange = DateRange(from = from.from, to = from.to)
32+
override fun getAnalyzedPeriod(): DateRange = DateRange(from = from.from, to = to.to)
33+
}

WooCommerce/src/main/kotlin/com/woocommerce/android/ui/analytics/daterangeselector/AnalyticsDateRangeCalculator.kt

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,11 @@
11
package com.woocommerce.android.ui.analytics.daterangeselector
22

3-
import android.os.Parcelable
4-
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRange.MultipleDateRange
5-
import com.woocommerce.android.ui.analytics.daterangeselector.AnalyticsDateRange.SimpleDateRange
63
import com.woocommerce.android.util.DateUtils
7-
import kotlinx.parcelize.Parcelize
84
import java.util.Calendar
95
import java.util.Date
106
import java.util.Locale
117
import javax.inject.Inject
128

13-
sealed class AnalyticsDateRange {
14-
@Parcelize
15-
data class SimpleDateRange(
16-
val from: Date,
17-
val to: Date
18-
) : AnalyticsDateRange(), Parcelable
19-
20-
@Parcelize
21-
data class MultipleDateRange(
22-
val from: SimpleDateRange,
23-
val to: SimpleDateRange
24-
) : AnalyticsDateRange(), Parcelable
25-
}
26-
279
class AnalyticsDateRangeCalculator @Inject constructor(
2810
val dateUtils: DateUtils
2911
) {
@@ -63,7 +45,7 @@ class AnalyticsDateRangeCalculator @Inject constructor(
6345
)
6446

6547
private fun getLastYearRange() = MultipleDateRange(
66-
SimpleDateRange(dateUtils.getDateForFirstDayOfPreviousYear(TWO), getDateForLastDayOfTwoYearsAgo()),
48+
SimpleDateRange(dateUtils.getDateForFirstDayOfPreviousYear(2), getDateForLastDayOfTwoYearsAgo()),
6749
SimpleDateRange(dateUtils.getDateForFirstDayOfPreviousYear(), dateUtils.getDateForLastDayOfPreviousYear()),
6850
)
6951

@@ -80,15 +62,15 @@ class AnalyticsDateRangeCalculator @Inject constructor(
8062

8163
private fun getDateOfFirstDayPreviousQuarter() = dateUtils.getDateForFirstDayOfPreviousQuarter()
8264

83-
private fun getDateOFirstDayTwoQuartersAgo() = dateUtils.getDateForFirstDayOfPreviousQuarter(TWO)
65+
private fun getDateOFirstDayTwoQuartersAgo() = dateUtils.getDateForFirstDayOfPreviousQuarter(2)
8466

85-
private fun getDateOfLastDayTwoQuartersAgo() = dateUtils.getDateForLastDayOfPreviousQuarter(TWO)
67+
private fun getDateOfLastDayTwoQuartersAgo() = dateUtils.getDateForLastDayOfPreviousQuarter(2)
8668

8769
private fun getYesterdayRange() = SimpleDateRange(getDateForYesterday(), getDateForYesterday())
8870

8971
private fun getTodayRange() = SimpleDateRange(dateUtils.getCurrentDate(), dateUtils.getCurrentDate())
9072

91-
private fun getDateForYesterday() = Date(dateUtils.getCurrentDateTimeMinusDays(ONE))
73+
private fun getDateForYesterday() = Date(dateUtils.getCurrentDateTimeMinusDays(1))
9274

9375
private fun getLastMonthRange() =
9476
MultipleDateRange(
@@ -100,9 +82,9 @@ class AnalyticsDateRangeCalculator @Inject constructor(
10082

10183
private fun getDateFirstDayPreviousMonth() = dateUtils.getDateForFirstDayOfPreviousMonth()
10284

103-
private fun getDateLastDayTwoMonthsAgo() = dateUtils.getDateForLastDayOfPreviousMonth(TWO)
85+
private fun getDateLastDayTwoMonthsAgo() = dateUtils.getDateForLastDayOfPreviousMonth(2)
10486

105-
private fun getDateOfFirstDayTwoMonthsAgo() = dateUtils.getDateForFirstDayOfPreviousMonth(TWO)
87+
private fun getDateOfFirstDayTwoMonthsAgo() = dateUtils.getDateForFirstDayOfPreviousMonth(2)
10688

10789
private fun getLastWeekRange() = MultipleDateRange(
10890
SimpleDateRange(getDateOfFirstDayTwoWeeksAgo(), getDateOfLastDayTwoWeeksAgo()),
@@ -113,30 +95,27 @@ class AnalyticsDateRangeCalculator @Inject constructor(
11395

11496
private fun getDateFirstDayOneWeekAgo() = dateUtils.getDateForFirstDayOfPreviousWeek()
11597

116-
private fun getDateOfLastDayTwoWeeksAgo() = dateUtils.getDateForLastDayOfPreviousWeek(TWO)
98+
private fun getDateOfLastDayTwoWeeksAgo() = dateUtils.getDateForLastDayOfPreviousWeek(2)
11799

118-
private fun getDateOfFirstDayTwoWeeksAgo() = dateUtils.getDateForFirstDayOfPreviousWeek(TWO)
100+
private fun getDateOfFirstDayTwoWeeksAgo() = dateUtils.getDateForFirstDayOfPreviousWeek(2)
119101

120102
private fun getMinusOneYearDate() =
121-
dateUtils.getDateTimeAppliedOperation(dateUtils.getCurrentDate(), Calendar.YEAR, MINUS_ONE)
103+
dateUtils.getDateTimeAppliedOperation(dateUtils.getCurrentDate(), Calendar.YEAR, -1)
122104

123105
private fun getDateMinusQuarter() =
124-
dateUtils.getDateTimeAppliedOperation(dateUtils.getCurrentDate(), Calendar.MONTH, MONTHS_IN_QUARTER)
106+
dateUtils.getDateTimeAppliedOperation(dateUtils.getCurrentDate(), Calendar.MONTH, -MONTHS_IN_QUARTER)
125107

126108
private fun getDateSevenDaysAgo() =
127-
dateUtils.getDateTimeAppliedOperation(dateUtils.getCurrentDate(), Calendar.DAY_OF_YEAR, DAYS_IN_WEEK)
109+
dateUtils.getDateTimeAppliedOperation(dateUtils.getCurrentDate(), Calendar.DAY_OF_YEAR, -DAYS_IN_WEEK)
128110

129111
private fun getDateMinusOneMonth() =
130-
dateUtils.getDateTimeAppliedOperation(dateUtils.getCurrentDate(), Calendar.MONTH, MINUS_ONE)
112+
dateUtils.getDateTimeAppliedOperation(dateUtils.getCurrentDate(), Calendar.MONTH, -1)
131113

132-
private fun getDateForLastDayOfTwoYearsAgo() = dateUtils.getDateForLastDayOfPreviousYear(TWO)
114+
private fun getDateForLastDayOfTwoYearsAgo() = dateUtils.getDateForLastDayOfPreviousYear(2)
133115

134116
companion object {
135-
const val DAYS_IN_WEEK = -7
136-
const val MONTHS_IN_QUARTER = -3
137-
const val MINUS_ONE = -1
138-
const val TWO = 2
139-
const val ONE = 1
117+
const val DAYS_IN_WEEK = 7
118+
const val MONTHS_IN_QUARTER = 3
140119
}
141120
}
142121

0 commit comments

Comments
 (0)