Update: Migrate from Database to DatabaseX (4.7/5 in replacing SQLite with Room)

This commit is contained in:
machiav3lli 2021-11-01 01:05:15 +01:00
parent 9235ed6e0d
commit dc65c060e7
15 changed files with 128 additions and 99 deletions

View File

@ -10,7 +10,7 @@ import coil.ImageLoaderFactory
import com.looker.droidify.content.Cache
import com.looker.droidify.content.Preferences
import com.looker.droidify.content.ProductPreferences
import com.looker.droidify.database.Database
import com.looker.droidify.database.DatabaseX
import com.looker.droidify.index.RepositoryUpdater
import com.looker.droidify.network.CoilDownloader
import com.looker.droidify.network.Downloader
@ -24,19 +24,21 @@ import java.net.Proxy
@Suppress("unused")
class MainApplication : Application(), ImageLoaderFactory {
lateinit var db: DatabaseX
override fun onCreate() {
super.onCreate()
val databaseUpdated = Database.init(this)
db = DatabaseX.getInstance(applicationContext)
Preferences.init(this)
ProductPreferences.init(this)
RepositoryUpdater.init()
RepositoryUpdater.init(this)
listenApplications()
listenPreferences()
if (databaseUpdated) {
/*if (databaseUpdated) {
forceSyncAll()
}
}*/
Cache.cleanup(this)
updateSyncJob(false)
@ -60,9 +62,9 @@ class MainApplication : Application(), ImageLoaderFactory {
null
}
if (packageInfo != null) {
Database.InstalledAdapter.put(packageInfo.toInstalledItem())
db.installedDao.put(packageInfo.toInstalledItem())
} else {
Database.InstalledAdapter.delete(packageName)
db.installedDao.delete(packageName)
}
}
}
@ -76,7 +78,7 @@ class MainApplication : Application(), ImageLoaderFactory {
val installedItems =
packageManager.getInstalledPackages(Android.PackageManager.signaturesFlag)
.map { it.toInstalledItem() }
Database.InstalledAdapter.putAll(installedItems)
db.installedDao.put(*installedItems.toTypedArray())
}
private fun listenPreferences() {
@ -160,9 +162,9 @@ class MainApplication : Application(), ImageLoaderFactory {
}
private fun forceSyncAll() {
Database.RepositoryAdapter.getAll(null).forEach {
db.repositoryDao.all.mapNotNull { it.data }.forEach {
if (it.lastModified.isNotEmpty() || it.entityTag.isNotEmpty()) {
Database.RepositoryAdapter.put(it.copy(lastModified = "", entityTag = ""))
db.repositoryDao.put(it.copy(lastModified = "", entityTag = ""))
}
}
Connection(SyncService::class.java, onBind = { connection, binder ->

View File

@ -2,7 +2,8 @@ package com.looker.droidify.content
import android.content.Context
import android.content.SharedPreferences
import com.looker.droidify.database.Database
import com.looker.droidify.database.DatabaseX
import com.looker.droidify.database.Lock
import com.looker.droidify.entity.ProductPreference
import com.looker.droidify.utility.extension.json.Json
import com.looker.droidify.utility.extension.json.parseDictionary
@ -16,25 +17,32 @@ object ProductPreferences {
private val defaultProductPreference = ProductPreference(false, 0L)
private lateinit var preferences: SharedPreferences
private val subject = PublishSubject.create<Pair<String, Long?>>()
lateinit var db: DatabaseX
fun init(context: Context) {
db = DatabaseX.getInstance(context)
preferences = context.getSharedPreferences("product_preferences", Context.MODE_PRIVATE)
Database.LockAdapter.putAll(preferences.all.keys
.mapNotNull { packageName ->
this[packageName].databaseVersionCode?.let {
Pair(
packageName,
it
)
db.lockDao.insert(*preferences.all.keys
.mapNotNull { pName ->
this[pName].databaseVersionCode?.let {
Lock().apply {
package_name = pName
version_code = it
}
})
}
}
.toTypedArray()
)
subject
.observeOn(Schedulers.io())
.subscribe { (packageName, versionCode) ->
.subscribe { (pName, versionCode) ->
if (versionCode != null) {
Database.LockAdapter.put(Pair(packageName, versionCode))
db.lockDao.insert(Lock().apply {
package_name = pName
version_code = versionCode
})
} else {
Database.LockAdapter.delete(packageName)
db.lockDao.delete(pName)
}
}
}

View File

@ -87,9 +87,10 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> {
val request = activeRequests[id]!!.request
val db = DatabaseX.getInstance(requireContext())
return QueryLoader(requireContext()) {
when (request) {
is Request.ProductsAvailable -> Database.ProductAdapter
is Request.ProductsAvailable -> db.productDao
.query(
installed = false,
updates = false,
@ -98,7 +99,7 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
order = request.order,
signal = it
)
is Request.ProductsInstalled -> Database.ProductAdapter
is Request.ProductsInstalled -> db.productDao
.query(
installed = true,
updates = false,
@ -107,7 +108,7 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
order = request.order,
signal = it
)
is Request.ProductsUpdates -> Database.ProductAdapter
is Request.ProductsUpdates -> db.productDao
.query(
installed = true,
updates = true,
@ -116,7 +117,7 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
order = request.order,
signal = it
)
is Request.Repositories -> Database.RepositoryAdapter.query(it)
is Request.Repositories -> db.repositoryDao.allCursor
}
}
}

View File

@ -1,8 +1,10 @@
package com.looker.droidify.database
import android.content.Context
import androidx.room.*
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
@Database(
entities = [
@ -47,8 +49,8 @@ abstract class DatabaseX : RoomDatabase() {
}
}
@Transaction
fun cleanUp(pairs: Set<Pair<Long, Boolean>>) {
runInTransaction {
val result = pairs.windowed(10, 10, true).map {
val ids = it.map { it.first }.toLongArray()
val productsCount = productDao.deleteById(*ids)
@ -57,14 +59,15 @@ abstract class DatabaseX : RoomDatabase() {
repositoryDao.deleteById(*deleteIds)
productsCount != 0 || categoriesCount != 0
}
}
// Use live objects and observers instead
/*if (result.any { it }) {
com.looker.droidify.database.Database.notifyChanged(com.looker.droidify.database.Database.Subject.Products)
}*/
}
@Transaction
fun finishTemporary(repository: com.looker.droidify.entity.Repository, success: Boolean) {
runInTransaction {
if (success) {
productDao.deleteById(repository.id)
categoryDao.deleteById(repository.id)
@ -76,3 +79,4 @@ abstract class DatabaseX : RoomDatabase() {
categoryTempDao.emptyTable()
}
}
}

View File

@ -16,7 +16,7 @@ class Repository {
var id: Long = 0
var enabled = 0
var deleted = 0
var deleted = false
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
var data: Repository? = null
@ -25,7 +25,7 @@ class Repository {
@ColumnInfo(name = "_id")
var id = 0L
var deleted = 0
var deleted = false
}
}
@ -64,12 +64,12 @@ open class Category {
class CategoryTemp : Category()
@Entity(tableName = "memory.installed")
class Installed {
class Installed(pName: String = "") {
@PrimaryKey
var package_name = ""
var package_name = pName
var version = ""
var version_code = 0
var version_code = 0L
var signature = ""
}
@ -78,7 +78,7 @@ class Lock {
@PrimaryKey
var package_name = ""
var version_code = 0
var version_code = 0L
}
object Converters {

View File

@ -4,6 +4,7 @@ import android.content.Context
import android.net.Uri
import com.looker.droidify.content.Cache
import com.looker.droidify.database.Database
import com.looker.droidify.database.DatabaseX
import com.looker.droidify.entity.Product
import com.looker.droidify.entity.Release
import com.looker.droidify.entity.Repository
@ -59,29 +60,28 @@ object RepositoryUpdater {
private val updaterLock = Any()
private val cleanupLock = Any()
lateinit var db: DatabaseX
fun init() {
fun init(context: Context) {
db = DatabaseX.getInstance(context)
var lastDisabled = setOf<Long>()
Observable.just(Unit)
.concatWith(Database.observable(Database.Subject.Repositories))
.concatWith(Database.observable(Database.Subject.Repositories)) // TODO have to be replaced like whole rxJava
.observeOn(Schedulers.io())
.flatMapSingle {
RxUtils.querySingle {
Database.RepositoryAdapter.getAllDisabledDeleted(
it
)
db.repositoryDao.allDisabledDeleted
}
}
.forEach { it ->
val newDisabled = it.asSequence().filter { !it.second }.map { it.first }.toSet()
val newDisabled = it.asSequence().filter { !it.deleted }.map { it.id }.toSet()
val disabled = newDisabled - lastDisabled
lastDisabled = newDisabled
val deleted = it.asSequence().filter { it.second }.map { it.first }.toSet()
val deleted = it.asSequence().filter { it.deleted }.map { it.id }.toSet()
if (disabled.isNotEmpty() || deleted.isNotEmpty()) {
val pairs = (disabled.asSequence().map { Pair(it, false) } +
deleted.asSequence().map { Pair(it, true) }).toSet()
synchronized(cleanupLock) { Database.RepositoryAdapter.cleanup(pairs) }
synchronized(cleanupLock) { db.cleanUp(pairs) }
}
}
}
@ -193,12 +193,14 @@ object RepositoryUpdater {
file: File, lastModified: String, entityTag: String, callback: (Stage, Long, Long?) -> Unit
): Boolean {
var rollback = true
val db = DatabaseX.getInstance(context)
return synchronized(updaterLock) {
try {
val jarFile = JarFile(file, true)
val indexEntry = jarFile.getEntry(indexType.contentName) as JarEntry
val total = indexEntry.size
Database.UpdaterAdapter.createTemporaryTable()
db.productTempDao.emptyTable()
db.categoryTempDao.emptyTable()
val features = context.packageManager.systemAvailableFeatures
.asSequence().map { it.name }.toSet() + setOf("android.hardware.touchscreen")
@ -231,7 +233,7 @@ object RepositoryUpdater {
}
products += transformProduct(product, features, unstable)
if (products.size >= 50) {
Database.UpdaterAdapter.putTemporary(products)
db.productTempDao.putTemporary(products)
products.clear()
}
}
@ -249,7 +251,7 @@ object RepositoryUpdater {
throw InterruptedException()
}
if (products.isNotEmpty()) {
Database.UpdaterAdapter.putTemporary(products)
db.productTempDao.putTemporary(products)
products.clear()
}
Pair(changedRepository, certificateFromIndex)
@ -334,7 +336,7 @@ object RepositoryUpdater {
progress.toLong(),
totalCount.toLong()
)
Database.UpdaterAdapter.putTemporary(products
db.productTempDao.putTemporary(products
.map { transformProduct(it, features, unstable) })
}
}
@ -407,7 +409,7 @@ object RepositoryUpdater {
}
callback(Stage.COMMIT, 0, null)
synchronized(cleanupLock) {
Database.UpdaterAdapter.finishTemporary(
db.finishTemporary(
commitRepository,
true
)
@ -423,7 +425,7 @@ object RepositoryUpdater {
} finally {
file.delete()
if (rollback) {
Database.UpdaterAdapter.finishTemporary(repository, false)
db.finishTemporary(repository, false)
}
}
}

View File

@ -161,7 +161,7 @@ class EditRepositoryFragment() : ScreenFragment() {
})
if (savedInstanceState == null) {
val repository = repositoryId?.let(Database.RepositoryAdapter::get)
val repository = repositoryId?.let { screenActivity.db.repositoryDao.get(it)?.data }
if (repository == null) {
val clipboardManager =
requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
@ -240,9 +240,9 @@ class EditRepositoryFragment() : ScreenFragment() {
}
repositoriesDisposable = Observable.just(Unit)
.concatWith(Database.observable(Database.Subject.Repositories))
.concatWith(Database.observable(Database.Subject.Repositories)) // TODO have to be replaced like whole rxJava
.observeOn(Schedulers.io())
.flatMapSingle { RxUtils.querySingle { Database.RepositoryAdapter.getAll(it) } }
.flatMapSingle { RxUtils.querySingle { screenActivity.db.repositoryDao.all.mapNotNull { it.data } } }
.observeOn(AndroidSchedulers.mainThread())
.subscribe { it ->
takenAddresses = it.asSequence().filter { it.id != repositoryId }
@ -462,10 +462,10 @@ class EditRepositoryFragment() : ScreenFragment() {
MessageDialog(MessageDialog.Message.CantEditSyncing).show(childFragmentManager)
invalidateState()
} else {
val repository = repositoryId?.let(Database.RepositoryAdapter::get)
val repository = repositoryId?.let { screenActivity.db.repositoryDao.get(it)?.data }
?.edit(address, fingerprint, authentication)
?: Repository.newRepository(address, fingerprint, authentication)
val changedRepository = Database.RepositoryAdapter.put(repository)
val changedRepository = screenActivity.db.repositoryDao.put(repository)
if (repositoryId == null && changedRepository.enabled) {
binder.sync(changedRepository)
}

View File

@ -28,6 +28,7 @@ import com.looker.droidify.utility.Utils
import com.looker.droidify.utility.Utils.startUpdate
import com.looker.droidify.utility.extension.android.*
import com.looker.droidify.utility.extension.text.trimAfter
import com.looker.droidify.utility.getInstalledItem
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
@ -132,12 +133,16 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks {
var first = true
productDisposable = Observable.just(Unit)
.concatWith(Database.observable(Database.Subject.Products))
.concatWith(Database.observable(Database.Subject.Products)) // TODO have to be replaced like whole rxJava
.observeOn(Schedulers.io())
.flatMapSingle { RxUtils.querySingle { Database.ProductAdapter.get(packageName, it) } }
.flatMapSingle {
RxUtils.querySingle {
screenActivity.db.productDao.get(packageName).mapNotNull { it?.data }
}
}
.flatMapSingle { products ->
RxUtils
.querySingle { Database.RepositoryAdapter.getAll(it) }
.querySingle { screenActivity.db.repositoryDao.all.mapNotNull { it.data } }
.map { it ->
it.asSequence().map { Pair(it.id, it) }.toMap()
.let {
@ -154,7 +159,7 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks {
}
.flatMapSingle { products ->
RxUtils
.querySingle { Nullable(Database.InstalledAdapter.get(packageName, it)) }
.querySingle { Nullable(screenActivity.db.installedDao.get(packageName).getInstalledItem()) }
.map { Pair(products, it) }
}
.observeOn(AndroidSchedulers.mainThread())

View File

@ -16,13 +16,13 @@ import com.google.android.material.progressindicator.CircularProgressIndicator
import com.google.android.material.textview.MaterialTextView
import com.looker.droidify.R
import com.looker.droidify.content.Preferences
import com.looker.droidify.database.Database
import com.looker.droidify.entity.ProductItem
import com.looker.droidify.entity.Repository
import com.looker.droidify.network.CoilDownloader
import com.looker.droidify.utility.Utils
import com.looker.droidify.utility.extension.resources.*
import com.looker.droidify.utility.extension.text.nullIfEmpty
import com.looker.droidify.utility.getProductItem
import com.looker.droidify.widget.CursorRecyclerAdapter
class ProductsAdapter(private val onClick: (ProductItem) -> Unit) :
@ -113,7 +113,7 @@ class ProductsAdapter(private val onClick: (ProductItem) -> Unit) :
}
private fun getProductItem(position: Int): ProductItem {
return Database.ProductAdapter.transformItem(moveTo(position))
return moveTo(position).getProductItem()
}
override fun onCreateViewHolder(

View File

@ -108,9 +108,9 @@ class ProductsFragment() : BaseFragment(), CursorOwner.Callback {
screenActivity.cursorOwner.attach(this, request)
repositoriesDisposable = Observable.just(Unit)
.concatWith(Database.observable(Database.Subject.Repositories))
.concatWith(Database.observable(Database.Subject.Repositories)) // TODO have to be replaced like whole rxJava
.observeOn(Schedulers.io())
.flatMapSingle { RxUtils.querySingle { Database.RepositoryAdapter.getAll(it) } }
.flatMapSingle { RxUtils.querySingle { screenActivity.db.repositoryDao.all.mapNotNull { it.data } } }
.map { it.asSequence().map { Pair(it.id, it) }.toMap() }
.observeOn(AndroidSchedulers.mainThread())
.subscribe { (recyclerView?.adapter as? ProductsAdapter)?.repositories = it }

View File

@ -6,9 +6,9 @@ import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.switchmaterial.SwitchMaterial
import com.google.android.material.textview.MaterialTextView
import com.looker.droidify.R
import com.looker.droidify.database.Database
import com.looker.droidify.entity.Repository
import com.looker.droidify.utility.extension.resources.inflate
import com.looker.droidify.utility.getRepository
import com.looker.droidify.widget.CursorRecyclerAdapter
class RepositoriesAdapter(
@ -33,7 +33,7 @@ class RepositoriesAdapter(
}
private fun getRepository(position: Int): Repository {
return Database.RepositoryAdapter.transform(moveTo(position))
return moveTo(position).getRepository()
}
override fun onCreateViewHolder(

View File

@ -13,7 +13,6 @@ import androidx.core.widget.NestedScrollView
import androidx.lifecycle.lifecycleScope
import com.google.android.material.textview.MaterialTextView
import com.looker.droidify.R
import com.looker.droidify.database.Database
import com.looker.droidify.databinding.TitleTextItemBinding
import com.looker.droidify.service.Connection
import com.looker.droidify.service.SyncService
@ -104,7 +103,7 @@ class RepositoryFragment() : ScreenFragment() {
}
private fun updateRepositoryView() {
val repository = Database.RepositoryAdapter.get(repositoryId)
val repository = screenActivity.db.repositoryDao.get(repositoryId)?.data
val layout = layout!!
layout.removeAllViews()
if (repository == null) {
@ -130,7 +129,7 @@ class RepositoryFragment() : ScreenFragment() {
if (repository.enabled && (repository.lastModified.isNotEmpty() || repository.entityTag.isNotEmpty())) {
layout.addTitleText(
R.string.number_of_applications,
Database.ProductAdapter.getCount(repository.id).toString()
screenActivity.db.productDao.countForRepository(repository.id).toString()
)
}
} else {

View File

@ -20,6 +20,7 @@ import coil.load
import com.google.android.material.imageview.ShapeableImageView
import com.looker.droidify.R
import com.looker.droidify.database.Database
import com.looker.droidify.database.DatabaseX
import com.looker.droidify.entity.Product
import com.looker.droidify.entity.Repository
import com.looker.droidify.graphics.PaddingDrawable
@ -68,6 +69,7 @@ class ScreenshotsFragment() : DialogFragment() {
val window = dialog.window
val decorView = window?.decorView
val db = DatabaseX.getInstance(requireContext())
if (window != null) {
WindowCompat.setDecorFitsSystemWindows(window, false)
@ -132,13 +134,17 @@ class ScreenshotsFragment() : DialogFragment() {
var restored = false
productDisposable = Observable.just(Unit)
.concatWith(Database.observable(Database.Subject.Products))
.concatWith(Database.observable(Database.Subject.Products)) // TODO have to be replaced like whole rxJava
.observeOn(Schedulers.io())
.flatMapSingle { RxUtils.querySingle { Database.ProductAdapter.get(packageName, it) } }
.flatMapSingle {
RxUtils.querySingle {
db.productDao.get(packageName).mapNotNull { it?.data }
}
}
.map { it ->
Pair(
it.find { it.repositoryId == repositoryId },
Database.RepositoryAdapter.get(repositoryId)
db.repositoryDao.get(repositoryId)?.data
)
}
.observeOn(AndroidSchedulers.mainThread())

View File

@ -227,9 +227,9 @@ class TabsFragment : ScreenFragment() {
}
categoriesDisposable = Observable.just(Unit)
.concatWith(Database.observable(Database.Subject.Products))
.concatWith(Database.observable(Database.Subject.Products)) // TODO have to be replaced like whole rxJava
.observeOn(Schedulers.io())
.flatMapSingle { RxUtils.querySingle { Database.CategoryAdapter.getAll(it) } }
.flatMapSingle { RxUtils.querySingle { screenActivity.db.categoryDao.allNames } }
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
setSectionsAndUpdate(
@ -238,9 +238,9 @@ class TabsFragment : ScreenFragment() {
)
}
repositoriesDisposable = Observable.just(Unit)
.concatWith(Database.observable(Database.Subject.Repositories))
.concatWith(Database.observable(Database.Subject.Repositories)) // TODO have to be replaced like whole rxJava
.observeOn(Schedulers.io())
.flatMapSingle { RxUtils.querySingle { Database.RepositoryAdapter.getAll(it) } }
.flatMapSingle { RxUtils.querySingle { screenActivity.db.repositoryDao.all.mapNotNull { it.data } } }
.observeOn(AndroidSchedulers.mainThread())
.subscribe { it ->
setSectionsAndUpdate(null, it.asSequence().filter { it.enabled }

View File

@ -15,7 +15,7 @@ import androidx.core.app.NotificationCompat
import androidx.fragment.app.Fragment
import com.looker.droidify.*
import com.looker.droidify.content.Preferences
import com.looker.droidify.database.Database
import com.looker.droidify.database.DatabaseX
import com.looker.droidify.entity.ProductItem
import com.looker.droidify.entity.Repository
import com.looker.droidify.index.RepositoryUpdater
@ -25,6 +25,7 @@ import com.looker.droidify.utility.extension.android.asSequence
import com.looker.droidify.utility.extension.android.notificationManager
import com.looker.droidify.utility.extension.resources.getColorFromAttr
import com.looker.droidify.utility.extension.text.formatSize
import com.looker.droidify.utility.getProductItem
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.disposables.Disposable
@ -92,7 +93,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
}
fun sync(request: SyncRequest) {
val ids = Database.RepositoryAdapter.getAll(null)
val ids = db.repositoryDao.all.mapNotNull { it.data }
.asSequence().filter { it.enabled }.map { it.id }.toList()
sync(ids, request)
}
@ -118,7 +119,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
}
fun setEnabled(repository: Repository, enabled: Boolean): Boolean {
Database.RepositoryAdapter.put(repository.enable(enabled))
db.repositoryDao.put(repository.enable(enabled))
if (enabled) {
if (repository.id != currentTask?.task?.repositoryId && !tasks.any { it.repositoryId == repository.id }) {
tasks += Task(repository.id, true)
@ -137,10 +138,10 @@ class SyncService : ConnectionService<SyncService.Binder>() {
}
fun deleteRepository(repositoryId: Long): Boolean {
val repository = Database.RepositoryAdapter.get(repositoryId)
val repository = db.repositoryDao.get(repositoryId)?.data
return repository != null && run {
setEnabled(repository, false)
Database.RepositoryAdapter.markAsDeleted(repository.id)
db.repositoryDao.markAsDeleted(repository.id)
true
}
}
@ -148,12 +149,14 @@ class SyncService : ConnectionService<SyncService.Binder>() {
private val binder = Binder()
override fun onBind(intent: Intent): Binder = binder
lateinit var db: DatabaseX
private var stateDisposable: Disposable? = null
override fun onCreate() {
super.onCreate()
db = DatabaseX.getInstance(applicationContext)
if (Android.sdk(26)) {
NotificationChannel(
NOTIFICATION_CHANNEL_SYNCING,
@ -330,7 +333,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
if (currentTask == null) {
if (tasks.isNotEmpty()) {
val task = tasks.removeAt(0)
val repository = Database.RepositoryAdapter.get(task.repositoryId)
val repository = db.repositoryDao.get(task.repositoryId)?.data
if (repository != null && repository.enabled) {
val lastStarted = started
val newStarted =
@ -374,7 +377,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
if (hasUpdates && Preferences[Preferences.Key.UpdateNotify]) {
val disposable = RxUtils
.querySingle { it ->
Database.ProductAdapter
db.productDao
.query(
installed = true,
updates = true,
@ -384,8 +387,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
signal = it
)
.use {
it.asSequence().map(Database.ProductAdapter::transformItem)
.toList()
it.asSequence().map { it.getProductItem() }.toList()
}
}
.subscribeOn(Schedulers.io())