Update Migrate IndexMerger and ProductPreferences to use k-serialization

This commit is contained in:
machiav3lli 2022-04-01 01:56:18 +02:00
parent 82d00ac6d6
commit 1c7d2e3e08
2 changed files with 10 additions and 37 deletions

View File

@ -5,9 +5,6 @@ import android.content.SharedPreferences
import com.looker.droidify.database.DatabaseX import com.looker.droidify.database.DatabaseX
import com.looker.droidify.database.entity.Lock import com.looker.droidify.database.entity.Lock
import com.looker.droidify.entity.ProductPreference import com.looker.droidify.entity.ProductPreference
import com.looker.droidify.utility.extension.json.Json
import com.looker.droidify.utility.extension.json.parseDictionary
import com.looker.droidify.utility.extension.json.writeDictionary
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableSharedFlow
@ -52,8 +49,7 @@ object ProductPreferences {
operator fun get(packageName: String): ProductPreference { operator fun get(packageName: String): ProductPreference {
return if (preferences.contains(packageName)) { return if (preferences.contains(packageName)) {
try { try {
Json.factory.createParser(preferences.getString(packageName, "{}")) ProductPreference.fromJson(preferences.getString(packageName, "{}") ?: "{}")
.use { it.parseDictionary(ProductPreference.Companion::deserialize) }
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
defaultProductPreference defaultProductPreference
@ -66,10 +62,7 @@ object ProductPreferences {
operator fun set(packageName: String, productPreference: ProductPreference) { operator fun set(packageName: String, productPreference: ProductPreference) {
val oldProductPreference = this[packageName] val oldProductPreference = this[packageName]
preferences.edit().putString(packageName, ByteArrayOutputStream() preferences.edit().putString(packageName, ByteArrayOutputStream()
.apply { .apply { write(productPreference.toJSON().toByteArray()) }
Json.factory.createGenerator(this)
.use { it.writeDictionary(productPreference::serialize) }
}
.toByteArray().toString(Charset.defaultCharset())).apply() .toByteArray().toString(Charset.defaultCharset())).apply()
if (oldProductPreference.ignoreUpdates != productPreference.ignoreUpdates || if (oldProductPreference.ignoreUpdates != productPreference.ignoreUpdates ||
oldProductPreference.ignoreVersionCode != productPreference.ignoreVersionCode oldProductPreference.ignoreVersionCode != productPreference.ignoreVersionCode

View File

@ -2,14 +2,12 @@ package com.looker.droidify.index
import android.content.ContentValues import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import com.fasterxml.jackson.core.JsonToken import com.looker.droidify.database.Converters.toByteArray
import com.looker.droidify.database.Converters.toReleases
import com.looker.droidify.database.entity.Release import com.looker.droidify.database.entity.Release
import com.looker.droidify.entity.Product import com.looker.droidify.entity.Product
import com.looker.droidify.utility.extension.android.asSequence import com.looker.droidify.utility.extension.android.asSequence
import com.looker.droidify.utility.extension.android.execWithResult import com.looker.droidify.utility.extension.android.execWithResult
import com.looker.droidify.utility.extension.json.Json
import com.looker.droidify.utility.extension.json.collectNotNull
import com.looker.droidify.utility.extension.json.writeDictionary
import java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
import java.io.Closeable import java.io.Closeable
import java.io.File import java.io.File
@ -28,8 +26,7 @@ class IndexMerger(file: File) : Closeable {
fun addProducts(products: List<Product>) { fun addProducts(products: List<Product>) {
for (product in products) { for (product in products) {
val outputStream = ByteArrayOutputStream() val outputStream = ByteArrayOutputStream()
Json.factory.createGenerator(outputStream) outputStream.write(product.toJSON().toByteArray())
.use { it.writeDictionary(product::serialize) }
db.insert("product", null, ContentValues().apply { db.insert("product", null, ContentValues().apply {
put("package_name", product.packageName) put("package_name", product.packageName)
put("description", product.description) put("description", product.description)
@ -42,13 +39,7 @@ class IndexMerger(file: File) : Closeable {
for (pair in pairs) { for (pair in pairs) {
val (packageName, releases) = pair val (packageName, releases) = pair
val outputStream = ByteArrayOutputStream() val outputStream = ByteArrayOutputStream()
Json.factory.createGenerator(outputStream).use { outputStream.write(toByteArray(releases))
it.writeStartArray()
for (release in releases) {
it.writeDictionary(release::serialize)
}
it.writeEndArray()
}
db.insert("releases", null, ContentValues().apply { db.insert("releases", null, ContentValues().apply {
put("package_name", packageName) put("package_name", packageName)
put("data", outputStream.toByteArray()) put("data", outputStream.toByteArray())
@ -72,22 +63,11 @@ class IndexMerger(file: File) : Closeable {
?.use { it -> ?.use { it ->
it.asSequence().map { it.asSequence().map {
val description = it.getString(0) val description = it.getString(0)
val product = Json.factory.createParser(it.getBlob(1)).use { val product = Product.fromJson(String(it.getBlob(1))).apply {
it.nextToken() this.repositoryId = repositoryId
Product.deserialize(it).apply { this.description = description
this.repositoryId = repositoryId
this.description = description
}
} }
val releases = it.getBlob(2)?.let { val releases = it.getBlob(2)?.let { toReleases(it) }.orEmpty()
Json.factory.createParser(it).use {
it.nextToken()
it.collectNotNull(
JsonToken.START_OBJECT,
Release.Companion::deserialize
)
}
}.orEmpty()
product.copy(releases = releases) product.copy(releases = releases)
}.windowed(windowSize, windowSize, true) }.windowed(windowSize, windowSize, true)
.forEach { products -> callback(products, it.count) } .forEach { products -> callback(products, it.count) }