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.Cache
|
||||||
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.Database
|
import com.looker.droidify.database.DatabaseX
|
||||||
import com.looker.droidify.index.RepositoryUpdater
|
import com.looker.droidify.index.RepositoryUpdater
|
||||||
import com.looker.droidify.network.CoilDownloader
|
import com.looker.droidify.network.CoilDownloader
|
||||||
import com.looker.droidify.network.Downloader
|
import com.looker.droidify.network.Downloader
|
||||||
@ -24,19 +24,21 @@ import java.net.Proxy
|
|||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class MainApplication : Application(), ImageLoaderFactory {
|
class MainApplication : Application(), ImageLoaderFactory {
|
||||||
|
|
||||||
|
lateinit var db: DatabaseX
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
|
||||||
val databaseUpdated = Database.init(this)
|
db = DatabaseX.getInstance(applicationContext)
|
||||||
Preferences.init(this)
|
Preferences.init(this)
|
||||||
ProductPreferences.init(this)
|
ProductPreferences.init(this)
|
||||||
RepositoryUpdater.init()
|
RepositoryUpdater.init(this)
|
||||||
listenApplications()
|
listenApplications()
|
||||||
listenPreferences()
|
listenPreferences()
|
||||||
|
|
||||||
if (databaseUpdated) {
|
/*if (databaseUpdated) {
|
||||||
forceSyncAll()
|
forceSyncAll()
|
||||||
}
|
}*/
|
||||||
|
|
||||||
Cache.cleanup(this)
|
Cache.cleanup(this)
|
||||||
updateSyncJob(false)
|
updateSyncJob(false)
|
||||||
@ -60,9 +62,9 @@ class MainApplication : Application(), ImageLoaderFactory {
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
if (packageInfo != null) {
|
if (packageInfo != null) {
|
||||||
Database.InstalledAdapter.put(packageInfo.toInstalledItem())
|
db.installedDao.put(packageInfo.toInstalledItem())
|
||||||
} else {
|
} else {
|
||||||
Database.InstalledAdapter.delete(packageName)
|
db.installedDao.delete(packageName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -76,7 +78,7 @@ class MainApplication : Application(), ImageLoaderFactory {
|
|||||||
val installedItems =
|
val installedItems =
|
||||||
packageManager.getInstalledPackages(Android.PackageManager.signaturesFlag)
|
packageManager.getInstalledPackages(Android.PackageManager.signaturesFlag)
|
||||||
.map { it.toInstalledItem() }
|
.map { it.toInstalledItem() }
|
||||||
Database.InstalledAdapter.putAll(installedItems)
|
db.installedDao.put(*installedItems.toTypedArray())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun listenPreferences() {
|
private fun listenPreferences() {
|
||||||
@ -160,9 +162,9 @@ class MainApplication : Application(), ImageLoaderFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun forceSyncAll() {
|
private fun forceSyncAll() {
|
||||||
Database.RepositoryAdapter.getAll(null).forEach {
|
db.repositoryDao.all.mapNotNull { it.data }.forEach {
|
||||||
if (it.lastModified.isNotEmpty() || it.entityTag.isNotEmpty()) {
|
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 ->
|
Connection(SyncService::class.java, onBind = { connection, binder ->
|
||||||
|
@ -2,7 +2,8 @@ package com.looker.droidify.content
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.SharedPreferences
|
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.entity.ProductPreference
|
||||||
import com.looker.droidify.utility.extension.json.Json
|
import com.looker.droidify.utility.extension.json.Json
|
||||||
import com.looker.droidify.utility.extension.json.parseDictionary
|
import com.looker.droidify.utility.extension.json.parseDictionary
|
||||||
@ -16,25 +17,32 @@ object ProductPreferences {
|
|||||||
private val defaultProductPreference = ProductPreference(false, 0L)
|
private val defaultProductPreference = ProductPreference(false, 0L)
|
||||||
private lateinit var preferences: SharedPreferences
|
private lateinit var preferences: SharedPreferences
|
||||||
private val subject = PublishSubject.create<Pair<String, Long?>>()
|
private val subject = PublishSubject.create<Pair<String, Long?>>()
|
||||||
|
lateinit var db: DatabaseX
|
||||||
|
|
||||||
fun init(context: Context) {
|
fun init(context: Context) {
|
||||||
|
db = DatabaseX.getInstance(context)
|
||||||
preferences = context.getSharedPreferences("product_preferences", Context.MODE_PRIVATE)
|
preferences = context.getSharedPreferences("product_preferences", Context.MODE_PRIVATE)
|
||||||
Database.LockAdapter.putAll(preferences.all.keys
|
db.lockDao.insert(*preferences.all.keys
|
||||||
.mapNotNull { packageName ->
|
.mapNotNull { pName ->
|
||||||
this[packageName].databaseVersionCode?.let {
|
this[pName].databaseVersionCode?.let {
|
||||||
Pair(
|
Lock().apply {
|
||||||
packageName,
|
package_name = pName
|
||||||
it
|
version_code = it
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
.toTypedArray()
|
||||||
|
)
|
||||||
subject
|
subject
|
||||||
.observeOn(Schedulers.io())
|
.observeOn(Schedulers.io())
|
||||||
.subscribe { (packageName, versionCode) ->
|
.subscribe { (pName, versionCode) ->
|
||||||
if (versionCode != null) {
|
if (versionCode != null) {
|
||||||
Database.LockAdapter.put(Pair(packageName, versionCode))
|
db.lockDao.insert(Lock().apply {
|
||||||
|
package_name = pName
|
||||||
|
version_code = versionCode
|
||||||
|
})
|
||||||
} else {
|
} 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> {
|
override fun onCreateLoader(id: Int, args: Bundle?): Loader<Cursor> {
|
||||||
val request = activeRequests[id]!!.request
|
val request = activeRequests[id]!!.request
|
||||||
|
val db = DatabaseX.getInstance(requireContext())
|
||||||
return QueryLoader(requireContext()) {
|
return QueryLoader(requireContext()) {
|
||||||
when (request) {
|
when (request) {
|
||||||
is Request.ProductsAvailable -> Database.ProductAdapter
|
is Request.ProductsAvailable -> db.productDao
|
||||||
.query(
|
.query(
|
||||||
installed = false,
|
installed = false,
|
||||||
updates = false,
|
updates = false,
|
||||||
@ -98,7 +99,7 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
|
|||||||
order = request.order,
|
order = request.order,
|
||||||
signal = it
|
signal = it
|
||||||
)
|
)
|
||||||
is Request.ProductsInstalled -> Database.ProductAdapter
|
is Request.ProductsInstalled -> db.productDao
|
||||||
.query(
|
.query(
|
||||||
installed = true,
|
installed = true,
|
||||||
updates = false,
|
updates = false,
|
||||||
@ -107,7 +108,7 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
|
|||||||
order = request.order,
|
order = request.order,
|
||||||
signal = it
|
signal = it
|
||||||
)
|
)
|
||||||
is Request.ProductsUpdates -> Database.ProductAdapter
|
is Request.ProductsUpdates -> db.productDao
|
||||||
.query(
|
.query(
|
||||||
installed = true,
|
installed = true,
|
||||||
updates = true,
|
updates = true,
|
||||||
@ -116,7 +117,7 @@ class CursorOwner : Fragment(), LoaderManager.LoaderCallbacks<Cursor> {
|
|||||||
order = request.order,
|
order = request.order,
|
||||||
signal = it
|
signal = it
|
||||||
)
|
)
|
||||||
is Request.Repositories -> Database.RepositoryAdapter.query(it)
|
is Request.Repositories -> db.repositoryDao.allCursor
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package com.looker.droidify.database
|
package com.looker.droidify.database
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import androidx.room.*
|
|
||||||
import androidx.room.Database
|
import androidx.room.Database
|
||||||
|
import androidx.room.Room
|
||||||
|
import androidx.room.RoomDatabase
|
||||||
|
import androidx.room.TypeConverters
|
||||||
|
|
||||||
@Database(
|
@Database(
|
||||||
entities = [
|
entities = [
|
||||||
@ -47,15 +49,16 @@ abstract class DatabaseX : RoomDatabase() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transaction
|
|
||||||
fun cleanUp(pairs: Set<Pair<Long, Boolean>>) {
|
fun cleanUp(pairs: Set<Pair<Long, Boolean>>) {
|
||||||
val result = pairs.windowed(10, 10, true).map {
|
runInTransaction {
|
||||||
val ids = it.map { it.first }.toLongArray()
|
val result = pairs.windowed(10, 10, true).map {
|
||||||
val productsCount = productDao.deleteById(*ids)
|
val ids = it.map { it.first }.toLongArray()
|
||||||
val categoriesCount = categoryDao.deleteById(*ids)
|
val productsCount = productDao.deleteById(*ids)
|
||||||
val deleteIds = it.filter { it.second }.map { it.first }.toLongArray()
|
val categoriesCount = categoryDao.deleteById(*ids)
|
||||||
repositoryDao.deleteById(*deleteIds)
|
val deleteIds = it.filter { it.second }.map { it.first }.toLongArray()
|
||||||
productsCount != 0 || categoriesCount != 0
|
repositoryDao.deleteById(*deleteIds)
|
||||||
|
productsCount != 0 || categoriesCount != 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Use live objects and observers instead
|
// Use live objects and observers instead
|
||||||
/*if (result.any { it }) {
|
/*if (result.any { it }) {
|
||||||
@ -63,16 +66,17 @@ abstract class DatabaseX : RoomDatabase() {
|
|||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transaction
|
|
||||||
fun finishTemporary(repository: com.looker.droidify.entity.Repository, success: Boolean) {
|
fun finishTemporary(repository: com.looker.droidify.entity.Repository, success: Boolean) {
|
||||||
if (success) {
|
runInTransaction {
|
||||||
productDao.deleteById(repository.id)
|
if (success) {
|
||||||
categoryDao.deleteById(repository.id)
|
productDao.deleteById(repository.id)
|
||||||
productDao.insert(*(productTempDao.all))
|
categoryDao.deleteById(repository.id)
|
||||||
categoryDao.insert(*(categoryTempDao.all))
|
productDao.insert(*(productTempDao.all))
|
||||||
repositoryDao.put(repository)
|
categoryDao.insert(*(categoryTempDao.all))
|
||||||
|
repositoryDao.put(repository)
|
||||||
|
}
|
||||||
|
productTempDao.emptyTable()
|
||||||
|
categoryTempDao.emptyTable()
|
||||||
}
|
}
|
||||||
productTempDao.emptyTable()
|
|
||||||
categoryTempDao.emptyTable()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -16,7 +16,7 @@ class Repository {
|
|||||||
var id: Long = 0
|
var id: Long = 0
|
||||||
|
|
||||||
var enabled = 0
|
var enabled = 0
|
||||||
var deleted = 0
|
var deleted = false
|
||||||
|
|
||||||
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
|
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
|
||||||
var data: Repository? = null
|
var data: Repository? = null
|
||||||
@ -25,7 +25,7 @@ class Repository {
|
|||||||
@ColumnInfo(name = "_id")
|
@ColumnInfo(name = "_id")
|
||||||
var id = 0L
|
var id = 0L
|
||||||
|
|
||||||
var deleted = 0
|
var deleted = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,12 +64,12 @@ open class Category {
|
|||||||
class CategoryTemp : Category()
|
class CategoryTemp : Category()
|
||||||
|
|
||||||
@Entity(tableName = "memory.installed")
|
@Entity(tableName = "memory.installed")
|
||||||
class Installed {
|
class Installed(pName: String = "") {
|
||||||
@PrimaryKey
|
@PrimaryKey
|
||||||
var package_name = ""
|
var package_name = pName
|
||||||
|
|
||||||
var version = ""
|
var version = ""
|
||||||
var version_code = 0
|
var version_code = 0L
|
||||||
var signature = ""
|
var signature = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +78,7 @@ class Lock {
|
|||||||
@PrimaryKey
|
@PrimaryKey
|
||||||
var package_name = ""
|
var package_name = ""
|
||||||
|
|
||||||
var version_code = 0
|
var version_code = 0L
|
||||||
}
|
}
|
||||||
|
|
||||||
object Converters {
|
object Converters {
|
||||||
|
@ -4,6 +4,7 @@ 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.Database
|
import com.looker.droidify.database.Database
|
||||||
|
import com.looker.droidify.database.DatabaseX
|
||||||
import com.looker.droidify.entity.Product
|
import com.looker.droidify.entity.Product
|
||||||
import com.looker.droidify.entity.Release
|
import com.looker.droidify.entity.Release
|
||||||
import com.looker.droidify.entity.Repository
|
import com.looker.droidify.entity.Repository
|
||||||
@ -59,29 +60,28 @@ object RepositoryUpdater {
|
|||||||
|
|
||||||
private val updaterLock = Any()
|
private val updaterLock = Any()
|
||||||
private val cleanupLock = Any()
|
private val cleanupLock = Any()
|
||||||
|
lateinit var db: DatabaseX
|
||||||
|
|
||||||
fun init() {
|
fun init(context: Context) {
|
||||||
|
db = DatabaseX.getInstance(context)
|
||||||
var lastDisabled = setOf<Long>()
|
var lastDisabled = setOf<Long>()
|
||||||
Observable.just(Unit)
|
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())
|
.observeOn(Schedulers.io())
|
||||||
.flatMapSingle {
|
.flatMapSingle {
|
||||||
RxUtils.querySingle {
|
RxUtils.querySingle {
|
||||||
Database.RepositoryAdapter.getAllDisabledDeleted(
|
db.repositoryDao.allDisabledDeleted
|
||||||
it
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.forEach { it ->
|
.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
|
val disabled = newDisabled - lastDisabled
|
||||||
lastDisabled = newDisabled
|
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()) {
|
if (disabled.isNotEmpty() || deleted.isNotEmpty()) {
|
||||||
val pairs = (disabled.asSequence().map { Pair(it, false) } +
|
val pairs = (disabled.asSequence().map { Pair(it, false) } +
|
||||||
deleted.asSequence().map { Pair(it, true) }).toSet()
|
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
|
file: File, lastModified: String, entityTag: String, callback: (Stage, Long, Long?) -> Unit
|
||||||
): Boolean {
|
): Boolean {
|
||||||
var rollback = true
|
var rollback = true
|
||||||
|
val db = DatabaseX.getInstance(context)
|
||||||
return synchronized(updaterLock) {
|
return synchronized(updaterLock) {
|
||||||
try {
|
try {
|
||||||
val jarFile = JarFile(file, true)
|
val jarFile = JarFile(file, true)
|
||||||
val indexEntry = jarFile.getEntry(indexType.contentName) as JarEntry
|
val indexEntry = jarFile.getEntry(indexType.contentName) as JarEntry
|
||||||
val total = indexEntry.size
|
val total = indexEntry.size
|
||||||
Database.UpdaterAdapter.createTemporaryTable()
|
db.productTempDao.emptyTable()
|
||||||
|
db.categoryTempDao.emptyTable()
|
||||||
val features = context.packageManager.systemAvailableFeatures
|
val features = context.packageManager.systemAvailableFeatures
|
||||||
.asSequence().map { it.name }.toSet() + setOf("android.hardware.touchscreen")
|
.asSequence().map { it.name }.toSet() + setOf("android.hardware.touchscreen")
|
||||||
|
|
||||||
@ -231,7 +233,7 @@ object RepositoryUpdater {
|
|||||||
}
|
}
|
||||||
products += transformProduct(product, features, unstable)
|
products += transformProduct(product, features, unstable)
|
||||||
if (products.size >= 50) {
|
if (products.size >= 50) {
|
||||||
Database.UpdaterAdapter.putTemporary(products)
|
db.productTempDao.putTemporary(products)
|
||||||
products.clear()
|
products.clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,7 +251,7 @@ object RepositoryUpdater {
|
|||||||
throw InterruptedException()
|
throw InterruptedException()
|
||||||
}
|
}
|
||||||
if (products.isNotEmpty()) {
|
if (products.isNotEmpty()) {
|
||||||
Database.UpdaterAdapter.putTemporary(products)
|
db.productTempDao.putTemporary(products)
|
||||||
products.clear()
|
products.clear()
|
||||||
}
|
}
|
||||||
Pair(changedRepository, certificateFromIndex)
|
Pair(changedRepository, certificateFromIndex)
|
||||||
@ -334,7 +336,7 @@ object RepositoryUpdater {
|
|||||||
progress.toLong(),
|
progress.toLong(),
|
||||||
totalCount.toLong()
|
totalCount.toLong()
|
||||||
)
|
)
|
||||||
Database.UpdaterAdapter.putTemporary(products
|
db.productTempDao.putTemporary(products
|
||||||
.map { transformProduct(it, features, unstable) })
|
.map { transformProduct(it, features, unstable) })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -407,7 +409,7 @@ object RepositoryUpdater {
|
|||||||
}
|
}
|
||||||
callback(Stage.COMMIT, 0, null)
|
callback(Stage.COMMIT, 0, null)
|
||||||
synchronized(cleanupLock) {
|
synchronized(cleanupLock) {
|
||||||
Database.UpdaterAdapter.finishTemporary(
|
db.finishTemporary(
|
||||||
commitRepository,
|
commitRepository,
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
@ -423,7 +425,7 @@ object RepositoryUpdater {
|
|||||||
} finally {
|
} finally {
|
||||||
file.delete()
|
file.delete()
|
||||||
if (rollback) {
|
if (rollback) {
|
||||||
Database.UpdaterAdapter.finishTemporary(repository, false)
|
db.finishTemporary(repository, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -161,7 +161,7 @@ class EditRepositoryFragment() : ScreenFragment() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
if (savedInstanceState == null) {
|
if (savedInstanceState == null) {
|
||||||
val repository = repositoryId?.let(Database.RepositoryAdapter::get)
|
val repository = repositoryId?.let { screenActivity.db.repositoryDao.get(it)?.data }
|
||||||
if (repository == null) {
|
if (repository == null) {
|
||||||
val clipboardManager =
|
val clipboardManager =
|
||||||
requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
requireContext().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
|
||||||
@ -240,9 +240,9 @@ class EditRepositoryFragment() : ScreenFragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
repositoriesDisposable = Observable.just(Unit)
|
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())
|
.observeOn(Schedulers.io())
|
||||||
.flatMapSingle { RxUtils.querySingle { Database.RepositoryAdapter.getAll(it) } }
|
.flatMapSingle { RxUtils.querySingle { screenActivity.db.repositoryDao.all.mapNotNull { it.data } } }
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe { it ->
|
.subscribe { it ->
|
||||||
takenAddresses = it.asSequence().filter { it.id != repositoryId }
|
takenAddresses = it.asSequence().filter { it.id != repositoryId }
|
||||||
@ -462,10 +462,10 @@ class EditRepositoryFragment() : ScreenFragment() {
|
|||||||
MessageDialog(MessageDialog.Message.CantEditSyncing).show(childFragmentManager)
|
MessageDialog(MessageDialog.Message.CantEditSyncing).show(childFragmentManager)
|
||||||
invalidateState()
|
invalidateState()
|
||||||
} else {
|
} else {
|
||||||
val repository = repositoryId?.let(Database.RepositoryAdapter::get)
|
val repository = repositoryId?.let { screenActivity.db.repositoryDao.get(it)?.data }
|
||||||
?.edit(address, fingerprint, authentication)
|
?.edit(address, fingerprint, authentication)
|
||||||
?: Repository.newRepository(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) {
|
if (repositoryId == null && changedRepository.enabled) {
|
||||||
binder.sync(changedRepository)
|
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.Utils.startUpdate
|
||||||
import com.looker.droidify.utility.extension.android.*
|
import com.looker.droidify.utility.extension.android.*
|
||||||
import com.looker.droidify.utility.extension.text.trimAfter
|
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.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
|
||||||
@ -132,12 +133,16 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks {
|
|||||||
|
|
||||||
var first = true
|
var first = true
|
||||||
productDisposable = Observable.just(Unit)
|
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())
|
.observeOn(Schedulers.io())
|
||||||
.flatMapSingle { RxUtils.querySingle { Database.ProductAdapter.get(packageName, it) } }
|
.flatMapSingle {
|
||||||
|
RxUtils.querySingle {
|
||||||
|
screenActivity.db.productDao.get(packageName).mapNotNull { it?.data }
|
||||||
|
}
|
||||||
|
}
|
||||||
.flatMapSingle { products ->
|
.flatMapSingle { products ->
|
||||||
RxUtils
|
RxUtils
|
||||||
.querySingle { Database.RepositoryAdapter.getAll(it) }
|
.querySingle { screenActivity.db.repositoryDao.all.mapNotNull { it.data } }
|
||||||
.map { it ->
|
.map { it ->
|
||||||
it.asSequence().map { Pair(it.id, it) }.toMap()
|
it.asSequence().map { Pair(it.id, it) }.toMap()
|
||||||
.let {
|
.let {
|
||||||
@ -154,7 +159,7 @@ class ProductFragment() : ScreenFragment(), ProductAdapter.Callbacks {
|
|||||||
}
|
}
|
||||||
.flatMapSingle { products ->
|
.flatMapSingle { products ->
|
||||||
RxUtils
|
RxUtils
|
||||||
.querySingle { Nullable(Database.InstalledAdapter.get(packageName, it)) }
|
.querySingle { Nullable(screenActivity.db.installedDao.get(packageName).getInstalledItem()) }
|
||||||
.map { Pair(products, it) }
|
.map { Pair(products, it) }
|
||||||
}
|
}
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
@ -16,13 +16,13 @@ import com.google.android.material.progressindicator.CircularProgressIndicator
|
|||||||
import com.google.android.material.textview.MaterialTextView
|
import com.google.android.material.textview.MaterialTextView
|
||||||
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.Database
|
|
||||||
import com.looker.droidify.entity.ProductItem
|
import com.looker.droidify.entity.ProductItem
|
||||||
import com.looker.droidify.entity.Repository
|
import com.looker.droidify.entity.Repository
|
||||||
import com.looker.droidify.network.CoilDownloader
|
import com.looker.droidify.network.CoilDownloader
|
||||||
import com.looker.droidify.utility.Utils
|
import com.looker.droidify.utility.Utils
|
||||||
import com.looker.droidify.utility.extension.resources.*
|
import com.looker.droidify.utility.extension.resources.*
|
||||||
import com.looker.droidify.utility.extension.text.nullIfEmpty
|
import com.looker.droidify.utility.extension.text.nullIfEmpty
|
||||||
|
import com.looker.droidify.utility.getProductItem
|
||||||
import com.looker.droidify.widget.CursorRecyclerAdapter
|
import com.looker.droidify.widget.CursorRecyclerAdapter
|
||||||
|
|
||||||
class ProductsAdapter(private val onClick: (ProductItem) -> Unit) :
|
class ProductsAdapter(private val onClick: (ProductItem) -> Unit) :
|
||||||
@ -113,7 +113,7 @@ class ProductsAdapter(private val onClick: (ProductItem) -> Unit) :
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getProductItem(position: Int): ProductItem {
|
private fun getProductItem(position: Int): ProductItem {
|
||||||
return Database.ProductAdapter.transformItem(moveTo(position))
|
return moveTo(position).getProductItem()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateViewHolder(
|
override fun onCreateViewHolder(
|
||||||
|
@ -108,9 +108,9 @@ class ProductsFragment() : BaseFragment(), CursorOwner.Callback {
|
|||||||
|
|
||||||
screenActivity.cursorOwner.attach(this, request)
|
screenActivity.cursorOwner.attach(this, request)
|
||||||
repositoriesDisposable = Observable.just(Unit)
|
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())
|
.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() }
|
.map { it.asSequence().map { Pair(it.id, it) }.toMap() }
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe { (recyclerView?.adapter as? ProductsAdapter)?.repositories = it }
|
.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.switchmaterial.SwitchMaterial
|
||||||
import com.google.android.material.textview.MaterialTextView
|
import com.google.android.material.textview.MaterialTextView
|
||||||
import com.looker.droidify.R
|
import com.looker.droidify.R
|
||||||
import com.looker.droidify.database.Database
|
|
||||||
import com.looker.droidify.entity.Repository
|
import com.looker.droidify.entity.Repository
|
||||||
import com.looker.droidify.utility.extension.resources.inflate
|
import com.looker.droidify.utility.extension.resources.inflate
|
||||||
|
import com.looker.droidify.utility.getRepository
|
||||||
import com.looker.droidify.widget.CursorRecyclerAdapter
|
import com.looker.droidify.widget.CursorRecyclerAdapter
|
||||||
|
|
||||||
class RepositoriesAdapter(
|
class RepositoriesAdapter(
|
||||||
@ -33,7 +33,7 @@ class RepositoriesAdapter(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getRepository(position: Int): Repository {
|
private fun getRepository(position: Int): Repository {
|
||||||
return Database.RepositoryAdapter.transform(moveTo(position))
|
return moveTo(position).getRepository()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onCreateViewHolder(
|
override fun onCreateViewHolder(
|
||||||
|
@ -13,7 +13,6 @@ import androidx.core.widget.NestedScrollView
|
|||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import com.google.android.material.textview.MaterialTextView
|
import com.google.android.material.textview.MaterialTextView
|
||||||
import com.looker.droidify.R
|
import com.looker.droidify.R
|
||||||
import com.looker.droidify.database.Database
|
|
||||||
import com.looker.droidify.databinding.TitleTextItemBinding
|
import com.looker.droidify.databinding.TitleTextItemBinding
|
||||||
import com.looker.droidify.service.Connection
|
import com.looker.droidify.service.Connection
|
||||||
import com.looker.droidify.service.SyncService
|
import com.looker.droidify.service.SyncService
|
||||||
@ -104,7 +103,7 @@ class RepositoryFragment() : ScreenFragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun updateRepositoryView() {
|
private fun updateRepositoryView() {
|
||||||
val repository = Database.RepositoryAdapter.get(repositoryId)
|
val repository = screenActivity.db.repositoryDao.get(repositoryId)?.data
|
||||||
val layout = layout!!
|
val layout = layout!!
|
||||||
layout.removeAllViews()
|
layout.removeAllViews()
|
||||||
if (repository == null) {
|
if (repository == null) {
|
||||||
@ -130,7 +129,7 @@ class RepositoryFragment() : ScreenFragment() {
|
|||||||
if (repository.enabled && (repository.lastModified.isNotEmpty() || repository.entityTag.isNotEmpty())) {
|
if (repository.enabled && (repository.lastModified.isNotEmpty() || repository.entityTag.isNotEmpty())) {
|
||||||
layout.addTitleText(
|
layout.addTitleText(
|
||||||
R.string.number_of_applications,
|
R.string.number_of_applications,
|
||||||
Database.ProductAdapter.getCount(repository.id).toString()
|
screenActivity.db.productDao.countForRepository(repository.id).toString()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -20,6 +20,7 @@ import coil.load
|
|||||||
import com.google.android.material.imageview.ShapeableImageView
|
import com.google.android.material.imageview.ShapeableImageView
|
||||||
import com.looker.droidify.R
|
import com.looker.droidify.R
|
||||||
import com.looker.droidify.database.Database
|
import com.looker.droidify.database.Database
|
||||||
|
import com.looker.droidify.database.DatabaseX
|
||||||
import com.looker.droidify.entity.Product
|
import com.looker.droidify.entity.Product
|
||||||
import com.looker.droidify.entity.Repository
|
import com.looker.droidify.entity.Repository
|
||||||
import com.looker.droidify.graphics.PaddingDrawable
|
import com.looker.droidify.graphics.PaddingDrawable
|
||||||
@ -68,6 +69,7 @@ class ScreenshotsFragment() : DialogFragment() {
|
|||||||
|
|
||||||
val window = dialog.window
|
val window = dialog.window
|
||||||
val decorView = window?.decorView
|
val decorView = window?.decorView
|
||||||
|
val db = DatabaseX.getInstance(requireContext())
|
||||||
|
|
||||||
if (window != null) {
|
if (window != null) {
|
||||||
WindowCompat.setDecorFitsSystemWindows(window, false)
|
WindowCompat.setDecorFitsSystemWindows(window, false)
|
||||||
@ -132,13 +134,17 @@ class ScreenshotsFragment() : DialogFragment() {
|
|||||||
|
|
||||||
var restored = false
|
var restored = false
|
||||||
productDisposable = Observable.just(Unit)
|
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())
|
.observeOn(Schedulers.io())
|
||||||
.flatMapSingle { RxUtils.querySingle { Database.ProductAdapter.get(packageName, it) } }
|
.flatMapSingle {
|
||||||
|
RxUtils.querySingle {
|
||||||
|
db.productDao.get(packageName).mapNotNull { it?.data }
|
||||||
|
}
|
||||||
|
}
|
||||||
.map { it ->
|
.map { it ->
|
||||||
Pair(
|
Pair(
|
||||||
it.find { it.repositoryId == repositoryId },
|
it.find { it.repositoryId == repositoryId },
|
||||||
Database.RepositoryAdapter.get(repositoryId)
|
db.repositoryDao.get(repositoryId)?.data
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
@ -227,9 +227,9 @@ class TabsFragment : ScreenFragment() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
categoriesDisposable = Observable.just(Unit)
|
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())
|
.observeOn(Schedulers.io())
|
||||||
.flatMapSingle { RxUtils.querySingle { Database.CategoryAdapter.getAll(it) } }
|
.flatMapSingle { RxUtils.querySingle { screenActivity.db.categoryDao.allNames } }
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe {
|
.subscribe {
|
||||||
setSectionsAndUpdate(
|
setSectionsAndUpdate(
|
||||||
@ -238,9 +238,9 @@ class TabsFragment : ScreenFragment() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
repositoriesDisposable = Observable.just(Unit)
|
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())
|
.observeOn(Schedulers.io())
|
||||||
.flatMapSingle { RxUtils.querySingle { Database.RepositoryAdapter.getAll(it) } }
|
.flatMapSingle { RxUtils.querySingle { screenActivity.db.repositoryDao.all.mapNotNull { it.data } } }
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
.subscribe { it ->
|
.subscribe { it ->
|
||||||
setSectionsAndUpdate(null, it.asSequence().filter { it.enabled }
|
setSectionsAndUpdate(null, it.asSequence().filter { it.enabled }
|
||||||
|
@ -15,7 +15,7 @@ import androidx.core.app.NotificationCompat
|
|||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import com.looker.droidify.*
|
import com.looker.droidify.*
|
||||||
import com.looker.droidify.content.Preferences
|
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.ProductItem
|
||||||
import com.looker.droidify.entity.Repository
|
import com.looker.droidify.entity.Repository
|
||||||
import com.looker.droidify.index.RepositoryUpdater
|
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.android.notificationManager
|
||||||
import com.looker.droidify.utility.extension.resources.getColorFromAttr
|
import com.looker.droidify.utility.extension.resources.getColorFromAttr
|
||||||
import com.looker.droidify.utility.extension.text.formatSize
|
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.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
|
||||||
@ -92,7 +93,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun sync(request: SyncRequest) {
|
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()
|
.asSequence().filter { it.enabled }.map { it.id }.toList()
|
||||||
sync(ids, request)
|
sync(ids, request)
|
||||||
}
|
}
|
||||||
@ -118,7 +119,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun setEnabled(repository: Repository, enabled: Boolean): Boolean {
|
fun setEnabled(repository: Repository, enabled: Boolean): Boolean {
|
||||||
Database.RepositoryAdapter.put(repository.enable(enabled))
|
db.repositoryDao.put(repository.enable(enabled))
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
if (repository.id != currentTask?.task?.repositoryId && !tasks.any { it.repositoryId == repository.id }) {
|
if (repository.id != currentTask?.task?.repositoryId && !tasks.any { it.repositoryId == repository.id }) {
|
||||||
tasks += Task(repository.id, true)
|
tasks += Task(repository.id, true)
|
||||||
@ -137,10 +138,10 @@ class SyncService : ConnectionService<SyncService.Binder>() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun deleteRepository(repositoryId: Long): Boolean {
|
fun deleteRepository(repositoryId: Long): Boolean {
|
||||||
val repository = Database.RepositoryAdapter.get(repositoryId)
|
val repository = db.repositoryDao.get(repositoryId)?.data
|
||||||
return repository != null && run {
|
return repository != null && run {
|
||||||
setEnabled(repository, false)
|
setEnabled(repository, false)
|
||||||
Database.RepositoryAdapter.markAsDeleted(repository.id)
|
db.repositoryDao.markAsDeleted(repository.id)
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -148,12 +149,14 @@ class SyncService : ConnectionService<SyncService.Binder>() {
|
|||||||
|
|
||||||
private val binder = Binder()
|
private val binder = Binder()
|
||||||
override fun onBind(intent: Intent): Binder = binder
|
override fun onBind(intent: Intent): Binder = binder
|
||||||
|
lateinit var db: DatabaseX
|
||||||
|
|
||||||
private var stateDisposable: Disposable? = null
|
private var stateDisposable: Disposable? = null
|
||||||
|
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
|
||||||
|
db = DatabaseX.getInstance(applicationContext)
|
||||||
if (Android.sdk(26)) {
|
if (Android.sdk(26)) {
|
||||||
NotificationChannel(
|
NotificationChannel(
|
||||||
NOTIFICATION_CHANNEL_SYNCING,
|
NOTIFICATION_CHANNEL_SYNCING,
|
||||||
@ -330,7 +333,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
|
|||||||
if (currentTask == null) {
|
if (currentTask == null) {
|
||||||
if (tasks.isNotEmpty()) {
|
if (tasks.isNotEmpty()) {
|
||||||
val task = tasks.removeAt(0)
|
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) {
|
if (repository != null && repository.enabled) {
|
||||||
val lastStarted = started
|
val lastStarted = started
|
||||||
val newStarted =
|
val newStarted =
|
||||||
@ -374,7 +377,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
|
|||||||
if (hasUpdates && Preferences[Preferences.Key.UpdateNotify]) {
|
if (hasUpdates && Preferences[Preferences.Key.UpdateNotify]) {
|
||||||
val disposable = RxUtils
|
val disposable = RxUtils
|
||||||
.querySingle { it ->
|
.querySingle { it ->
|
||||||
Database.ProductAdapter
|
db.productDao
|
||||||
.query(
|
.query(
|
||||||
installed = true,
|
installed = true,
|
||||||
updates = true,
|
updates = true,
|
||||||
@ -384,8 +387,7 @@ class SyncService : ConnectionService<SyncService.Binder>() {
|
|||||||
signal = it
|
signal = it
|
||||||
)
|
)
|
||||||
.use {
|
.use {
|
||||||
it.asSequence().map(Database.ProductAdapter::transformItem)
|
it.asSequence().map { it.getProductItem() }.toList()
|
||||||
.toList()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.subscribeOn(Schedulers.io())
|
.subscribeOn(Schedulers.io())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user