From aecff91ddaa0d993eb188da228859a5149d5dd92 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Wed, 4 May 2022 10:50:52 -0300 Subject: [PATCH] [db] make repo icon and name localizable One of those last minute requests for changing index structure... We don't bother with making a new table for localizable repo icons. They just get serialized into the DB. If we ever need to update the structure, we can consider wiping the icons. They can get updated with a full index update. --- .../java/org/fdroid/database/Converters.kt | 10 ++++++ .../org/fdroid/database/FDroidDatabase.kt | 2 +- .../java/org/fdroid/database/Repository.kt | 16 ++++++--- .../java/org/fdroid/database/RepositoryDao.kt | 6 ++-- .../org/fdroid/database/ReflectionTest.kt | 34 ------------------- 5 files changed, 26 insertions(+), 42 deletions(-) delete mode 100644 database/src/test/java/org/fdroid/database/ReflectionTest.kt diff --git a/database/src/main/java/org/fdroid/database/Converters.kt b/database/src/main/java/org/fdroid/database/Converters.kt index 7a8800e1d..774e2e2e9 100644 --- a/database/src/main/java/org/fdroid/database/Converters.kt +++ b/database/src/main/java/org/fdroid/database/Converters.kt @@ -25,6 +25,16 @@ internal object Converters { return text?.let { json.encodeToString(localizedTextV2Serializer, it) } } + @TypeConverter + fun fromStringToLocalizedFileV2(value: String?): LocalizedFileV2? { + return value?.let { json.decodeFromString(localizedFileV2Serializer, it) } + } + + @TypeConverter + fun localizedFileV2toString(file: LocalizedFileV2?): String? { + return file?.let { json.encodeToString(localizedFileV2Serializer, it) } + } + @TypeConverter fun fromStringToMapOfLocalizedTextV2(value: String?): Map? { return value?.let { json.decodeFromString(mapOfLocalizedTextV2Serializer, it) } diff --git a/database/src/main/java/org/fdroid/database/FDroidDatabase.kt b/database/src/main/java/org/fdroid/database/FDroidDatabase.kt index ef51f92b8..7ec3f7402 100644 --- a/database/src/main/java/org/fdroid/database/FDroidDatabase.kt +++ b/database/src/main/java/org/fdroid/database/FDroidDatabase.kt @@ -16,7 +16,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch @Database( - version = 4, // TODO set version to 1 before release and wipe old schemas + version = 5, // TODO set version to 1 before release and wipe old schemas entities = [ // repo CoreRepository::class, diff --git a/database/src/main/java/org/fdroid/database/Repository.kt b/database/src/main/java/org/fdroid/database/Repository.kt index 7d4146dcc..a16b782a8 100644 --- a/database/src/main/java/org/fdroid/database/Repository.kt +++ b/database/src/main/java/org/fdroid/database/Repository.kt @@ -11,6 +11,7 @@ import org.fdroid.index.IndexUtils.getFingerprint import org.fdroid.index.v2.AntiFeatureV2 import org.fdroid.index.v2.CategoryV2 import org.fdroid.index.v2.FileV2 +import org.fdroid.index.v2.LocalizedFileV2 import org.fdroid.index.v2.LocalizedTextV2 import org.fdroid.index.v2.MirrorV2 import org.fdroid.index.v2.ReleaseChannelV2 @@ -19,12 +20,13 @@ import org.fdroid.index.v2.RepoV2 @Entity public data class CoreRepository( @PrimaryKey(autoGenerate = true) val repoId: Long = 0, - val name: String, - @Embedded(prefix = "icon_") val icon: FileV2?, + val name: LocalizedTextV2 = emptyMap(), + val icon: LocalizedFileV2?, val address: String, val webBaseUrl: String? = null, val timestamp: Long, val version: Int?, + val maxAge: Int?, val description: LocalizedTextV2 = emptyMap(), val certificate: String?, ) @@ -41,6 +43,7 @@ internal fun RepoV2.toCoreRepository( webBaseUrl = webBaseUrl, timestamp = timestamp, version = version, + maxAge = null, description = description, certificate = certificate, ) @@ -74,13 +77,13 @@ public data class Repository( internal val preferences: RepositoryPreferences, ) { val repoId: Long get() = repository.repoId - val name: String get() = repository.name - val icon: FileV2? get() = repository.icon + internal val name: LocalizedTextV2 get() = repository.name + internal val icon: LocalizedFileV2? get() = repository.icon val address: String get() = repository.address val webBaseUrl: String? get() = repository.webBaseUrl val timestamp: Long get() = repository.timestamp val version: Int get() = repository.version ?: 0 - val description: LocalizedTextV2 get() = repository.description + internal val description: LocalizedTextV2 get() = repository.description val certificate: String? get() = repository.certificate val weight: Int get() = preferences.weight @@ -120,8 +123,11 @@ public data class Repository( } else emptyList() } + public fun getName(localeList: LocaleListCompat): String? = name.getBestLocale(localeList) public fun getDescription(localeList: LocaleListCompat): String? = description.getBestLocale(localeList) + + public fun getIcon(localeList: LocaleListCompat): FileV2? = icon.getBestLocale(localeList) } @Entity( diff --git a/database/src/main/java/org/fdroid/database/RepositoryDao.kt b/database/src/main/java/org/fdroid/database/RepositoryDao.kt index e65b141a8..047cf6645 100644 --- a/database/src/main/java/org/fdroid/database/RepositoryDao.kt +++ b/database/src/main/java/org/fdroid/database/RepositoryDao.kt @@ -89,11 +89,12 @@ internal interface RepositoryDaoInt : RepositoryDao { @Transaction override fun insert(initialRepo: InitialRepository) { val repo = CoreRepository( - name = initialRepo.name, + name = mapOf("en-US" to initialRepo.name), address = initialRepo.address, icon = null, timestamp = -1, version = initialRepo.version, + maxAge = null, description = mapOf("en-US" to initialRepo.description), certificate = initialRepo.certificate, ) @@ -114,11 +115,12 @@ internal interface RepositoryDaoInt : RepositoryDao { password: String?, ): Long { val repo = CoreRepository( - name = address, + name = mapOf("en-US" to address), icon = null, address = address, timestamp = System.currentTimeMillis(), version = null, + maxAge = null, certificate = null, ) val repoId = insertOrReplace(repo) diff --git a/database/src/test/java/org/fdroid/database/ReflectionTest.kt b/database/src/test/java/org/fdroid/database/ReflectionTest.kt deleted file mode 100644 index 4aabee308..000000000 --- a/database/src/test/java/org/fdroid/database/ReflectionTest.kt +++ /dev/null @@ -1,34 +0,0 @@ -package org.fdroid.database - -import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json -import kotlinx.serialization.json.jsonObject -import org.fdroid.index.v2.ReflectionDiffer.applyDiff -import org.fdroid.test.TestRepoUtils.getRandomFileV2 -import org.fdroid.test.TestRepoUtils.getRandomRepo -import kotlin.random.Random -import kotlin.test.Test -import kotlin.test.assertEquals - -internal class ReflectionTest { - - @Test - fun testRepository() { - val repo = getRandomRepo().toCoreRepository(version = 42) - val icon = getRandomFileV2() - val description = if (Random.nextBoolean()) mapOf("de" to null, "en" to "foo") else null - val json = """ - { - "name": "test", - "timestamp": ${Long.MAX_VALUE}, - "icon": ${Json.encodeToString(icon)}, - "description": ${Json.encodeToString(description)} - } - """.trimIndent() - val diff = Json.parseToJsonElement(json).jsonObject - val diffed = applyDiff(repo, diff) - println(diffed) - assertEquals(Long.MAX_VALUE, diffed.timestamp) - } - -}