Skip to content

Commit

Permalink
feat: [ANDROAPP-6788] Fix cognitive complexity code smell in period s…
Browse files Browse the repository at this point in the history
…ource
  • Loading branch information
xavimolloy committed Feb 25, 2025
1 parent 779785b commit 9033f33
Showing 1 changed file with 37 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import androidx.paging.PagingState
import org.dhis2.commons.periods.model.Period
import org.dhis2.commons.periods.model.PeriodOrder
import org.hisp.dhis.android.core.period.PeriodType
import org.hisp.dhis.android.core.period.Period as DTOPeriod
import java.util.Date
import java.util.Locale

Expand All @@ -17,7 +18,7 @@ internal class PeriodSource(
private val maxDate: Date?,
private val periodOrder: PeriodOrder = PeriodOrder.ASC,

) : PagingSource<Int, Period>() {
) : PagingSource<Int, Period>() {

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Period> {
return try {
Expand All @@ -26,20 +27,14 @@ internal class PeriodSource(
val page = params.key ?: 1
val periods: List<Period> = buildList {
repeat(periodsPerPage) { indexInPage ->
val offset = if (periodOrder == PeriodOrder.ASC) {
indexInPage + periodsPerPage * (page - 1)
} else {
-indexInPage - periodsPerPage * (page - 1)
}
val offSet = getOffset(periodOrder, indexInPage, page, periodsPerPage)
val period = periodRepository.generatePeriod(
periodType,
if (periodOrder == PeriodOrder.ASC) initialDate else maxDate ?: initialDate,
offset,
offSet,
)
if (periodOrder == PeriodOrder.ASC) {
if (maxDate == null || period.startDate()
?.before(maxDate) == true || period.startDate() == maxDate
) {
manageAscendingOrderPeriodGeneration(period, maxDate, {
add(
Period(
id = period.periodId()!!,
Expand All @@ -56,9 +51,10 @@ internal class PeriodSource(
endDate = period.endDate()!!,
),
)
} else {
}, {
maxPageReached = true
}
})

} else {
if (period.startDate()?.after(initialDate) == true) {
add(
Expand Down Expand Up @@ -94,10 +90,39 @@ internal class PeriodSource(
}
}

private fun manageAscendingOrderPeriodGeneration(
period: DTOPeriod,
maxDate: Date?,
addPeriodToListCallback: (() -> Unit),
breakLoopCallBack: (() -> Unit)
) {
if (maxDate == null || period.startDate()
?.before(maxDate) == true || period.startDate() == maxDate
) {
addPeriodToListCallback()
} else {
breakLoopCallBack()
}

}

override fun getRefreshKey(state: PagingState<Int, Period>): Int? {
return state.anchorPosition?.let {
state.closestPageToPosition(it)?.prevKey?.plus(1)
?: state.closestPageToPosition(it)?.nextKey?.minus(1)
}
}
}

private fun getOffset(
periodOrder: PeriodOrder,
indexInPage: Int,
page: Int,
periodsPerPage: Int
): Int {
return if (periodOrder == PeriodOrder.ASC) {
indexInPage + periodsPerPage * (page - 1)
} else {
-indexInPage - periodsPerPage * (page - 1)
}
}

0 comments on commit 9033f33

Please sign in to comment.