From a2c058877a9a10cca275330b484fd371cdf8a7ed Mon Sep 17 00:00:00 2001 From: Aditya Wasan Date: Sun, 31 Jan 2021 15:42:39 +0530 Subject: [PATCH] src: add an in-memory map to cache db posts Signed-off-by: Aditya Wasan --- .../lobsters/data/repo/LobstersRepository.kt | 45 ++++++++++++++----- .../lobsters/ui/main/MainActivity.kt | 2 - .../ui/viewmodel/LobstersViewModel.kt | 21 +++------ 3 files changed, 39 insertions(+), 29 deletions(-) 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 8285df9d..af3c920f 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 @@ -2,35 +2,56 @@ package dev.msfjarvis.lobsters.data.repo import dev.msfjarvis.lobsters.data.local.LobstersPost import dev.msfjarvis.lobsters.database.LobstersDatabase +import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import javax.inject.Inject class LobstersRepository @Inject constructor(private val lobstersDatabase: LobstersDatabase) { + private val savedPostsCache: MutableMap = mutableMapOf() + private val coroutineScope = CoroutineScope(Job() + Dispatchers.IO) + + init { + coroutineScope.launch { + getAllPosts().forEach { + savedPostsCache.putIfAbsent(it.short_id, it) + } + } + } + fun isPostSaved(postId: String): Boolean { - val post = lobstersDatabase.postQueries.isPostSaved(postId).executeAsOneOrNull() - return post != null + return savedPostsCache.containsKey(postId) } - suspend fun getPost(postId: String): LobstersPost? = withContext(Dispatchers.IO) { + fun getPostFromCache(postId: String): LobstersPost? { + return savedPostsCache[postId] + } + + fun getAllPostsFromCache(): List { + return savedPostsCache.values.toList() + } + + private suspend fun getPost(postId: String): LobstersPost? = withContext(Dispatchers.IO) { return@withContext lobstersDatabase.postQueries.selectPost(postId).executeAsOneOrNull() } - suspend fun getSavedPosts(): List = withContext(Dispatchers.IO) { - return@withContext lobstersDatabase.postQueries.selectSavedPosts().executeAsList() + private suspend fun getAllPosts(): List = withContext(Dispatchers.IO) { + return@withContext lobstersDatabase.postQueries.selectAllPosts().executeAsList() } - suspend fun addPostToDB(post: LobstersPost) = withContext(Dispatchers.IO) { - lobstersDatabase.postQueries.insertOrReplacePost(post) - } - - suspend fun savePost(post: LobstersPost) = withContext(Dispatchers.IO) { + suspend fun addPost(post: LobstersPost) = withContext(Dispatchers.IO) { + if (!savedPostsCache.containsKey(post.short_id)) { + savedPostsCache.putIfAbsent(post.short_id, post) lobstersDatabase.postQueries.insertOrReplacePost(post.copy(is_saved = true)) + } } - suspend fun removeSavedPost(post: LobstersPost) = withContext(Dispatchers.IO) { - if (isPostSaved(post.short_id)) { + suspend fun removePost(post: LobstersPost) = withContext(Dispatchers.IO) { + if (savedPostsCache.containsKey(post.short_id)) { + savedPostsCache.remove(post.short_id) lobstersDatabase.postQueries.removeSavedPost(post.short_id) } } diff --git a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt index ade5f6f2..ec54d98f 100644 --- a/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt +++ b/app/src/main/java/dev/msfjarvis/lobsters/ui/main/MainActivity.kt @@ -64,8 +64,6 @@ fun LobstersApp() { val savedPosts by viewModel.savedPosts.collectAsState() val hottestPostsListState = rememberLazyListState() - viewModel.getSavedPosts() - Scaffold( bottomBar = { LobstersBottomNav( 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 5e996b6f..d2e14d75 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 @@ -17,12 +17,11 @@ import javax.inject.Inject @HiltViewModel class LobstersViewModel @Inject constructor( - private val pagingSource: LobstersPagingSource, private val lobstersRepository: LobstersRepository, private val lobstersApi: LobstersApi, ) : ViewModel() { - private val _savedPosts = MutableStateFlow>(emptyList()) private lateinit var source: LobstersPagingSource + private val _savedPosts = MutableStateFlow(lobstersRepository.getAllPostsFromCache()) val savedPosts = _savedPosts.asStateFlow() val posts = Pager(PagingConfig(25)) { source = LobstersPagingSource(lobstersApi, lobstersRepository) @@ -37,29 +36,21 @@ class LobstersViewModel @Inject constructor( } } - fun getSavedPosts() { - viewModelScope.launch { - lobstersRepository.getSavedPosts().forEach { - _savedPosts.value = _savedPosts.value + it - } - } - } - - fun invalidateSource() { + private fun invalidateSource() { source.invalidate() } private fun savePost(post: LobstersPost) { viewModelScope.launch { - lobstersRepository.savePost(post) - _savedPosts.value = _savedPosts.value + post.copy(is_saved = true) + lobstersRepository.addPost(post) + _savedPosts.value = lobstersRepository.getAllPostsFromCache() } } private fun removeSavedPost(post: LobstersPost) { viewModelScope.launch { - lobstersRepository.removeSavedPost(post) - _savedPosts.value = _savedPosts.value - post.copy(is_saved = true) + lobstersRepository.removePost(post) + _savedPosts.value = lobstersRepository.getAllPostsFromCache() } } }