mirror of
https://github.com/Aviortheking/Neo-Store.git
synced 2025-04-23 19:32:16 +00:00
Update: Migrate from Database to DatabaseX (4.7/5 in replacing SQLite with Room)
This commit is contained in:
parent
9235ed6e0d
commit
dc65c060e7
@ -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 ->
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
@ -75,4 +78,5 @@ abstract class DatabaseX : RoomDatabase() {
|
||||
productTempDao.emptyTable()
|
||||
categoryTempDao.emptyTable()
|
||||
}
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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())
|
||||
|
@ -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(
|
||||
|
@ -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 }
|
||||
|
@ -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(
|
||||
|
@ -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 {
|
||||
|
@ -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())
|
||||
|
@ -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 }
|
||||
|
@ -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())
|
||||
|
Loading…
x
Reference in New Issue
Block a user