Skip to content

Commit

Permalink
feat: [ANDROAPP-6642] refactor filter and event period repository
Browse files Browse the repository at this point in the history
  • Loading branch information
xavimolloy committed Feb 27, 2025
1 parent 598291b commit d341e70
Show file tree
Hide file tree
Showing 8 changed files with 68 additions and 52 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package org.dhis2.commons.filters.periods.data

import org.dhis2.commons.filters.periods.model.FilterPeriodType
import org.dhis2.commons.periods.data.PeriodBaseRepository
import org.dhis2.commons.periods.data.PeriodLabelProvider
import org.dhis2.commons.periods.data.PeriodSource
import org.dhis2.commons.periods.model.PeriodOrder
import org.hisp.dhis.android.core.D2
import org.hisp.dhis.android.core.period.PeriodType
import java.util.Date

class FilterPeriodsRepository(d2: D2) : PeriodBaseRepository(d2) {
class FilterPeriodsRepository(private val d2: D2) {

fun getDefaultPeriodTypes(): List<FilterPeriodType> {
return listOf(
Expand Down Expand Up @@ -64,4 +67,21 @@ class FilterPeriodsRepository(d2: D2) : PeriodBaseRepository(d2) {
FilterPeriodType.NONE -> PeriodType.Daily
}
}

fun getPeriodSource(
labelProvider: PeriodLabelProvider,
filterPeriodType: FilterPeriodType,
minDate: Date,
maxDate: Date?,
): PeriodSource {
return PeriodSource(
d2 = d2,
periodLabelProvider = labelProvider,
periodType = getDTOPeriod(filterPeriodType),
initialDate = minDate,
maxDate = maxDate,
selectedDate = null,
periodOrder = PeriodOrder.DESC,
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ import kotlinx.coroutines.flow.map
import org.dhis2.commons.filters.periods.data.FilterPeriodsRepository
import org.dhis2.commons.filters.periods.model.FilterPeriodType
import org.dhis2.commons.periods.data.PeriodLabelProvider
import org.dhis2.commons.periods.data.PeriodSource
import org.dhis2.commons.periods.model.Period
import org.dhis2.commons.periods.model.PeriodOrder
import java.util.Calendar

class GetFilterPeriods(
Expand All @@ -26,14 +24,12 @@ class GetFilterPeriods(
pagingSourceFactory = {
val maxDate = Calendar.getInstance().apply { add(Calendar.YEAR, 1) }.time
val minDate = Calendar.getInstance().apply { add(Calendar.YEAR, -9) }.time
PeriodSource(
periodRepository = filterPeriodRepository,
periodLabelProvider = periodLabelProvider,
periodType = filterPeriodRepository.getDTOPeriod(filterPeriodType),
initialDate = minDate,
// TODO extract to repository
filterPeriodRepository.getPeriodSource(
labelProvider = periodLabelProvider,
filterPeriodType = filterPeriodType,
minDate = minDate,
maxDate = maxDate,
selectedDate = null,
periodOrder = PeriodOrder.DESC,
)
},
).flow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ import org.hisp.dhis.android.core.period.PeriodType
import org.hisp.dhis.android.core.program.ProgramStage
import java.util.Date

class EventPeriodRepository(private val d2: D2) : PeriodBaseRepository(d2) {

class EventPeriodRepository(
private val d2: D2,
) {
fun getEventPeriodMinDate(
programStage: ProgramStage,
isScheduling: Boolean,
Expand Down Expand Up @@ -92,4 +93,28 @@ class EventPeriodRepository(private val d2: D2) : PeriodBaseRepository(d2) {
}
}
}

private fun generatePeriod(
periodType: PeriodType,
date: Date = Date(),
offset: Int = 0,
) = d2.periodModule().periodHelper()
.blockingGetPeriodForPeriodTypeAndDate(periodType, date, offset)

fun getPeriodSource(
periodLabelProvider: PeriodLabelProvider,
selectedDate: Date?,
periodType: PeriodType,
initialDate: Date,
maxDate: Date?,
): PeriodSource {
return PeriodSource(
d2 = d2,
periodLabelProvider = periodLabelProvider,
periodType = periodType,
initialDate = initialDate,
maxDate = maxDate,
selectedDate = selectedDate,
)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,6 @@ class PeriodLabelProvider(
private fun periodIsBetweenYears(startDate: Date, endDate: Date): Boolean {
val startCalendar = Calendar.getInstance().apply { time = startDate }
val endCalendar = Calendar.getInstance().apply { time = endDate }
return startCalendar.get(Calendar.YEAR) != endCalendar.get(Calendar.YEAR)
return startCalendar[Calendar.YEAR] != endCalendar[Calendar.YEAR]
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ import androidx.paging.PagingSource
import androidx.paging.PagingState
import org.dhis2.commons.periods.model.Period
import org.dhis2.commons.periods.model.PeriodOrder
import org.hisp.dhis.android.core.D2
import org.hisp.dhis.android.core.period.PeriodType
import java.util.Date
import java.util.Locale
import org.hisp.dhis.android.core.period.Period as DTOPeriod

internal class PeriodSource(
private val periodRepository: PeriodRepository,
// todo remove period repository and pass d2 instead to generate period
class PeriodSource(
private val d2: D2,
private val periodLabelProvider: PeriodLabelProvider,
private val selectedDate: Date?,
private val periodType: PeriodType,
Expand All @@ -28,7 +30,7 @@ internal class PeriodSource(
val periods: List<Period> = buildList {
repeat(periodsPerPage) { indexInPage ->
val offSet = getOffset(periodOrder, indexInPage, page, periodsPerPage)
val period = periodRepository.generatePeriod(
val period = generatePeriod(
periodType,
if (periodOrder == PeriodOrder.ASC) initialDate else maxDate ?: initialDate,
offSet,
Expand Down Expand Up @@ -104,6 +106,13 @@ internal class PeriodSource(
}
}

private fun generatePeriod(
periodType: PeriodType,
date: Date,
offset: Int,
) = d2.periodModule().periodHelper()
.blockingGetPeriodForPeriodTypeAndDate(periodType, date, offset)

override fun getRefreshKey(state: PagingState<Int, Period>): Int? {
return state.anchorPosition?.let {
state.closestPageToPosition(it)?.prevKey?.plus(1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import org.dhis2.commons.periods.data.EventPeriodRepository
import org.dhis2.commons.periods.data.PeriodLabelProvider
import org.dhis2.commons.periods.data.PeriodSource
import org.dhis2.commons.periods.model.Period
import org.hisp.dhis.android.core.period.PeriodType
import org.hisp.dhis.android.core.program.ProgramStage
Expand All @@ -28,8 +27,7 @@ class GetEventPeriods(
): Flow<PagingData<Period>> = Pager(
config = PagingConfig(pageSize = 20, maxSize = 100, initialLoadSize = 20),
pagingSourceFactory = {
PeriodSource(
periodRepository = eventPeriodRepository,
eventPeriodRepository.getPeriodSource(
periodLabelProvider = periodLabelProvider,
periodType = periodType,
initialDate = eventPeriodRepository.getEventPeriodMinDate(
Expand Down

0 comments on commit d341e70

Please sign in to comment.