Allow ViewModel to opt-out RxJava

Transition period
This commit is contained in:
topjohnwu 2020-07-08 01:50:28 -07:00
parent dc8f0f6feb
commit f191db2fe0
6 changed files with 23 additions and 13 deletions

View File

@ -21,11 +21,13 @@ import io.reactivex.*
import io.reactivex.disposables.CompositeDisposable import io.reactivex.disposables.CompositeDisposable
import io.reactivex.disposables.Disposable import io.reactivex.disposables.Disposable
import io.reactivex.subjects.PublishSubject import io.reactivex.subjects.PublishSubject
import kotlinx.coroutines.Job
import org.koin.core.KoinComponent import org.koin.core.KoinComponent
import androidx.databinding.Observable as BindingObservable import androidx.databinding.Observable as BindingObservable
abstract class BaseViewModel( abstract class BaseViewModel(
initialState: State = State.LOADING initialState: State = State.LOADING,
val useRx: Boolean = true
) : ViewModel(), BindingObservable, KoinComponent { ) : ViewModel(), BindingObservable, KoinComponent {
enum class State { enum class State {
@ -49,6 +51,7 @@ abstract class BaseViewModel(
private val disposables = CompositeDisposable() private val disposables = CompositeDisposable()
private val _viewEvents = MutableLiveData<ViewEvent>() private val _viewEvents = MutableLiveData<ViewEvent>()
private var runningTask: Disposable? = null private var runningTask: Disposable? = null
private var runningJob: Job? = null
private val refreshCallback = object : androidx.databinding.Observable.OnPropertyChangedCallback() { private val refreshCallback = object : androidx.databinding.Observable.OnPropertyChangedCallback() {
override fun onPropertyChanged(sender: androidx.databinding.Observable?, propertyId: Int) { override fun onPropertyChanged(sender: androidx.databinding.Observable?, propertyId: Int) {
requestRefresh() requestRefresh()
@ -62,13 +65,22 @@ abstract class BaseViewModel(
/** This should probably never be called manually, it's called manually via delegate. */ /** This should probably never be called manually, it's called manually via delegate. */
@Synchronized @Synchronized
fun requestRefresh() { fun requestRefresh() {
if (runningTask?.isDisposed?.not() == true) { if (useRx) {
if (runningTask?.isDisposed?.not() == true) {
return
}
runningTask = rxRefresh()
return return
} }
runningTask = refresh() if (runningJob?.isActive == true) {
return
}
runningJob = refresh()
} }
protected open fun refresh(): Disposable? = null protected open fun rxRefresh(): Disposable? = null
protected open fun refresh(): Job? = null
open fun notifyStateChanged() { open fun notifyStateChanged() {
notifyPropertyChanged(BR.loading) notifyPropertyChanged(BR.loading)

View File

@ -50,7 +50,7 @@ class HideViewModel(
val isFilterExpanded = KObservableField(false) val isFilterExpanded = KObservableField(false)
override fun refresh() = magiskRepo.fetchApps() override fun rxRefresh() = magiskRepo.fetchApps()
.map { it to magiskRepo.fetchHideTargets().blockingGet() } .map { it to magiskRepo.fetchHideTargets().blockingGet() }
.map { pair -> pair.first.map { mergeAppTargets(it, pair.second) } } .map { pair -> pair.first.map { mergeAppTargets(it, pair.second) } }
.flattenAsFlowable { it } .flattenAsFlowable { it }

View File

@ -72,7 +72,7 @@ class HomeViewModel(
} }
} }
override fun refresh() = repoMagisk.fetchUpdate() override fun rxRefresh() = repoMagisk.fetchUpdate()
.onErrorReturn { null } .onErrorReturn { null }
.subscribeK { it?.updateUI() } .subscribeK { it?.updateUI() }

View File

@ -42,7 +42,7 @@ class LogViewModel(
val consoleText = KObservableField(" ") val consoleText = KObservableField(" ")
override fun refresh(): Disposable { override fun rxRefresh(): Disposable {
val logs = repo.fetchLogs() val logs = repo.fetchLogs()
.map { it.map { LogItem(it) } } .map { it.map { LogItem(it) } }
.observeOn(Schedulers.computation()) .observeOn(Schedulers.computation())

View File

@ -24,7 +24,6 @@ import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog
import com.topjohnwu.magisk.ui.base.* import com.topjohnwu.magisk.ui.base.*
import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener import com.topjohnwu.magisk.utils.EndlessRecyclerScrollListener
import com.topjohnwu.magisk.utils.KObservableField import com.topjohnwu.magisk.utils.KObservableField
import io.reactivex.disposables.Disposable
import kotlinx.coroutines.* import kotlinx.coroutines.*
import me.tatarka.bindingcollectionadapter2.collections.MergeObservableList import me.tatarka.bindingcollectionadapter2.collections.MergeObservableList
import kotlin.math.roundToInt import kotlin.math.roundToInt
@ -47,7 +46,7 @@ class ModuleViewModel(
private val repoName: RepoByNameDao, private val repoName: RepoByNameDao,
private val repoUpdated: RepoByUpdatedDao, private val repoUpdated: RepoByUpdatedDao,
private val repoUpdater: RepoUpdater private val repoUpdater: RepoUpdater
) : BaseViewModel(), Queryable { ) : BaseViewModel(useRx = false), Queryable {
override val queryDelay = 1000L override val queryDelay = 1000L
private var queryJob: Job? = null private var queryJob: Job? = null
@ -168,11 +167,10 @@ class ModuleViewModel(
// --- // ---
override fun refresh(): Disposable? { override fun refresh(): Job {
if (itemsRemote.isEmpty()) if (itemsRemote.isEmpty())
loadRemote() loadRemote()
loadInstalled() return loadInstalled()
return null
} }
private suspend fun loadUpdates(installed: List<ModuleItem>) = withContext(Dispatchers.IO) { private suspend fun loadUpdates(installed: List<ModuleItem>) = withContext(Dispatchers.IO) {

View File

@ -53,7 +53,7 @@ class SuperuserViewModel(
// --- // ---
override fun refresh() = db.fetchAll() override fun rxRefresh() = db.fetchAll()
.flattenAsFlowable { it } .flattenAsFlowable { it }
.parallel() .parallel()
.map { PolicyItem(it, it.applicationInfo.loadIcon(packageManager)) } .map { PolicyItem(it, it.applicationInfo.loadIcon(packageManager)) }