Skip to content

Commit

Permalink
Improve feeds fetching logic
Browse files Browse the repository at this point in the history
  • Loading branch information
prof18 committed Sep 11, 2023
1 parent a56e385 commit 8931d36
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ import com.prof18.feedflow.BrowserManager
import com.prof18.feedflow.MR
import com.prof18.feedflow.core.model.FeedItem
import com.prof18.feedflow.core.model.FeedItemClickedInfo
import com.prof18.feedflow.domain.feed.manager.FeedManagerRepository
import com.prof18.feedflow.domain.model.FeedUpdateStatus
import com.prof18.feedflow.domain.model.FinishedFeedUpdateStatus
import com.prof18.feedflow.domain.model.InProgressFeedUpdateStatus
Expand All @@ -66,6 +67,7 @@ internal fun HomeScreen(
) {
val homeViewModel = koinViewModel<HomeViewModel>()
val browserManager = koinInject<BrowserManager>()
val feedManagerRepository = koinInject<FeedManagerRepository>()

val loadingState by homeViewModel.loadingState.collectAsStateWithLifecycle()
val feedState by homeViewModel.feedState.collectAsStateWithLifecycle()
Expand Down Expand Up @@ -118,6 +120,9 @@ internal fun HomeScreen(
homeViewModel.forceFeedRefresh()
}
},
onDeleteDatabase = {
feedManagerRepository.deleteAllFeeds()
},
)
},
containerColor = Color.Transparent,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.unit.dp
import com.prof18.feedflow.BuildConfig
import com.prof18.feedflow.MR
import com.prof18.feedflow.ui.preview.FeedFlowPreview
import dev.icerock.moko.resources.compose.stringResource
Expand All @@ -40,6 +41,7 @@ internal fun HomeAppBar(
onClick: () -> Unit,
onDoubleClick: () -> Unit,
onForceRefreshClick: () -> Unit,
onDeleteDatabase: () -> Unit,
) {
var showMenu by remember { mutableStateOf(false) }

Expand Down Expand Up @@ -71,6 +73,7 @@ internal fun HomeAppBar(
onSettingsButtonClicked()
},
onForceRefreshClick = onForceRefreshClick,
onDeleteDatabase = onDeleteDatabase,
)
},
modifier = Modifier.pointerInput(Unit) {
Expand All @@ -91,6 +94,7 @@ private fun SettingsDropdownMenu(
onClearOldArticlesClicked: () -> Unit,
onSettingsButtonClicked: () -> Unit,
onForceRefreshClick: () -> Unit,
onDeleteDatabase: () -> Unit,
) {
DropdownMenu(
expanded = showMenu,
Expand Down Expand Up @@ -158,6 +162,23 @@ private fun SettingsDropdownMenu(
)
},
)

if (BuildConfig.DEBUG) {
DropdownMenuItem(
onClick = {
onDeleteDatabase()
},
text = {
Text("Delete database")
},
leadingIcon = {
Icon(
imageVector = Icons.Default.Delete,
contentDescription = null,
)
},
)
}
}
}

Expand All @@ -173,6 +194,7 @@ private fun HomeAppBarPreview() {
onClick = { },
onDoubleClick = {},
onForceRefreshClick = {},
onDeleteDatabase = {},
)
}
}
2 changes: 1 addition & 1 deletion iosApp/Source/Home/HomeScreen.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ struct HomeScreen: View {
unreadCount: $unreadCount,
sheetToShow: $sheetToShow,
onRefresh: {
homeViewModel.getNewFeeds()
homeViewModel.getNewFeeds(isFirstLaunch: false)
},
updateReadStatus: { index in
homeViewModel.updateReadStatus(lastVisibleIndex: index)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ interface FeedRetrieverRepository {
suspend fun updateReadStatus(itemsToUpdates: List<FeedItemId>)

@NativeCoroutinesIgnore
suspend fun fetchFeeds(updateLoadingInfo: Boolean = true, forceRefresh: Boolean = false)
suspend fun fetchFeeds(
updateLoadingInfo: Boolean = true,
forceRefresh: Boolean = false,
isFirstLaunch: Boolean = false,
)

@NativeCoroutinesIgnore
suspend fun markAllFeedAsRead()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,11 @@ internal class FeedRetrieverRepositoryImpl(
override suspend fun updateReadStatus(itemsToUpdates: List<FeedItemId>) =
databaseHelper.updateReadStatus(itemsToUpdates)

override suspend fun fetchFeeds(updateLoadingInfo: Boolean, forceRefresh: Boolean) {
override suspend fun fetchFeeds(
updateLoadingInfo: Boolean,
forceRefresh: Boolean,
isFirstLaunch: Boolean,
) {
return withContext(dispatcherProvider.io) {
if (updateLoadingInfo) {
updateMutableState.update { StartedFeedUpdateStatus }
Expand All @@ -127,7 +131,13 @@ internal class FeedRetrieverRepositoryImpl(
}
databaseHelper.updateNewStatus()

if (!isFirstLaunch) {
getFeeds()
}

parseFeeds(feedSourceUrls, updateLoadingInfo, forceRefresh)

getFeeds()
}
}
}
Expand Down Expand Up @@ -183,20 +193,6 @@ internal class FeedRetrieverRepositoryImpl(
)

databaseHelper.insertFeedItems(items, dateFormatter.currentTimeMillis())

mutableFeedState.update { oldItems ->
oldItems
.asSequence()
.plus(
oldItems.filterNot { item ->
items.any { it.id == item.id }
},
)
.filterNot { it.isRead }
.distinctBy { it.id }
.sortedByDescending { it.pubDateMillis }
.toList()
}
} catch (e: Throwable) {
logger.e(e) { "Something went wrong, skipping: ${feedSource.url}}" }
errorMutableState.update {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,11 @@ class HomeViewModel(
private var lastUpdateIndex = 0

init {
observeFeeds()
getNewFeeds()
observeErrorState()
getNewFeeds(isFirstLaunch = true)
}

private fun observeFeeds() {
private fun observeErrorState() {
feedRetrieverRepository.getFeeds()

scope.launch {
Expand Down Expand Up @@ -82,10 +82,10 @@ class HomeViewModel(
}
}

fun getNewFeeds() {
fun getNewFeeds(isFirstLaunch: Boolean = false) {
lastUpdateIndex = 0
scope.launch {
feedRetrieverRepository.fetchFeeds()
feedRetrieverRepository.fetchFeeds(isFirstLaunch)
}
}

Expand Down

0 comments on commit 8931d36

Please sign in to comment.