Fix: Getting true search result

This commit is contained in:
machiav3lli 2022-05-04 03:41:10 +02:00
parent c5821fc3e8
commit fbc4f04ff2

View File

@ -1,6 +1,10 @@
package com.looker.droidify.ui.viewmodels package com.looker.droidify.ui.viewmodels
import androidx.lifecycle.* import androidx.lifecycle.MediatorLiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.looker.droidify.content.Preferences import com.looker.droidify.content.Preferences
import com.looker.droidify.database.DatabaseX import com.looker.droidify.database.DatabaseX
import com.looker.droidify.database.entity.Installed import com.looker.droidify.database.entity.Installed
@ -10,6 +14,7 @@ import com.looker.droidify.entity.Order
import com.looker.droidify.entity.Section import com.looker.droidify.entity.Section
import com.looker.droidify.ui.fragments.Request import com.looker.droidify.ui.fragments.Request
import com.looker.droidify.ui.fragments.Source import com.looker.droidify.ui.fragments.Source
import com.looker.droidify.utility.extension.ManageableLiveData
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -19,6 +24,7 @@ class MainNavFragmentViewModelX(
primarySource: Source, primarySource: Source,
secondarySource: Source secondarySource: Source
) : ViewModel() { ) : ViewModel() {
// TODO add better sort/filter fields
var order = MutableLiveData(Order.LAST_UPDATE) var order = MutableLiveData(Order.LAST_UPDATE)
private set private set
@ -66,7 +72,7 @@ class MainNavFragmentViewModelX(
} }
private var primaryRequest = MediatorLiveData<Request>() private var primaryRequest = MediatorLiveData<Request>()
val primaryProducts = MediatorLiveData<List<Product>>() val primaryProducts = ManageableLiveData<List<Product>>()
private var secondaryRequest = request(secondarySource) private var secondaryRequest = request(secondarySource)
val secondaryProducts = MediatorLiveData<List<Product>>() val secondaryProducts = MediatorLiveData<List<Product>>()
@ -76,9 +82,10 @@ class MainNavFragmentViewModelX(
init { init {
primaryProducts.addSource( primaryProducts.addSource(
db.productDao.queryLiveList(primaryRequest.value ?: request(primarySource)), db.productDao.queryLiveList(primaryRequest.value ?: request(primarySource))
primaryProducts::setValue ) {
) primaryProducts.updateValue(it, System.currentTimeMillis())
}
secondaryProducts.addSource( secondaryProducts.addSource(
db.productDao.queryLiveList(secondaryRequest), db.productDao.queryLiveList(secondaryRequest),
secondaryProducts::setValue secondaryProducts::setValue
@ -87,29 +94,33 @@ class MainNavFragmentViewModelX(
categories.addSource(db.categoryDao.allNamesLive, categories::setValue) categories.addSource(db.categoryDao.allNamesLive, categories::setValue)
listOf(sections, order, searchQuery).forEach { listOf(sections, order, searchQuery).forEach {
primaryRequest.addSource(it) { primaryRequest.addSource(it) {
primaryRequest.value = request(primarySource) val newRequest = request(primarySource)
if (primaryRequest.value != newRequest)
primaryRequest.value = newRequest
} }
} }
primaryProducts.addSource(primaryRequest) { request -> primaryProducts.addSource(primaryRequest) { request ->
val updateTime = System.currentTimeMillis()
viewModelScope.launch { viewModelScope.launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
primaryProducts.postValue( primaryProducts.updateValue(
db.productDao.queryObject( db.productDao.queryObject(request),
request updateTime
)
) )
} }
} }
} }
installed.addSource(db.installedDao.allLive) { installed.addSource(db.installedDao.allLive) {
if (primarySource == Source.INSTALLED && secondarySource == Source.UPDATES) { if (primarySource == Source.INSTALLED && secondarySource == Source.UPDATES) {
val updateTime = System.currentTimeMillis()
viewModelScope.launch { viewModelScope.launch {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
secondaryProducts.postValue(db.productDao.queryObject(secondaryRequest)) secondaryProducts.postValue(db.productDao.queryObject(secondaryRequest))
primaryProducts.postValue( primaryProducts.updateValue(
db.productDao.queryObject( db.productDao.queryObject(
primaryRequest.value ?: request(primarySource) primaryRequest.value ?: request(primarySource)
) ),
updateTime
) )
} }
} }