mirror of
https://github.com/Aviortheking/Neo-Store.git
synced 2025-04-23 19:32:16 +00:00
Update: Complement database.entity's Product & make serializable to replace entity' Product
This commit is contained in:
parent
2d7e6a7e90
commit
43180d2844
@ -1,9 +1,10 @@
|
|||||||
package com.looker.droidify.database
|
package com.looker.droidify.database
|
||||||
|
|
||||||
import androidx.room.TypeConverter
|
import androidx.room.TypeConverter
|
||||||
|
import com.looker.droidify.database.entity.Product
|
||||||
import com.looker.droidify.database.entity.Release
|
import com.looker.droidify.database.entity.Release
|
||||||
|
import com.looker.droidify.entity.Author
|
||||||
import com.looker.droidify.entity.Donate
|
import com.looker.droidify.entity.Donate
|
||||||
import com.looker.droidify.entity.Product
|
|
||||||
import com.looker.droidify.entity.Screenshot
|
import com.looker.droidify.entity.Screenshot
|
||||||
|
|
||||||
object Converters {
|
object Converters {
|
||||||
@ -28,6 +29,14 @@ object Converters {
|
|||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun toByteArray(product: Product) = product.toJSON().toByteArray()
|
fun toByteArray(product: Product) = product.toJSON().toByteArray()
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
@JvmStatic
|
||||||
|
fun toAuthor(byteArray: ByteArray) = Author.fromJson(String(byteArray))
|
||||||
|
|
||||||
|
@TypeConverter
|
||||||
|
@JvmStatic
|
||||||
|
fun toByteArray(author: Author) = author.toJSON().toByteArray()
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
fun toReleases(byteArray: ByteArray): List<Release> =
|
fun toReleases(byteArray: ByteArray): List<Release> =
|
||||||
|
@ -148,7 +148,7 @@ interface ProductDao : BaseDao<Product> {
|
|||||||
COALESCE(installed.$ROW_VERSION_CODE, 0xffffffff) AND $signatureMatches)
|
COALESCE(installed.$ROW_VERSION_CODE, 0xffffffff) AND $signatureMatches)
|
||||||
AS $ROW_CAN_UPDATE, product.$ROW_COMPATIBLE, product.$ROW_ICON,
|
AS $ROW_CAN_UPDATE, product.$ROW_COMPATIBLE, product.$ROW_ICON,
|
||||||
product.$ROW_METADATA_ICON, product.$ROW_RELEASES, product.$ROW_CATEGORIES,
|
product.$ROW_METADATA_ICON, product.$ROW_RELEASES, product.$ROW_CATEGORIES,
|
||||||
product.$ROW_ANTIFEATURES, product.$ROW_LICENSES, product.$ROW_DONATES, product.$ROW_SCREENSHOTS, product.$ROW_DATA,"""
|
product.$ROW_ANTIFEATURES, product.$ROW_LICENSES, product.$ROW_DONATES, product.$ROW_SCREENSHOTS,"""
|
||||||
|
|
||||||
// Calculate the matching score with the search query
|
// Calculate the matching score with the search query
|
||||||
if (searchQuery.isNotEmpty()) {
|
if (searchQuery.isNotEmpty()) {
|
||||||
@ -306,33 +306,9 @@ interface ProductTempDao : BaseDao<ProductTemp> {
|
|||||||
fun insertCategory(vararg product: CategoryTemp)
|
fun insertCategory(vararg product: CategoryTemp)
|
||||||
|
|
||||||
@Transaction
|
@Transaction
|
||||||
fun putTemporary(products: List<com.looker.droidify.entity.Product>) {
|
fun putTemporary(products: List<Product>) {
|
||||||
products.forEach {
|
products.forEach {
|
||||||
val signatures = it.signatures.joinToString { ".$it" }
|
insert(it.let { it.asProductTemp() })
|
||||||
.let { if (it.isNotEmpty()) "$it." else "" }
|
|
||||||
insert(it.let {
|
|
||||||
ProductTemp().apply {
|
|
||||||
repository_id = it.repositoryId
|
|
||||||
package_name = it.packageName
|
|
||||||
name = it.name
|
|
||||||
summary = it.summary
|
|
||||||
description = it.description
|
|
||||||
added = it.added
|
|
||||||
updated = it.updated
|
|
||||||
version_code = it.versionCode
|
|
||||||
this.signatures = signatures
|
|
||||||
compatible = if (it.compatible) 1 else 0
|
|
||||||
data = it
|
|
||||||
icon = it.icon
|
|
||||||
metadataIcon = it.metadataIcon
|
|
||||||
releases = it.releases
|
|
||||||
categories = it.categories
|
|
||||||
antiFeatures = it.antiFeatures
|
|
||||||
licenses = it.licenses
|
|
||||||
donates = it.donates
|
|
||||||
screenshots = it.screenshots
|
|
||||||
}
|
|
||||||
})
|
|
||||||
it.categories.forEach { category ->
|
it.categories.forEach { category ->
|
||||||
insertCategory(CategoryTemp().apply {
|
insertCategory(CategoryTemp().apply {
|
||||||
repositoryId = it.repositoryId
|
repositoryId = it.repositoryId
|
||||||
|
@ -21,7 +21,7 @@ import kotlinx.coroutines.launch
|
|||||||
CategoryTemp::class,
|
CategoryTemp::class,
|
||||||
Installed::class,
|
Installed::class,
|
||||||
Lock::class
|
Lock::class
|
||||||
], version = 4
|
], version = 5
|
||||||
)
|
)
|
||||||
@TypeConverters(Converters::class)
|
@TypeConverters(Converters::class)
|
||||||
abstract class DatabaseX : RoomDatabase() {
|
abstract class DatabaseX : RoomDatabase() {
|
||||||
|
@ -1,25 +1,30 @@
|
|||||||
package com.looker.droidify.database.entity
|
package com.looker.droidify.database.entity
|
||||||
|
|
||||||
import androidx.room.ColumnInfo
|
|
||||||
import androidx.room.Entity
|
import androidx.room.Entity
|
||||||
|
import com.looker.droidify.entity.Author
|
||||||
import com.looker.droidify.entity.Donate
|
import com.looker.droidify.entity.Donate
|
||||||
import com.looker.droidify.entity.ProductItem
|
import com.looker.droidify.entity.ProductItem
|
||||||
import com.looker.droidify.entity.Screenshot
|
import com.looker.droidify.entity.Screenshot
|
||||||
|
import com.looker.droidify.utility.extension.text.nullIfEmpty
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
import kotlinx.serialization.decodeFromString
|
||||||
|
import kotlinx.serialization.encodeToString
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
|
||||||
open class Product {
|
// TODO Add Product Extras to handle favorite lists etc..
|
||||||
|
|
||||||
var name = ""
|
|
||||||
var summary = ""
|
|
||||||
var description = ""
|
|
||||||
var added = 0L
|
|
||||||
var updated = 0L
|
|
||||||
var signatures = ""
|
|
||||||
var compatible = 0
|
|
||||||
var icon = ""
|
|
||||||
var metadataIcon = ""
|
|
||||||
@Entity(tableName = "product", primaryKeys = ["repositoryId", "packageName"])
|
@Entity(tableName = "product", primaryKeys = ["repositoryId", "packageName"])
|
||||||
|
@Serializable
|
||||||
|
open class Product(
|
||||||
var repositoryId: Long,
|
var repositoryId: Long,
|
||||||
var packageName: String
|
var packageName: String
|
||||||
|
) {
|
||||||
|
var name: String = ""
|
||||||
|
var summary: String = ""
|
||||||
|
var description: String = ""
|
||||||
|
var added: Long = 0L
|
||||||
|
var updated: Long = 0L
|
||||||
|
var icon: String = ""
|
||||||
|
var metadataIcon: String = ""
|
||||||
var releases: List<Release> = emptyList()
|
var releases: List<Release> = emptyList()
|
||||||
var categories: List<String> = emptyList()
|
var categories: List<String> = emptyList()
|
||||||
var antiFeatures: List<String> = emptyList()
|
var antiFeatures: List<String> = emptyList()
|
||||||
@ -27,13 +32,64 @@ open class Product {
|
|||||||
var donates: List<Donate> = emptyList()
|
var donates: List<Donate> = emptyList()
|
||||||
var screenshots: List<Screenshot> = emptyList()
|
var screenshots: List<Screenshot> = emptyList()
|
||||||
var versionCode: Long = 0L
|
var versionCode: Long = 0L
|
||||||
|
var suggestedVersionCode: Long = 0L
|
||||||
|
var signatures: List<String> = emptyList()
|
||||||
|
var compatible: Boolean = false
|
||||||
|
var author: Author = Author()
|
||||||
|
var source: String = ""
|
||||||
|
var web: String = ""
|
||||||
|
var tracker: String = ""
|
||||||
|
var changelog: String = ""
|
||||||
|
var whatsNew: String = ""
|
||||||
|
|
||||||
// TODO Remove in next iteration
|
constructor(
|
||||||
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
|
repositoryId: Long,
|
||||||
var data: com.looker.droidify.entity.Product? = null
|
packageName: String,
|
||||||
|
name: String,
|
||||||
val trueData: com.looker.droidify.entity.Product?
|
summary: String,
|
||||||
get() = data?.copy(repositoryId = repository_id)
|
description: String,
|
||||||
|
added: Long,
|
||||||
|
updated: Long,
|
||||||
|
icon: String,
|
||||||
|
metadataIcon: String,
|
||||||
|
releases: List<Release>,
|
||||||
|
categories: List<String>,
|
||||||
|
antiFeatures: List<String>,
|
||||||
|
licenses: List<String>,
|
||||||
|
donates: List<Donate>,
|
||||||
|
screenshots: List<Screenshot>,
|
||||||
|
suggestedVersionCode: Long = 0L,
|
||||||
|
author: Author = Author(),
|
||||||
|
source: String = "",
|
||||||
|
web: String = "",
|
||||||
|
tracker: String = "",
|
||||||
|
changelog: String = "",
|
||||||
|
whatsNew: String = ""
|
||||||
|
) : this(repositoryId, packageName) {
|
||||||
|
this.name = name
|
||||||
|
this.summary = summary
|
||||||
|
this.description = description
|
||||||
|
this.added = added
|
||||||
|
this.updated = updated
|
||||||
|
this.icon = icon
|
||||||
|
this.metadataIcon = metadataIcon
|
||||||
|
this.releases = releases
|
||||||
|
this.categories = categories
|
||||||
|
this.antiFeatures = antiFeatures
|
||||||
|
this.licenses = licenses
|
||||||
|
this.donates = donates
|
||||||
|
this.screenshots = screenshots
|
||||||
|
this.versionCode = selectedReleases.firstOrNull()?.versionCode ?: 0L
|
||||||
|
this.suggestedVersionCode = suggestedVersionCode
|
||||||
|
this.signatures = selectedReleases.mapNotNull { it.signature.nullIfEmpty() }.distinct()
|
||||||
|
this.compatible = selectedReleases.firstOrNull()?.incompatibilities?.isEmpty() == true
|
||||||
|
this.author = author
|
||||||
|
this.source = source
|
||||||
|
this.web = web
|
||||||
|
this.tracker = tracker
|
||||||
|
this.changelog = changelog
|
||||||
|
this.whatsNew = whatsNew
|
||||||
|
}
|
||||||
|
|
||||||
val selectedReleases: List<Release>
|
val selectedReleases: List<Release>
|
||||||
get() = releases.filter { it.selected }
|
get() = releases.filter { it.selected }
|
||||||
@ -58,7 +114,93 @@ open class Product {
|
|||||||
canUpdate(installed),
|
canUpdate(installed),
|
||||||
0
|
0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fun canUpdate(installed: Installed?): Boolean =
|
||||||
|
installed != null && compatible && versionCode > installed.versionCode && installed.signature in signatures
|
||||||
|
|
||||||
|
fun refreshVariables() {
|
||||||
|
this.versionCode = selectedReleases.firstOrNull()?.versionCode ?: 0L
|
||||||
|
this.signatures = selectedReleases.mapNotNull { it.signature.nullIfEmpty() }.distinct()
|
||||||
|
this.compatible = selectedReleases.firstOrNull()?.incompatibilities?.isEmpty() == true
|
||||||
|
}
|
||||||
|
|
||||||
|
fun toJSON() = Json.encodeToString(this)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun fromJson(json: String) = Json.decodeFromString<Product>(json)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Entity(tableName = "temporary_product")
|
@Entity(tableName = "temporary_product")
|
||||||
class ProductTemp : Product()
|
class ProductTemp(
|
||||||
|
repositoryId: Long,
|
||||||
|
packageName: String,
|
||||||
|
name: String,
|
||||||
|
summary: String,
|
||||||
|
description: String,
|
||||||
|
added: Long,
|
||||||
|
updated: Long,
|
||||||
|
icon: String,
|
||||||
|
metadataIcon: String,
|
||||||
|
releases: List<Release>,
|
||||||
|
categories: List<String>,
|
||||||
|
antiFeatures: List<String>,
|
||||||
|
licenses: List<String>,
|
||||||
|
donates: List<Donate>,
|
||||||
|
screenshots: List<Screenshot>,
|
||||||
|
suggestedVersionCode: Long = 0L,
|
||||||
|
author: Author = Author(),
|
||||||
|
source: String = "",
|
||||||
|
web: String = "",
|
||||||
|
tracker: String = "",
|
||||||
|
changelog: String = "",
|
||||||
|
whatsNew: String = ""
|
||||||
|
) : Product(
|
||||||
|
repositoryId = repositoryId,
|
||||||
|
packageName = packageName,
|
||||||
|
name = name,
|
||||||
|
summary = summary,
|
||||||
|
description = description,
|
||||||
|
added = added,
|
||||||
|
updated = updated,
|
||||||
|
icon = icon,
|
||||||
|
metadataIcon = metadataIcon,
|
||||||
|
releases = releases,
|
||||||
|
categories = categories,
|
||||||
|
antiFeatures = antiFeatures,
|
||||||
|
licenses = licenses,
|
||||||
|
donates = donates,
|
||||||
|
screenshots = screenshots,
|
||||||
|
suggestedVersionCode = suggestedVersionCode,
|
||||||
|
author = author,
|
||||||
|
source = source,
|
||||||
|
web = web,
|
||||||
|
tracker = tracker,
|
||||||
|
changelog = changelog,
|
||||||
|
whatsNew = whatsNew
|
||||||
|
)
|
||||||
|
|
||||||
|
fun Product.asProductTemp(): ProductTemp = ProductTemp(
|
||||||
|
repositoryId = repositoryId,
|
||||||
|
packageName = packageName,
|
||||||
|
name = name,
|
||||||
|
summary = summary,
|
||||||
|
description = description,
|
||||||
|
added = added,
|
||||||
|
updated = updated,
|
||||||
|
icon = icon,
|
||||||
|
metadataIcon = metadataIcon,
|
||||||
|
releases = releases,
|
||||||
|
categories = categories,
|
||||||
|
antiFeatures = antiFeatures,
|
||||||
|
licenses = licenses,
|
||||||
|
donates = donates,
|
||||||
|
screenshots = screenshots,
|
||||||
|
suggestedVersionCode = suggestedVersionCode,
|
||||||
|
author = author,
|
||||||
|
source = source,
|
||||||
|
web = web,
|
||||||
|
tracker = tracker,
|
||||||
|
changelog = changelog,
|
||||||
|
whatsNew = whatsNew
|
||||||
|
)
|
@ -6,7 +6,13 @@ import kotlinx.serialization.encodeToString
|
|||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
data class Author(val name: String, val email: String, val web: String)
|
data class Author(val name: String = "", val email: String = "", val web: String = "") {
|
||||||
|
fun toJSON() = Json.encodeToString(this)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun fromJson(json: String) = Json.decodeFromString<Author>(json)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
sealed class Donate {
|
sealed class Donate {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user