Commit f191db2f authored by topjohnwu's avatar topjohnwu

Allow ViewModel to opt-out RxJava

Transition period
parent dc8f0f6f
...@@ -21,11 +21,13 @@ import io.reactivex.* ...@@ -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( ...@@ -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( ...@@ -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 (useRx) {
if (runningTask?.isDisposed?.not() == true) { if (runningTask?.isDisposed?.not() == true) {
return return
} }
runningTask = refresh() runningTask = rxRefresh()
return
}
if (runningJob?.isActive == true) {
return
} }
runningJob = refresh()
}
protected open fun rxRefresh(): Disposable? = null
protected open fun refresh(): Disposable? = null protected open fun refresh(): Job? = null
open fun notifyStateChanged() { open fun notifyStateChanged() {
notifyPropertyChanged(BR.loading) notifyPropertyChanged(BR.loading)
......
...@@ -50,7 +50,7 @@ class HideViewModel( ...@@ -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 }
......
...@@ -72,7 +72,7 @@ class HomeViewModel( ...@@ -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() }
......
...@@ -42,7 +42,7 @@ class LogViewModel( ...@@ -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())
......
...@@ -24,7 +24,6 @@ import com.topjohnwu.magisk.model.events.dialog.ModuleInstallDialog ...@@ -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( ...@@ -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( ...@@ -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) {
......
...@@ -53,7 +53,7 @@ class SuperuserViewModel( ...@@ -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)) }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment