Update: Replace entity's Product usage with database.entity's fully

This commit is contained in:
machiav3lli 2022-04-06 03:53:19 +02:00
parent 43180d2844
commit f33ccfd247
10 changed files with 86 additions and 69 deletions

View File

@ -1,9 +1,9 @@
package com.looker.droidify.index package com.looker.droidify.index
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.Author
import com.looker.droidify.entity.Donate import com.looker.droidify.entity.Donate
import com.looker.droidify.entity.Product
import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.android.Android
import org.xml.sax.Attributes import org.xml.sax.Attributes
import org.xml.sax.helpers.DefaultHandler import org.xml.sax.helpers.DefaultHandler
@ -89,32 +89,30 @@ class IndexHandler(private val repositoryId: Long, private val callback: Callbac
val donates = mutableListOf<Donate>() val donates = mutableListOf<Donate>()
val releases = mutableListOf<Release>() val releases = mutableListOf<Release>()
fun build(): Product { fun build(): Product = Product(
return Product( repositoryId = repositoryId,
repositoryId, packageName = packageName,
packageName, name = name,
name, summary = summary,
summary, description = description,
description, added = added,
"", updated = updated,
icon, icon = icon,
"", metadataIcon = "",
Author(authorName, authorEmail, ""), releases = releases,
source, categories = categories.toList(),
changelog, antiFeatures = antiFeatures.toList(),
web, licenses = licenses,
tracker, donates = donates.sortedWith(DonateComparator),
added, screenshots = emptyList(),
updated, suggestedVersionCode = suggestedVersionCode,
suggestedVersionCode, author = Author(authorName, authorEmail, ""),
categories.toList(), source = source,
antiFeatures.toList(), web = web,
licenses, tracker = tracker,
donates.sortedWith(DonateComparator), changelog = changelog,
emptyList(), whatsNew = ""
releases )
)
}
} }
private class ReleaseBuilder { private class ReleaseBuilder {

View File

@ -4,8 +4,8 @@ import android.content.ContentValues
import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteDatabase
import com.looker.droidify.database.Converters.toByteArray import com.looker.droidify.database.Converters.toByteArray
import com.looker.droidify.database.Converters.toReleases import com.looker.droidify.database.Converters.toReleases
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.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 java.io.ByteArrayOutputStream import java.io.ByteArrayOutputStream
@ -67,8 +67,11 @@ class IndexMerger(file: File) : Closeable {
this.repositoryId = repositoryId this.repositoryId = repositoryId
this.description = description this.description = description
} }
val releases = it.getBlob(2)?.let { toReleases(it) }.orEmpty() val releases = it.getBlob(2)?.let(::toReleases).orEmpty()
product.copy(releases = releases) product.apply {
this.releases = releases
refreshVariables()
}
}.windowed(windowSize, windowSize, true) }.windowed(windowSize, windowSize, true)
.forEach { products -> callback(products, it.count) } .forEach { products -> callback(products, it.count) }
} }

View File

@ -2,10 +2,10 @@ package com.looker.droidify.index
import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.core.JsonToken import com.fasterxml.jackson.core.JsonToken
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.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
import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.android.Android
import com.looker.droidify.utility.extension.json.* import com.looker.droidify.utility.extension.json.*
@ -217,28 +217,28 @@ object IndexV1Parser {
} }
.orEmpty().toList() .orEmpty().toList()
return Product( return Product(
repositoryId, repositoryId = repositoryId,
packageName, packageName = packageName,
name, name = name,
summary, summary = summary,
description, description = description,
whatsNew, added = added,
icon, updated = updated,
metadataIcon, icon = icon,
Author(authorName, authorEmail, authorWeb), metadataIcon = metadataIcon,
source, releases = emptyList(),
changelog, categories = categories,
web, antiFeatures = antiFeatures,
tracker, licenses = licenses,
added, donates = donates.sortedWith(IndexHandler.DonateComparator),
updated, screenshots = screenshots,
suggestedVersionCode, suggestedVersionCode = suggestedVersionCode,
categories, author = Author(authorName, authorEmail, authorWeb),
antiFeatures, source = source,
licenses, web = web,
donates.sortedWith(IndexHandler.DonateComparator), tracker = tracker,
screenshots, changelog = changelog,
emptyList() whatsNew = whatsNew
) )
} }

