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 ...@@ -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( ...@@ -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( ...@@ -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 ...@@ -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( ...@@ -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( ...@@ -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>()
......
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