From fcd27863a14a0ff8e0304e453007ec2eb46ef7e2 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Mon, 29 Mar 2021 11:44:45 +0530 Subject: [PATCH] app: add support for fetching newest posts Signed-off-by: Harsh Shandilya --- .../data/remote/NewestPostsPagingSource.kt | 33 +++++++++++++++++++ .../lobsters/data/repo/LobstersRepository.kt | 4 +++ .../ui/viewmodel/LobstersViewModel.kt | 9 +++++ 3 files changed, 46 insertions(+) create mode 100644 app/src/main/java/dev/msfjarvis/lobsters/data/remote/NewestPostsPagingSource.kt diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/remote/NewestPostsPagingSource.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/remote/NewestPostsPagingSource.kt new file mode 100644 index 00000000..0e09a780 --- /dev/null +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/remote/NewestPostsPagingSource.kt @@ -0,0 +1,33 @@ +package dev.msfjarvis.lobsters.data.remote + +import androidx.paging.PagingSource +import androidx.paging.PagingState +import dev.msfjarvis.lobsters.data.repo.LobstersRepository +import dev.msfjarvis.lobsters.model.LobstersPost + +class NewestPostsPagingSource constructor( + private val lobstersRepository: LobstersRepository, +) : PagingSource() { + + override suspend fun load(params: LoadParams): LoadResult { + return try { + val page = params.key ?: 1 + // Update cache before fetching a list. + // This is done to make sure that we can update the isSaved status of incoming posts. + lobstersRepository.updateCache() + val posts = lobstersRepository.fetchNewestPosts(page) + + LoadResult.Page( + data = posts, + prevKey = if (page == 1) null else page - 1, + nextKey = page.plus(1) + ) + } catch (e: Exception) { + LoadResult.Error(e) + } + } + + override fun getRefreshKey(state: PagingState): Int { + return state.pages.size + 1 + } +} diff --git a/app/src/main/java/dev/msfjarvis/lobsters/data/repo/LobstersRepository.kt b/app/src/main/java/dev/msfjarvis/lobsters/data/repo/LobstersRepository.kt index 5a1a112b..dad3983c 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/data/repo/LobstersRepository.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/data/repo/LobstersRepository.kt @@ -30,6 +30,10 @@ class LobstersRepository constructor( return@withContext lobstersApi.getHottestPosts(page) } + suspend fun fetchNewestPosts(page: Int): List = withContext(Dispatchers.IO) { + return@withContext lobstersApi.getNewestPosts(page) + } + // https://issuetracker.google.com/issues/181221325 @Suppress("NewApi") suspend fun updateCache() { diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt index c0bd5f69..86575234 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/viewmodel/LobstersViewModel.kt @@ -9,6 +9,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import dev.msfjarvis.lobsters.data.local.SavedPost import dev.msfjarvis.lobsters.data.preferences.ClawPreferences import dev.msfjarvis.lobsters.data.remote.HottestPostsPagingSource +import dev.msfjarvis.lobsters.data.remote.NewestPostsPagingSource import dev.msfjarvis.lobsters.data.repo.LobstersRepository import javax.inject.Inject import kotlinx.coroutines.flow.Flow @@ -28,7 +29,11 @@ class LobstersViewModel @Inject constructor( val hottestPosts = Pager(PagingConfig(25)) { HottestPostsPagingSource(lobstersRepository).also { hottestPostsPagingSource = it } }.flow.cachedIn(viewModelScope) + val newestPosts = Pager(PagingConfig(25)) { + NewestPostsPagingSource(lobstersRepository).also { newestPostsPagingSource = it } + }.flow.cachedIn(viewModelScope) private var hottestPostsPagingSource: HottestPostsPagingSource? = null + private var newestPostsPagingSource: NewestPostsPagingSource? = null init { lobstersRepository.isCacheReady.onEach { ready -> @@ -50,6 +55,10 @@ class LobstersViewModel @Inject constructor( hottestPostsPagingSource?.invalidate() } + fun reloadNewestPosts() { + newestPostsPagingSource?.invalidate() + } + fun toggleSave(post: SavedPost) { viewModelScope.launch { val isSaved = lobstersRepository.isPostSaved(post.shortId)