Fixed updating lists being to heavy for the UI thread
Moved list diff recalculation to the computing thread instead
This commit is contained in:
parent
3f748b4d2a
commit
a181fa0652
@ -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"
|
||||||
|
@ -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>()
|
||||||
|
6
app/src/main/java/com/topjohnwu/magisk/utils/XList.kt
Normal file
6
app/src/main/java/com/topjohnwu/magisk/utils/XList.kt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package com.topjohnwu.magisk.utils
|
||||||
|
|
||||||
|
fun <T> MutableList<T>.update(newList: List<T>) {
|
||||||
|
clear()
|
||||||
|
addAll(newList)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user