Commit a181fa06 authored by Viktor De Pasquale's avatar Viktor De Pasquale

Fixed updating lists being to heavy for the UI thread

Moved list diff recalculation to the computing thread instead
parent 3f748b4d
......@@ -18,6 +18,7 @@ import com.topjohnwu.magisk.model.events.HideProcessEvent
import com.topjohnwu.magisk.ui.base.MagiskViewModel
import com.topjohnwu.magisk.utils.Utils
import com.topjohnwu.magisk.utils.toSingle
import com.topjohnwu.magisk.utils.update
import com.topjohnwu.superuser.Shell
import io.reactivex.Single
import me.tatarka.bindingcollectionadapter2.OnItemBind
......@@ -31,7 +32,7 @@ class HideViewModel(
val query = KObservableField("")
val isShowSystem = KObservableField(false)
private val allItems = DiffObservableList(ComparableRvItem.callback)
private val allItems = mutableListOf<ComparableRvItem<*>>()
val items = DiffObservableList(ComparableRvItem.callback)
val itemBinding = OnItemBind<ComparableRvItem<*>> { itemBinding, _, item ->
item.bind(itemBinding)
......@@ -72,16 +73,21 @@ class HideViewModel(
.map { HideRvItem(it, hideTargets.blockingGet()) }
.toList()
.map { it.sortBy { it.item.info.name }; it }
.doOnSuccess { allItems.update(it) }
.flatMap { queryRaw() }
.applyViewModel(this)
.subscribeK(onError = Timber::e) {
allItems.update(it)
query()
}
.subscribeK(onError = Timber::e) { items.update(it.first, it.second) }
.add()
}
private fun query(showSystem: Boolean = isShowSystem.value, query: String = this.query.value) {
allItems.toSingle()
private fun query() = queryRaw()
.subscribeK { items.update(it.first, it.second) }
.add()
private fun queryRaw(
showSystem: Boolean = isShowSystem.value,
query: String = this.query.value
) = allItems.toSingle()
.map { it.filterIsInstance<HideRvItem>() }
.flattenAsFlowable { it }
.filter {
......@@ -90,9 +96,7 @@ class HideViewModel(
}
.filter { if (showSystem) true else it.item.info.flags and ApplicationInfo.FLAG_SYSTEM == 0 }
.toList()
.subscribeK { items.update(it) }
.add()
}
.map { it to items.calculateDiff(it) }
private fun toggleItem(item: HideProcessRvItem) {
val state = if (item.isHidden.value) "add" else "rm"
......
......@@ -20,6 +20,7 @@ import com.topjohnwu.magisk.ui.base.MagiskViewModel
import com.topjohnwu.magisk.utils.Event
import com.topjohnwu.magisk.utils.Utils
import com.topjohnwu.magisk.utils.toSingle
import com.topjohnwu.magisk.utils.update
import io.reactivex.Single
import me.tatarka.bindingcollectionadapter2.OnItemBind
......@@ -29,7 +30,7 @@ class ModuleViewModel(
val query = KObservableField("")
private val allItems = DiffObservableList(ComparableRvItem.callback)
private val allItems = mutableListOf<ComparableRvItem<*>>()
val itemsInstalled = DiffObservableList(ComparableRvItem.callback)
val itemsRemote = DiffObservableList(ComparableRvItem.callback)
......@@ -73,16 +74,18 @@ class ModuleViewModel(
.flattenAsFlowable { it }
.map { RepoRvItem(it) }
.toList()
.doOnSuccess { allItems.update(it) }
.flatMap { queryRaw() }
.applyViewModel(this)
.subscribeK {
allItems.update(it)
query()
}
.subscribeK { itemsRemote.update(it.first, it.second) }
.add()
}
private fun query(query: String = this.query.value) {
allItems.toSingle()
private fun query() = queryRaw()
.subscribeK { itemsRemote.update(it.first, it.second) }
.add()
private fun queryRaw(query: String = this.query.value) = allItems.toSingle()
.map { it.filterIsInstance<RepoRvItem>() }
.flattenAsFlowable { it }
.filter {
......@@ -91,9 +94,7 @@ class ModuleViewModel(
it.item.description.contains(query, ignoreCase = true)
}
.toList()
.subscribeK { itemsRemote.update(it) }
.add()
}
.map { it to itemsRemote.calculateDiff(it) }
private fun <Result> Cursor.toList(transformer: (Cursor) -> Result): List<Result> {
val out = mutableListOf<Result>()
......
package com.topjohnwu.magisk.utils
fun <T> MutableList<T>.update(newList: List<T>) {
clear()
addAll(newList)
}
\ No newline at end of file
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