From dc65c060e754838619e6fd86cf0d8fe7a8e41945 Mon Sep 17 00:00:00 2001 From: machiav3lli Date: Mon, 1 Nov 2021 01:05:15 +0100 Subject: [PATCH] Update: Migrate from Database to DatabaseX (4.7/5 in replacing SQLite with Room) --- .../com/looker/droidify/MainApplication.kt | 22 +++++----- .../droidify/content/ProductPreferences.kt | 32 +++++++++------ .../looker/droidify/database/CursorOwner.kt | 9 +++-- .../com/looker/droidify/database/DatabaseX.kt | 40 ++++++++++--------- .../com/looker/droidify/database/Tables.kt | 12 +++--- .../droidify/index/RepositoryUpdater.kt | 32 ++++++++------- .../droidify/screen/EditRepositoryFragment.kt | 10 ++--- .../looker/droidify/screen/ProductFragment.kt | 13 ++++-- .../looker/droidify/screen/ProductsAdapter.kt | 4 +- .../droidify/screen/ProductsFragment.kt | 4 +- .../droidify/screen/RepositoriesAdapter.kt | 4 +- .../droidify/screen/RepositoryFragment.kt | 5 +-- .../droidify/screen/ScreenshotsFragment.kt | 12 ++++-- .../looker/droidify/screen/TabsFragment.kt | 8 ++-- .../looker/droidify/service/SyncService.kt | 20 +++++----- 15 files changed, 128 insertions(+), 99 deletions(-) diff --git a/src/main/kotlin/com/looker/droidify/MainApplication.kt b/src/main/kotlin/com/looker/droidify/MainApplication.kt index f6c10af3..52bf688f 100644 --- a/src/main/kotlin/com/looker/droidify/MainApplication.kt +++ b/src/main/kotlin/com/looker/droidify/MainApplication.kt @@ -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 -> diff --git a/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt b/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt index fb6ef278..ee3ac97e 100644 --- a/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt +++ b/src/main/kotlin/com/looker/droidify/content/ProductPreferences.kt @@ -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>() + 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) } } } diff --git a/src/main/kotlin/com/looker/droidify/database/CursorOwner.kt b/src/main/kotlin/com/looker/droidify/database/CursorOwner.kt index b1e47842..10f07d6a 100644 --- a/src/main/kotlin/com/looker/droidify/database/CursorOwner.kt +++ b/src/main/kotlin/com/looker/droidify/database/CursorOwner.kt @@ -87,9 +87,10 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks { override fun onCreateLoader(id: Int, args: Bundle?): Loader { 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 { 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 { 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 { order = request.order, signal = it ) - is Request.Repositories -> Database.RepositoryAdapter.query(it) + is Request.Repositories -> db.repositoryDao.allCursor } } } diff --git a/src/main/kotlin/com/looker/droidify/database/DatabaseX.kt b/src/main/kotlin/com/looker/droidify/database/DatabaseX.kt index bff2a514..72a10b27 100644 --- a/src/main/kotlin/com/looker/droidify/database/DatabaseX.kt +++ b/src/main/kotlin/com/looker/droidify/database/DatabaseX.kt @@ -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,15 +49,16 @@ abstract class DatabaseX : RoomDatabase() { } } - @Transaction fun cleanUp(pairs: Set>) { - val result = pairs.windowed(10, 10, true).map { - val ids = it.map { it.first }.toLongArray() - val productsCount = productDao.deleteById(*ids) - val categoriesCount = categoryDao.deleteById(*ids) - val deleteIds = it.filter { it.second }.map { it.first }.toLongArray() - repositoryDao.deleteById(*deleteIds) - productsCount != 0 || categoriesCount != 0 + runInTransaction { + val result = pairs.windowed(10, 10, true).map { + val ids = it.map { it.first }.toLongArray() + val productsCount = productDao.deleteById(*ids) + val categoriesCount = categoryDao.deleteById(*ids) + val deleteIds = it.filter { it.second }.map { it.first }.toLongArray() + repositoryDao.deleteById(*deleteIds) + productsCount != 0 || categoriesCount != 0 + } } // Use live objects and observers instead /*if (result.any { it }) { @@ -63,16 +66,17 @@ abstract class DatabaseX : RoomDatabase() { }*/ } - @Transaction fun finishTemporary(repository: com.looker.droidify.entity.Repository, success: Boolean) { - if (success) { - productDao.deleteById(repository.id) - categoryDao.deleteById(repository.id) - productDao.insert(*(productTempDao.all)) - categoryDao.insert(*(categoryTempDao.all)) - repositoryDao.put(repository) + runInTransaction { + if (success) { + productDao.deleteById(repository.id) + categoryDao.deleteById(repository.id) + productDao.insert(*(productTempDao.all)) + categoryDao.insert(*(categoryTempDao.all)) + repositoryDao.put(repository) + } + productTempDao.emptyTable() + categoryTempDao.emptyTable() } - productTempDao.emptyTable() - categoryTempDao.emptyTable() } } \ No newline at end of file diff --git a/src/main/kotlin/com/looker/droidify/database/Tables.kt b/src/main/kotlin/com/looker/droidify/database/Tables.kt index 18f6e3bf..3b881cdc 100644 --- a/src/main/kotlin/com/looker/droidify/database/Tables.kt +++ b/src/main/kotlin/com/looker/droidify/database/Tables.kt @@ -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 { diff --git a/src/main/kotlin/com/looker/droidify/index/RepositoryUpdater.kt b/src/main/kotlin/com/looker/droidify/index/RepositoryUpdater.kt index 20e63893..1f0b9aee 100644 --- a/src/main/kotlin/com/looker/droidify/index/RepositoryUpdater.kt +++ b/src/main/kotlin/com/looker/droidify/index/RepositoryUpdater.kt @@ -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() 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) } } } diff --git a/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt b/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt index 99bec4f3..ae5376f4 100644 --- a/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/EditRepositoryFragment.kt @@ -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) } diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt index 97cadc8e..40dcec0e 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductFragment.kt @@ -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()) diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductsAdapter.kt b/src/main/kotlin/com/looker/droidify/screen/ProductsAdapter.kt index 84fccbbd..8041f2b8 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductsAdapter.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductsAdapter.kt @@ -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( diff --git a/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt index 70a5dc63..9d5ca363 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ProductsFragment.kt @@ -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 } diff --git a/src/main/kotlin/com/looker/droidify/screen/RepositoriesAdapter.kt b/src/main/kotlin/com/looker/droidify/screen/RepositoriesAdapter.kt index 245b6f58..aad14873 100644 --- a/src/main/kotlin/com/looker/droidify/screen/RepositoriesAdapter.kt +++ b/src/main/kotlin/com/looker/droidify/screen/RepositoriesAdapter.kt @@ -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( diff --git a/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt b/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt index 3238025e..c038a0d8 100644 --- a/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/RepositoryFragment.kt @@ -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 { diff --git a/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt index b3d31eab..e157e55c 100644 --- a/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/ScreenshotsFragment.kt @@ -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()) diff --git a/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt b/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt index 2612ce84..101abdc7 100644 --- a/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt +++ b/src/main/kotlin/com/looker/droidify/screen/TabsFragment.kt @@ -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 } diff --git a/src/main/kotlin/com/looker/droidify/service/SyncService.kt b/src/main/kotlin/com/looker/droidify/service/SyncService.kt index 184ea04b..366f2d60 100644 --- a/src/main/kotlin/com/looker/droidify/service/SyncService.kt +++ b/src/main/kotlin/com/looker/droidify/service/SyncService.kt @@ -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() { } 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() { } 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() { } 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() { 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() { 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() { 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() { signal = it ) .use { - it.asSequence().map(Database.ProductAdapter::transformItem) - .toList() + it.asSequence().map { it.getProductItem() }.toList() } } .subscribeOn(Schedulers.io())