From 29593031c8c553a590772f4f82d42662339ab8e7 Mon Sep 17 00:00:00 2001 From: machiav3lli Date: Fri, 4 Feb 2022 01:41:03 +0100 Subject: [PATCH] Add: ReleaseDAO --- .../looker/droidify/database/Converters.kt | 34 ++++++++ .../com/looker/droidify/database/DAOs.kt | 11 +++ .../com/looker/droidify/database/DatabaseX.kt | 4 +- .../droidify/database/entity/Release.kt | 77 ++++++++++--------- 4 files changed, 88 insertions(+), 38 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/database/Converters.kt b/src/main/kotlin/com/looker/droidify/database/Converters.kt index ef367e15..b589d280 100644 --- a/src/main/kotlin/com/looker/droidify/database/Converters.kt +++ b/src/main/kotlin/com/looker/droidify/database/Converters.kt @@ -2,6 +2,8 @@ package com.looker.droidify.database import androidx.room.TypeConverter import com.looker.droidify.database.entity.Release +import com.looker.droidify.database.entity.Release.Companion.deserializeIncompatibilities +import com.looker.droidify.utility.extension.json.writeDictionary import com.looker.droidify.utility.jsonGenerate import com.looker.droidify.utility.jsonParse @@ -35,8 +37,40 @@ object Converters { else string.split(",").map { byteArray.jsonParse { Release.deserialize(it) } } } + @JvmName("releasesToByteArray") @TypeConverter @JvmStatic fun toByteArray(releases: List) = jsonGenerate { releases.forEach { item -> item.serialize(it) }.toString().toByteArray() } + + @TypeConverter + @JvmStatic + fun toIncompatibilities(byteArray: ByteArray) = + byteArray.jsonParse { it.deserializeIncompatibilities() } + + @JvmName("incompatibilitiesToByteArray") + @TypeConverter + @JvmStatic + fun toByteArray(list: List) = + jsonGenerate { generator -> + list.forEach { + generator.writeDictionary { + when (it) { + is Release.Incompatibility.MinSdk -> { + writeStringField("type", "minSdk") + } + is Release.Incompatibility.MaxSdk -> { + writeStringField("type", "maxSdk") + } + is Release.Incompatibility.Platform -> { + writeStringField("type", "platform") + } + is Release.Incompatibility.Feature -> { + writeStringField("type", "feature") + writeStringField("feature", it.feature) + } + }::class + } + } + } } \ No newline at end of file diff --git a/src/main/kotlin/com/looker/droidify/database/DAOs.kt b/src/main/kotlin/com/looker/droidify/database/DAOs.kt index b36628fd..6f4c542e 100644 --- a/src/main/kotlin/com/looker/droidify/database/DAOs.kt +++ b/src/main/kotlin/com/looker/droidify/database/DAOs.kt @@ -188,6 +188,17 @@ interface ProductDao : BaseDao { } } +@Dao +interface ReleaseDao : BaseDao { + // This one for the mode combining releases of different sources + @Query("SELECT * FROM `release` WHERE packageName = :packageName") + fun get(packageName: String): List + + // This one for the separating releases of different sources + @Query("SELECT * FROM `release` WHERE packageName = :packageName AND signature = :signature") + fun get(packageName: String, signature: String): List +} + @Dao interface CategoryDao : BaseDao { @get:Query( diff --git a/src/main/kotlin/com/looker/droidify/database/DatabaseX.kt b/src/main/kotlin/com/looker/droidify/database/DatabaseX.kt index 77485af9..2c214f11 100644 --- a/src/main/kotlin/com/looker/droidify/database/DatabaseX.kt +++ b/src/main/kotlin/com/looker/droidify/database/DatabaseX.kt @@ -15,17 +15,19 @@ import kotlinx.coroutines.launch entities = [ Repository::class, Product::class, + Release::class, ProductTemp::class, Category::class, CategoryTemp::class, Installed::class, Lock::class - ], version = 1 + ], version = 2 ) @TypeConverters(Converters::class) abstract class DatabaseX : RoomDatabase() { abstract val repositoryDao: RepositoryDao abstract val productDao: ProductDao + abstract val releaseDao: ReleaseDao abstract val productTempDao: ProductTempDao abstract val categoryDao: CategoryDao abstract val categoryTempDao: CategoryTempDao diff --git a/src/main/kotlin/com/looker/droidify/database/entity/Release.kt b/src/main/kotlin/com/looker/droidify/database/entity/Release.kt index af040366..72105895 100644 --- a/src/main/kotlin/com/looker/droidify/database/entity/Release.kt +++ b/src/main/kotlin/com/looker/droidify/database/entity/Release.kt @@ -78,25 +78,7 @@ data class Release( generator.writeArray("features") { features.forEach { writeString(it) } } generator.writeArray("platforms") { platforms.forEach { writeString(it) } } generator.writeArray("incompatibilities") { - incompatibilities.forEach { - writeDictionary { - when (it) { - is Incompatibility.MinSdk -> { - writeStringField("type", "minSdk") - } - is Incompatibility.MaxSdk -> { - writeStringField("type", "maxSdk") - } - is Incompatibility.Platform -> { - writeStringField("type", "platform") - } - is Incompatibility.Feature -> { - writeStringField("type", "feature") - writeStringField("feature", it.feature) - } - }::class - } - } + incompatibilities.forEach { serializeIncompatibility(it) } } } @@ -152,24 +134,7 @@ data class Release( it.array("features") -> features = collectNotNullStrings() it.array("platforms") -> platforms = collectNotNullStrings() it.array("incompatibilities") -> incompatibilities = - collectNotNull(JsonToken.START_OBJECT) { - var type = "" - var feature = "" - forEachKey { - when { - it.string("type") -> type = valueAsString - it.string("feature") -> feature = valueAsString - else -> skipChildren() - } - } - when (type) { - "minSdk" -> Incompatibility.MinSdk - "maxSdk" -> Incompatibility.MaxSdk - "platform" -> Incompatibility.Platform - "feature" -> Incompatibility.Feature(feature) - else -> null - } - } + deserializeIncompatibilities() else -> skipChildren() } } @@ -200,5 +165,43 @@ data class Release( incompatibilities ) } + + fun JsonParser.deserializeIncompatibilities() = collectNotNull(JsonToken.START_OBJECT) { + var type = "" + var feature = "" + forEachKey { + when { + it.string("type") -> type = valueAsString + it.string("feature") -> feature = valueAsString + else -> skipChildren() + } + } + when (type) { + "minSdk" -> Incompatibility.MinSdk + "maxSdk" -> Incompatibility.MaxSdk + "platform" -> Incompatibility.Platform + "feature" -> Incompatibility.Feature(feature) + else -> null + } + } + + fun JsonGenerator.serializeIncompatibility(incompatibility: Incompatibility) = + writeDictionary { + when (incompatibility) { + is Incompatibility.MinSdk -> { + writeStringField("type", "minSdk") + } + is Incompatibility.MaxSdk -> { + writeStringField("type", "maxSdk") + } + is Incompatibility.Platform -> { + writeStringField("type", "platform") + } + is Incompatibility.Feature -> { + writeStringField("type", "feature") + writeStringField("feature", incompatibility.feature) + } + }::class + } } }