Fixed updating lists being to heavy for the UI thread

Moved list diff recalculation to the computing thread instead
This commit is contained in:
Viktor De Pasquale 2019-04-22 09:30:38 +02:00
parent 3f748b4d2a
commit a181fa0652
3 changed files with 47 additions and 36 deletions

View File

@ -18,6 +18,7 @@ import com.topjohnwu.magisk.model.events.HideProcessEvent
import com.topjohnwu.magisk.ui.base.MagiskViewModel import com.topjohnwu.magisk.ui.base.MagiskViewModel
import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.utils.Utils
import com.topjohnwu.magisk.utils.toSingle import com.topjohnwu.magisk.utils.toSingle
import com.topjohnwu.magisk.utils.update
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import io.reactivex.Single import io.reactivex.Single
import me.tatarka.bindingcollectionadapter2.OnItemBind import me.tatarka.bindingcollectionadapter2.OnItemBind
@ -31,7 +32,7 @@ class HideViewModel(
val query = KObservableField("") val query = KObservableField("")
val isShowSystem = KObservableField(false) val isShowSystem = KObservableField(false)
private val allItems = DiffObservableList(ComparableRvItem.callback) private val allItems = mutableListOf<ComparableRvItem<*>>()
val items = DiffObservableList(ComparableRvItem.callback) val items = DiffObservableList(ComparableRvItem.callback)
val itemBinding = OnItemBind<ComparableRvItem<*>> { itemBinding, _, item -> val itemBinding = OnItemBind<ComparableRvItem<*>> { itemBinding, _, item ->
item.bind(itemBinding) item.bind(itemBinding)
@ -72,27 +73,30 @@ class HideViewModel(
.map { HideRvItem(it, hideTargets.blockingGet()) } .map { HideRvItem(it, hideTargets.blockingGet()) }
.toList() .toList()
.map { it.sortBy { it.item.info.name }; it } .map { it.sortBy { it.item.info.name }; it }
.doOnSuccess { allItems.update(it) }
.flatMap { queryRaw() }
.applyViewModel(this) .applyViewModel(this)
.subscribeK(onError = Timber::e) { .subscribeK(onError = Timber::e) { items.update(it.first, it.second) }
allItems.update(it)
query()
}
.add() .add()
} }
private fun query(showSystem: Boolean = isShowSystem.value, query: String = this.query.value) { private fun query() = queryRaw()
allItems.toSingle() .subscribeK { items.update(it.first, it.second) }
.map { it.filterIsInstance<HideRvItem>() } .add()
.flattenAsFlowable { it }
.filter { private fun queryRaw(
it.item.name.contains(query, ignoreCase = true) || showSystem: Boolean = isShowSystem.value,
it.item.processes.any { it.contains(query, ignoreCase = true) } query: String = this.query.value
} ) = allItems.toSingle()
.filter { if (showSystem) true else it.item.info.flags and ApplicationInfo.FLAG_SYSTEM == 0 } .map { it.filterIsInstance<HideRvItem>() }
.toList() .flattenAsFlowable { it }
.subscribeK { items.update(it) } .filter {
.add() it.item.name.contains(query, ignoreCase = true) ||
} it.item.processes.any { it.contains(query, ignoreCase = true) }
}
.filter { if (showSystem) true else it.item.info.flags and ApplicationInfo.FLAG_SYSTEM == 0 }
.toList()
.map { it to items.calculateDiff(it) }
private fun toggleItem(item: HideProcessRvItem) { private fun toggleItem(item: HideProcessRvItem) {
val state = if (item.isHidden.value) "add" else "rm" val state = if (item.isHidden.value) "add" else "rm"

View File

@ -20,6 +20,7 @@ import com.topjohnwu.magisk.ui.base.MagiskViewModel
import com.topjohnwu.magisk.utils.Event import com.topjohnwu.magisk.utils.Event
import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.utils.Utils
import com.topjohnwu.magisk.utils.toSingle import com.topjohnwu.magisk.utils.toSingle
import com.topjohnwu.magisk.utils.update
import io.reactivex.Single import io.reactivex.Single
import me.tatarka.bindingcollectionadapter2.OnItemBind import me.tatarka.bindingcollectionadapter2.OnItemBind
@ -29,7 +30,7 @@ class ModuleViewModel(
val query = KObservableField("") val query = KObservableField("")
private val allItems = DiffObservableList(ComparableRvItem.callback) private val allItems = mutableListOf<ComparableRvItem<*>>()
val itemsInstalled = DiffObservableList(ComparableRvItem.callback) val itemsInstalled = DiffObservableList(ComparableRvItem.callback)
val itemsRemote = DiffObservableList(ComparableRvItem.callback) val itemsRemote = DiffObservableList(ComparableRvItem.callback)
@ -73,27 +74,27 @@ class ModuleViewModel(
.flattenAsFlowable { it } .flattenAsFlowable { it }
.map { RepoRvItem(it) } .map { RepoRvItem(it) }
.toList() .toList()
.doOnSuccess { allItems.update(it) }
.flatMap { queryRaw() }
.applyViewModel(this) .applyViewModel(this)
.subscribeK { .subscribeK { itemsRemote.update(it.first, it.second) }
allItems.update(it)
query()
}
.add() .add()
} }
private fun query(query: String = this.query.value) { private fun query() = queryRaw()
allItems.toSingle() .subscribeK { itemsRemote.update(it.first, it.second) }
.map { it.filterIsInstance<RepoRvItem>() } .add()
.flattenAsFlowable { it }
.filter { private fun queryRaw(query: String = this.query.value) = allItems.toSingle()
it.item.name.contains(query, ignoreCase = true) || .map { it.filterIsInstance<RepoRvItem>() }
it.item.author.contains(query, ignoreCase = true) || .flattenAsFlowable { it }
it.item.description.contains(query, ignoreCase = true) .filter {
} it.item.name.contains(query, ignoreCase = true) ||
.toList() it.item.author.contains(query, ignoreCase = true) ||
.subscribeK { itemsRemote.update(it) } it.item.description.contains(query, ignoreCase = true)
.add() }
} .toList()
.map { it to itemsRemote.calculateDiff(it) }
private fun <Result> Cursor.toList(transformer: (Cursor) -> Result): List<Result> { private fun <Result> Cursor.toList(transformer: (Cursor) -> Result): List<Result> {
val out = mutableListOf<Result>() val out = mutableListOf<Result>()

View File

@ -0,0 +1,6 @@
package com.topjohnwu.magisk.utils
fun <T> MutableList<T>.update(newList: List<T>) {
clear()
addAll(newList)
}