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".
This commit is contained in:
Torsten Grote
2025-09-15 17:35:19 -03:00
parent 68dae57310
commit 2b5a98c692
4 changed files with 33 additions and 24 deletions

View File

@@ -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 = {}) {}

View File

@@ -6,6 +6,5 @@ class AppDiscoverItem(
val packageName: String,
val name: String,
val iconDownloadRequest: DownloadRequest? = null,
val isNew: Boolean,
val lastUpdated: Long = -1,
)

View File

@@ -10,18 +10,20 @@ import org.fdroid.ui.categories.CategoryItem
@Composable
fun DiscoverPresenter(
appsFlow: Flow<List<AppDiscoverItem>>,
newAppsFlow: Flow<List<AppDiscoverItem>>,
recentlyUpdatedAppsFlow: Flow<List<AppDiscoverItem>>,
categoriesFlow: Flow<List<CategoryItem>>,
repositoriesFlow: Flow<List<Repository>>,
searchResultsFlow: StateFlow<SearchResults?>,
): 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,
)

View File

@@ -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<DiscoverModel> = 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),
)
}