View File

@ -4,9 +4,9 @@ import android.content.Context
import android.net.Uri import android.net.Uri
import com.looker.droidify.content.Cache import com.looker.droidify.content.Cache
import com.looker.droidify.database.DatabaseX import com.looker.droidify.database.DatabaseX
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.database.entity.Repository import com.looker.droidify.database.entity.Repository
import com.looker.droidify.entity.Product
import com.looker.droidify.network.Downloader import com.looker.droidify.network.Downloader
import com.looker.droidify.utility.ProgressInputStream import com.looker.droidify.utility.ProgressInputStream
import com.looker.droidify.utility.RxUtils import com.looker.droidify.utility.RxUtils
@ -469,6 +469,9 @@ object RepositoryUpdater {
.copy(incompatibilities = incompatibilities, selected = firstSelected .copy(incompatibilities = incompatibilities, selected = firstSelected
?.let { it.first.versionCode == release.versionCode && it.second == incompatibilities } == true) ?.let { it.first.versionCode == release.versionCode && it.second == incompatibilities } == true)
} }
return product.copy(releases = releases) return product.apply {
this.releases = releases
refreshVariables()
}
} }
} }

View File

@ -136,7 +136,7 @@ class ScreenshotsFragment() : DialogFragment() {
.observeOn(Schedulers.io()) .observeOn(Schedulers.io())
.flatMapSingle { .flatMapSingle {
RxUtils.querySingle { RxUtils.querySingle {
db.productDao.get(packageName).mapNotNull { it?.data } db.productDao.get(packageName).filterNotNull()
} }
} }
.map { it -> .map { it ->

View File

@ -458,8 +458,9 @@ class SyncService : ConnectionService<SyncService.Binder>() {
val repository = installedRepository.third!! val repository = installedRepository.third!!
val productRepository = db.productDao.get(packageName) val productRepository = db.productDao.get(packageName)
.map { product -> Pair(product?.data!!, repository) } .filterNotNull()
.filter { product -> product.repositoryId == repository.id } .filter { product -> product.repositoryId == repository.id }
.map { product -> Pair(product, repository) }
scope.launch { scope.launch {
Utils.startUpdate( Utils.startUpdate(

View File

@ -44,9 +44,9 @@ import com.looker.droidify.R
import com.looker.droidify.content.Preferences import com.looker.droidify.content.Preferences
import com.looker.droidify.content.ProductPreferences import com.looker.droidify.content.ProductPreferences
import com.looker.droidify.database.entity.Installed import com.looker.droidify.database.entity.Installed
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.database.entity.Repository import com.looker.droidify.database.entity.Repository
import com.looker.droidify.entity.Product
import com.looker.droidify.entity.ProductPreference import com.looker.droidify.entity.ProductPreference
import com.looker.droidify.entity.Screenshot import com.looker.droidify.entity.Screenshot
import com.looker.droidify.network.CoilDownloader import com.looker.droidify.network.CoilDownloader
@ -60,6 +60,7 @@ import com.looker.droidify.utility.extension.text.formatSize
import com.looker.droidify.utility.extension.text.nullIfEmpty import com.looker.droidify.utility.extension.text.nullIfEmpty
import com.looker.droidify.utility.extension.text.trimAfter import com.looker.droidify.utility.extension.text.trimAfter
import com.looker.droidify.utility.extension.text.trimBefore import com.looker.droidify.utility.extension.text.trimBefore
import com.looker.droidify.utility.findSuggestedProduct
import com.looker.droidify.widget.StableRecyclerAdapter import com.looker.droidify.widget.StableRecyclerAdapter
import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor import org.intellij.markdown.flavours.commonmark.CommonMarkFlavourDescriptor
import org.intellij.markdown.html.HtmlGenerator import org.intellij.markdown.html.HtmlGenerator
@ -554,7 +555,7 @@ class AppDetailAdapter(private val callbacks: Callbacks) :
context: Context, packageName: String, context: Context, packageName: String,
products: List<Pair<Product, Repository>>, installed: Installed?, products: List<Pair<Product, Repository>>, installed: Installed?,
) { ) {
val productRepository = Product.findSuggested(products, installed) { it.first } val productRepository = findSuggestedProduct(products, installed) { it.first }
items.clear() items.clear()
if (productRepository != null) { if (productRepository != null) {

View File

@ -17,9 +17,9 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.looker.droidify.R import com.looker.droidify.R
import com.looker.droidify.content.ProductPreferences import com.looker.droidify.content.ProductPreferences
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.database.entity.Repository import com.looker.droidify.database.entity.Repository
import com.looker.droidify.entity.Product
import com.looker.droidify.entity.ProductPreference import com.looker.droidify.entity.ProductPreference
import com.looker.droidify.entity.Screenshot import com.looker.droidify.entity.Screenshot
import com.looker.droidify.installer.AppInstaller import com.looker.droidify.installer.AppInstaller
@ -36,6 +36,7 @@ import com.looker.droidify.utility.Utils.rootInstallerEnabled
import com.looker.droidify.utility.Utils.startUpdate import com.looker.droidify.utility.Utils.startUpdate
import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.android.Android
import com.looker.droidify.utility.extension.text.trimAfter import com.looker.droidify.utility.extension.text.trimAfter
import com.looker.droidify.utility.findSuggestedProduct
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
@ -142,7 +143,7 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
.observeOn(Schedulers.io()) .observeOn(Schedulers.io())
.flatMapSingle { .flatMapSingle {
RxUtils.querySingle { RxUtils.querySingle {
screenActivity.db.productDao.get(packageName).mapNotNull { it?.data } screenActivity.db.productDao.get(packageName).filterNotNull()
} }
} }
.flatMapSingle { products -> .flatMapSingle { products ->
@ -272,8 +273,7 @@ class AppDetailFragment() : ScreenFragment(), AppDetailAdapter.Callbacks {
private suspend fun updateButtons(preference: ProductPreference) = private suspend fun updateButtons(preference: ProductPreference) =
withContext(Dispatchers.Default) { withContext(Dispatchers.Default) {
val installed = installed val installed = installed
val product = val product = findSuggestedProduct(products, installed?.data) { it.first }?.first
Product.findSuggested(products, installed?.data) { it.first }?.first
val compatible = product != null && product.selectedReleases.firstOrNull() val compatible = product != null && product.selectedReleases.firstOrNull()
.let { it != null && it.incompatibilities.isEmpty() } .let { it != null && it.incompatibilities.isEmpty() }
val canInstall = product != null && installed == null && compatible val canInstall = product != null && installed == null && compatible

View File

@ -18,10 +18,10 @@ import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.looker.droidify.R import com.looker.droidify.R
import com.looker.droidify.content.ProductPreferences import com.looker.droidify.content.ProductPreferences
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.database.entity.Repository import com.looker.droidify.database.entity.Repository
import com.looker.droidify.databinding.SheetAppXBinding import com.looker.droidify.databinding.SheetAppXBinding
import com.looker.droidify.entity.Product
import com.looker.droidify.entity.ProductPreference import com.looker.droidify.entity.ProductPreference
import com.looker.droidify.entity.Screenshot import com.looker.droidify.entity.Screenshot
import com.looker.droidify.installer.AppInstaller import com.looker.droidify.installer.AppInstaller
@ -34,6 +34,7 @@ import com.looker.droidify.ui.viewmodels.AppViewModelX
import com.looker.droidify.utility.Utils.rootInstallerEnabled import com.looker.droidify.utility.Utils.rootInstallerEnabled
import com.looker.droidify.utility.Utils.startUpdate import com.looker.droidify.utility.Utils.startUpdate
import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.android.Android
import com.looker.droidify.utility.findSuggestedProduct
import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.disposables.Disposable
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
@ -153,7 +154,7 @@ class AppSheetX() : FullscreenBottomSheetDialogFragment(), AppDetailAdapter.Call
if (it.isNotEmpty() && products.isNotEmpty()) updateSheet() if (it.isNotEmpty() && products.isNotEmpty()) updateSheet()
} }
viewModel.products.observe(viewLifecycleOwner) { viewModel.products.observe(viewLifecycleOwner) {
products = it.mapNotNull { it?.trueData } products = it.filterNotNull()
viewModel.repositories.value?.let { repos -> viewModel.repositories.value?.let { repos ->
if (repos.isNotEmpty() && products.isNotEmpty()) updateSheet() if (repos.isNotEmpty() && products.isNotEmpty()) updateSheet()
} }
@ -203,8 +204,7 @@ class AppSheetX() : FullscreenBottomSheetDialogFragment(), AppDetailAdapter.Call
private suspend fun updateButtons(preference: ProductPreference) = private suspend fun updateButtons(preference: ProductPreference) =
withContext(Dispatchers.Default) { withContext(Dispatchers.Default) {
val installed = installed val installed = installed
val product = val product = findSuggestedProduct(productRepos, installed?.data) { it.first }?.first
Product.findSuggested(productRepos, installed?.data) { it.first }?.first
val compatible = product != null && product.selectedReleases.firstOrNull() val compatible = product != null && product.selectedReleases.firstOrNull()
.let { it != null && it.incompatibilities.isEmpty() } .let { it != null && it.incompatibilities.isEmpty() }
val canInstall = product != null && installed == null && compatible val canInstall = product != null && installed == null && compatible

View File

@ -13,8 +13,8 @@ import com.looker.droidify.PREFS_LANGUAGE_DEFAULT
import com.looker.droidify.R import com.looker.droidify.R
import com.looker.droidify.content.Preferences import com.looker.droidify.content.Preferences
import com.looker.droidify.database.entity.Installed import com.looker.droidify.database.entity.Installed
import com.looker.droidify.database.entity.Product
import com.looker.droidify.database.entity.Repository import com.looker.droidify.database.entity.Repository
import com.looker.droidify.entity.Product
import com.looker.droidify.service.Connection import com.looker.droidify.service.Connection
import com.looker.droidify.service.DownloadService import com.looker.droidify.service.DownloadService
import com.looker.droidify.utility.extension.android.Android import com.looker.droidify.utility.extension.android.Android
@ -84,7 +84,7 @@ object Utils {
products: List<Pair<Product, Repository>>, products: List<Pair<Product, Repository>>,
downloadConnection: Connection<DownloadService.Binder, DownloadService>, downloadConnection: Connection<DownloadService.Binder, DownloadService>,
) { ) {
val productRepository = Product.findSuggested(products, installed) { it.first } val productRepository = findSuggestedProduct(products, installed) { it.first }
val compatibleReleases = productRepository?.first?.selectedReleases.orEmpty() val compatibleReleases = productRepository?.first?.selectedReleases.orEmpty()
.filter { installed == null || installed.signature == it.signature } .filter { installed == null || installed.signature == it.signature }
val releaseFlow = MutableStateFlow(compatibleReleases.firstOrNull()) val releaseFlow = MutableStateFlow(compatibleReleases.firstOrNull())
@ -169,6 +169,17 @@ object Utils {
} }
fun <T> findSuggestedProduct(
products: List<T>,
installed: Installed?,
extract: (T) -> Product,
): T? {
return products.maxWithOrNull(compareBy({
extract(it).compatible &&
(installed == null || installed.signature in extract(it).signatures)
}, { extract(it).versionCode }))
}
val isDarkTheme: Boolean val isDarkTheme: Boolean
get() = when (Preferences[Preferences.Key.Theme]) { get() = when (Preferences[Preferences.Key.Theme]) {
is Preferences.Theme.Light -> false is Preferences.Theme.Light -> false