Remy Benza
10/28/2020, 8:27 AMRemy Benza
10/28/2020, 8:28 AMval playedTracksAsFlow: Flow<PagingData<TrackListItem>> = Pager(PagingConfig(pageSize = 20)) {
PlayedTracksPagingSource(playedTracksRepository, epochAsZonedDateTime.value!!)
}
.flow
.cachedIn(viewModelScope)
}
Remy Benza
10/28/2020, 8:29 AMlifecycleScope.launch {
playedTracksViewModel.playedTracksAsFlow.collectLatest { pagingData: PagingData<TrackListItem> ->
val pagingDataWithHeaders = pagingData.insertSeparators { trackListItem, trackListItem2 ->
val before = (trackListItem as? NowPlaying)
val after = (trackListItem2 as? NowPlaying)
if (before?.until?.hour != after?.from?.hour) {
after?.from?.let {
NowPlayingHeader(it.toLocalTime())
}
} else {
null
}
}
playedTracksAdapter.submitData(pagingDataWithHeaders)
}
}
}
Remy Benza
10/28/2020, 8:30 AMRemy Benza
10/28/2020, 8:30 AMRemy Benza
10/28/2020, 8:32 AMRemy Benza
10/28/2020, 8:32 AMclass PlayedTracksPagingSource(private val playedTracksRepository: PlayedTracksRepository,
private val initialEndDate: ZonedDateTime) : PagingSource<ZonedDateTime, TrackListItem>() {
override suspend fun load(params: LoadParams<ZonedDateTime>): LoadResult<ZonedDateTime, TrackListItem> {
return try {
val userEndDate = params.key ?: initialEndDate
val prevKey = if (ZonedDateTime.now().isAfter(userEndDate.plusHours(3))) userEndDate.plusHours(3) else null
val nextKey = if (ZonedDateTime.now().isAfter(userEndDate.plusHours(3))) userEndDate.plusHours(3) else null // todo
val response = playedTracksRepository.getPlayedTracks(userEndDate.minusHours(3), userEndDate)
LoadResult.Page(
data = response,
prevKey = prevKey,
nextKey = userEndDate.minusHours(3)
)
} catch (e: IOException) {