From 3284745c8193ce249fee5aa477f95d15ed258d69 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Mon, 1 Sep 2025 15:50:43 -0300 Subject: [PATCH] [db] deprecate caching of localized app name and summary This led to many hard to debug issues in the past. It is easier to always fetch fresh data and not cache it. Previously, we needed the cache as a search index. Now, search uses all localizations, so the cache isn't needed anymore. --- .../org/fdroid/database/AppOverviewItemsTest.kt | 3 ++- .../src/main/java/org/fdroid/database/App.kt | 14 ++++++++++++++ .../src/main/java/org/fdroid/database/AppDao.kt | 11 ++++++----- .../java/org/fdroid/database/FDroidDatabase.kt | 3 +++ .../java/org/fdroid/repo/RepoV2StreamReceiver.kt | 2 ++ 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/libs/database/src/dbTest/java/org/fdroid/database/AppOverviewItemsTest.kt b/libs/database/src/dbTest/java/org/fdroid/database/AppOverviewItemsTest.kt index f50a003a2..c029272e5 100644 --- a/libs/database/src/dbTest/java/org/fdroid/database/AppOverviewItemsTest.kt +++ b/libs/database/src/dbTest/java/org/fdroid/database/AppOverviewItemsTest.kt @@ -481,7 +481,8 @@ internal class AppOverviewItemsTest : AppTest() { assertEquals(expected.lastUpdated, actual.lastUpdated) assertEquals(expected.name.getBestLocale(locales), actual.name) assertEquals(expected.summary.getBestLocale(locales), actual.summary) - assertEquals(expected.summary.getBestLocale(locales), actual.summary) + assertEquals(expected.name.getBestLocale(locales), actual.getName(locales)) + assertEquals(expected.summary.getBestLocale(locales), actual.getSummary(locales)) assertEquals(expected.icon.getBestLocale(locales), actual.getIcon(locales)) } diff --git a/libs/database/src/main/java/org/fdroid/database/App.kt b/libs/database/src/main/java/org/fdroid/database/App.kt index c2ec54ced..fed489aa6 100644 --- a/libs/database/src/main/java/org/fdroid/database/App.kt +++ b/libs/database/src/main/java/org/fdroid/database/App.kt @@ -285,9 +285,15 @@ public data class AppOverviewItem internal constructor( public val added: Long, public val lastUpdated: Long, @ColumnInfo(name = "localizedName") + @Deprecated("Use getName() method instead.") public override val name: String? = null, @ColumnInfo(name = "localizedSummary") + @Deprecated("Use getSummary() method instead.") public override val summary: String? = null, + @ColumnInfo(name = "name") + internal val internalName: LocalizedTextV2? = null, + @ColumnInfo(name = "summary") + internal val internalSummary: LocalizedTextV2? = null, public val categories: List? = null, internal val antiFeatures: Map? = null, @Relation( @@ -300,6 +306,14 @@ public data class AppOverviewItem internal constructor( */ public val isCompatible: Boolean, ) : MinimalApp { + public fun getName(localeList: LocaleListCompat): String? { + return internalName.getBestLocale(localeList) + } + + public fun getSummary(localeList: LocaleListCompat): String? { + return internalSummary.getBestLocale(localeList) + } + public override fun getIcon(localeList: LocaleListCompat): FileV2? { return localizedIcon?.filter { icon -> icon.repoId == repoId diff --git a/libs/database/src/main/java/org/fdroid/database/AppDao.kt b/libs/database/src/main/java/org/fdroid/database/AppDao.kt index 91dffbd96..9541bdfae 100644 --- a/libs/database/src/main/java/org/fdroid/database/AppDao.kt +++ b/libs/database/src/main/java/org/fdroid/database/AppDao.kt @@ -376,6 +376,7 @@ internal interface AppDaoInt : AppDao { WHERE repoId = :repoId""") override fun updateCompatibility(repoId: Long) + @Deprecated("Will be removed in future version") @Query("""UPDATE ${AppMetadata.TABLE} SET localizedName = :name, localizedSummary = :summary WHERE repoId = :repoId AND packageName = :packageName""") fun updateAppMetadata(repoId: Long, packageName: String, name: String?, summary: String?) @@ -423,7 +424,7 @@ internal interface AppDaoInt : AppDao { @Transaction @Query("""SELECT repoId, packageName, app.added, app.lastUpdated, localizedName, - localizedSummary, categories, version.antiFeatures, app.isCompatible + localizedSummary, app.name, summary, categories, version.antiFeatures, app.isCompatible FROM ${AppMetadata.TABLE} AS app JOIN ${RepositoryPreferences.TABLE} AS pref USING (repoId) JOIN PreferredRepo USING (packageName) @@ -438,7 +439,7 @@ internal interface AppDaoInt : AppDao { @Transaction @Query("""SELECT repoId, packageName, app.added, app.lastUpdated, localizedName, - localizedSummary, categories, version.antiFeatures, app.isCompatible + localizedSummary, app.name, summary, categories, version.antiFeatures, app.isCompatible FROM ${AppMetadata.TABLE} AS app JOIN ${RepositoryPreferences.TABLE} AS pref USING (repoId) JOIN PreferredRepo USING (packageName) @@ -458,7 +459,7 @@ internal interface AppDaoInt : AppDao { @Transaction @SuppressWarnings(QUERY_MISMATCH) // no anti-features needed here @Query("""SELECT repoId, packageName, added, app.lastUpdated, localizedName, - localizedSummary, categories, app.isCompatible + localizedSummary, name, summary, categories, app.isCompatible FROM ${AppMetadata.TABLE} AS app WHERE repoId = :repoId AND packageName = :packageName""") fun getAppOverviewItem(repoId: Long, packageName: String): AppOverviewItem? @@ -508,7 +509,7 @@ internal interface AppDaoInt : AppDao { @Transaction @Query("""SELECT repoId, packageName, app.added, app.lastUpdated, localizedName, - localizedSummary, categories, version.antiFeatures, app.isCompatible + localizedSummary, name, summary, categories, version.antiFeatures, app.isCompatible FROM ${AppMetadata.TABLE} AS app LEFT JOIN ${HighestVersion.TABLE} AS version USING (repoId, packageName) WHERE repoId = :repoId""") @@ -543,7 +544,7 @@ internal interface AppDaoInt : AppDao { val queryBuilder = StringBuilder( """ SELECT repoId, packageName, app.added, app.lastUpdated, localizedName, - localizedSummary, categories, version.antiFeatures, app.isCompatible + localizedSummary, name, summary, categories, version.antiFeatures, app.isCompatible FROM ${AppMetadata.TABLE} AS app JOIN PreferredRepo USING (packageName) LEFT JOIN ${HighestVersion.TABLE} AS version USING (repoId, packageName) diff --git a/libs/database/src/main/java/org/fdroid/database/FDroidDatabase.kt b/libs/database/src/main/java/org/fdroid/database/FDroidDatabase.kt index b3c4160cc..04c98325e 100644 --- a/libs/database/src/main/java/org/fdroid/database/FDroidDatabase.kt +++ b/libs/database/src/main/java/org/fdroid/database/FDroidDatabase.kt @@ -60,6 +60,8 @@ internal abstract class FDroidDatabaseInt : RoomDatabase(), FDroidDatabase, Clos abstract override fun getAppDao(): AppDaoInt abstract override fun getVersionDao(): VersionDaoInt abstract override fun getAppPrefsDao(): AppPrefsDaoInt + + @Deprecated("Will be removed in future version") override fun afterLocalesChanged(locales: LocaleListCompat) { val appDao = getAppDao() runInTransaction { @@ -119,6 +121,7 @@ public interface FDroidDatabase { * Call this after the system [Locale]s have changed. * If this isn't called, the cached localized app metadata (e.g. name, summary) will be wrong. */ + @Deprecated("Will be removed in future version") public fun afterLocalesChanged( locales: LocaleListCompat = getLocales(Resources.getSystem().configuration), ) diff --git a/libs/database/src/main/java/org/fdroid/repo/RepoV2StreamReceiver.kt b/libs/database/src/main/java/org/fdroid/repo/RepoV2StreamReceiver.kt index 52c43f107..7003b223d 100644 --- a/libs/database/src/main/java/org/fdroid/repo/RepoV2StreamReceiver.kt +++ b/libs/database/src/main/java/org/fdroid/repo/RepoV2StreamReceiver.kt @@ -61,6 +61,8 @@ internal open class RepoV2StreamReceiver( lastUpdated = p.metadata.lastUpdated, name = p.metadata.name.getBestLocale(locales), summary = p.metadata.summary.getBestLocale(locales), + internalName = p.metadata.name, + internalSummary = p.metadata.summary, antiFeatures = p.versions.values.lastOrNull()?.antiFeatures, localizedIcon = p.metadata.icon?.map { (locale, file) -> LocalizedIcon(