From 2b5a98c6921361989f6d06bbf0c7bc19c2a88682 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 15 Sep 2025 17:35:19 -0300 Subject: [PATCH] Use dedicated DB methods for getting new and recently updated apps Otherwise the 200 apps limit causes us to miss apps that we'd still consider "new". --- .../org/fdroid/ui/discover/AppCarousel.kt | 10 +++--- .../org/fdroid/ui/discover/AppDiscoverItem.kt | 1 - .../fdroid/ui/discover/DiscoverPresenter.kt | 14 ++++---- .../fdroid/ui/discover/DiscoverViewModel.kt | 32 ++++++++++++------- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/next/src/main/kotlin/org/fdroid/ui/discover/AppCarousel.kt b/next/src/main/kotlin/org/fdroid/ui/discover/AppCarousel.kt index a9cf9e804..b6ce13048 100644 --- a/next/src/main/kotlin/org/fdroid/ui/discover/AppCarousel.kt +++ b/next/src/main/kotlin/org/fdroid/ui/discover/AppCarousel.kt @@ -94,11 +94,11 @@ fun AppBox(app: AppDiscoverItem, onAppTap: (AppDiscoverItem) -> Unit) { @Composable fun AppCarouselPreview() { val apps = listOf( - AppDiscoverItem("", Names.randomName, isNew = true), - AppDiscoverItem("", Names.randomName, isNew = false), - AppDiscoverItem("", Names.randomName, isNew = false), - AppDiscoverItem("", Names.randomName, isNew = false), - AppDiscoverItem("", Names.randomName, isNew = false), + AppDiscoverItem("", Names.randomName), + AppDiscoverItem("", Names.randomName), + AppDiscoverItem("", Names.randomName), + AppDiscoverItem("", Names.randomName), + AppDiscoverItem("", Names.randomName), ) FDroidContent { AppCarousel("Preview Apps", apps, onTitleTap = {}) {} diff --git a/next/src/main/kotlin/org/fdroid/ui/discover/AppDiscoverItem.kt b/next/src/main/kotlin/org/fdroid/ui/discover/AppDiscoverItem.kt index 550662e0a..48fe22e85 100644 --- a/next/src/main/kotlin/org/fdroid/ui/discover/AppDiscoverItem.kt +++ b/next/src/main/kotlin/org/fdroid/ui/discover/AppDiscoverItem.kt @@ -6,6 +6,5 @@ class AppDiscoverItem( val packageName: String, val name: String, val iconDownloadRequest: DownloadRequest? = null, - val isNew: Boolean, val lastUpdated: Long = -1, ) diff --git a/next/src/main/kotlin/org/fdroid/ui/discover/DiscoverPresenter.kt b/next/src/main/kotlin/org/fdroid/ui/discover/DiscoverPresenter.kt index 20064ace8..a1f8f0f53 100644 --- a/next/src/main/kotlin/org/fdroid/ui/discover/DiscoverPresenter.kt +++ b/next/src/main/kotlin/org/fdroid/ui/discover/DiscoverPresenter.kt @@ -10,18 +10,20 @@ import org.fdroid.ui.categories.CategoryItem @Composable fun DiscoverPresenter( - appsFlow: Flow>, + newAppsFlow: Flow>, + recentlyUpdatedAppsFlow: Flow>, categoriesFlow: Flow>, repositoriesFlow: Flow>, searchResultsFlow: StateFlow, ): DiscoverModel { - val apps = appsFlow.collectAsState(null).value + val newApps = newAppsFlow.collectAsState(null).value + val recentlyUpdatedApps = recentlyUpdatedAppsFlow.collectAsState(null).value val categories = categoriesFlow.collectAsState(null).value val searchResults = searchResultsFlow.collectAsState().value - return if (apps.isNullOrEmpty()) { + return if (newApps.isNullOrEmpty() || recentlyUpdatedApps.isNullOrEmpty()) { val repositories = repositoriesFlow.collectAsState(null).value - if (apps == null) { + if (newApps == null && recentlyUpdatedApps == null) { LoadingDiscoverModel(false) } else if (repositories?.all { !it.enabled } == true) { NoEnabledReposDiscoverModel @@ -33,8 +35,8 @@ fun DiscoverPresenter( } } else { LoadedDiscoverModel( - newApps = apps.filter { it.isNew }, - recentlyUpdatedApps = apps.filter { !it.isNew }, + newApps = newApps, + recentlyUpdatedApps = recentlyUpdatedApps, categories = categories?.groupBy { it.group }, searchResults = searchResults, ) diff --git a/next/src/main/kotlin/org/fdroid/ui/discover/DiscoverViewModel.kt b/next/src/main/kotlin/org/fdroid/ui/discover/DiscoverViewModel.kt index ef9bac3ec..27e2e10ca 100644 --- a/next/src/main/kotlin/org/fdroid/ui/discover/DiscoverViewModel.kt +++ b/next/src/main/kotlin/org/fdroid/ui/discover/DiscoverViewModel.kt @@ -19,7 +19,9 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.withContext import mu.KotlinLogging import org.fdroid.LocaleChooser.getBestLocale +import org.fdroid.database.AppOverviewItem import org.fdroid.database.FDroidDatabase +import org.fdroid.database.Repository import org.fdroid.download.getDownloadRequest import org.fdroid.index.RepoManager import org.fdroid.ui.categories.CategoryItem @@ -47,18 +49,16 @@ class DiscoverViewModel @Inject constructor( private val collator = Collator.getInstance(Locale.getDefault()) val numUpdates = updatesManager.numUpdates - val apps = db.getAppDao().getAppOverviewItems().asFlow().map { list -> + val newApps = db.getAppDao().getNewAppsFlow().map { list -> list.mapNotNull { - val repository = repoManager.getRepository(it.repoId) - ?: return@mapNotNull null - AppDiscoverItem( - packageName = it.packageName, - name = it.getName(localeList) ?: "Unknown App", - isNew = it.lastUpdated == it.added, - lastUpdated = it.lastUpdated, - iconDownloadRequest = it.getIcon(localeList) - ?.getDownloadRequest(repository), - ) + val repository = repoManager.getRepository(it.repoId) ?: return@mapNotNull null + it.toAppDiscoverItem(repository) + } + } + val recentlyUpdatedApps = db.getAppDao().getRecentlyUpdatedAppsFlow().map { list -> + list.mapNotNull { + val repository = repoManager.getRepository(it.repoId) ?: return@mapNotNull null + it.toAppDiscoverItem(repository) } } private val categories = db.getRepositoryDao().getLiveCategories().asFlow().map { categories -> @@ -74,7 +74,8 @@ class DiscoverViewModel @Inject constructor( val localeList = LocaleListCompat.getDefault() val discoverModel: StateFlow = scope.launchMolecule(mode = ContextClock) { DiscoverPresenter( - appsFlow = apps, + newAppsFlow = newApps, + recentlyUpdatedAppsFlow = recentlyUpdatedApps, categoriesFlow = categories, repositoriesFlow = repoManager.repositoriesState, searchResultsFlow = searchResults, @@ -140,4 +141,11 @@ class DiscoverViewModel @Inject constructor( fun onSearchCleared() { searchResults.value = null } + + private fun AppOverviewItem.toAppDiscoverItem(repository: Repository) = AppDiscoverItem( + packageName = packageName, + name = getName(localeList) ?: "Unknown App", + lastUpdated = lastUpdated, + iconDownloadRequest = getIcon(localeList)?.getDownloadRequest(repository), + ) }