From a181fa06525e09e2dc7c33341aecec06ce572e8d Mon Sep 17 00:00:00 2001 From: Viktor De Pasquale Date: Mon, 22 Apr 2019 09:30:38 +0200 Subject: [PATCH] Fixed updating lists being to heavy for the UI thread Moved list diff recalculation to the computing thread instead --- .../topjohnwu/magisk/ui/hide/HideViewModel.kt | 40 ++++++++++--------- .../magisk/ui/module/ModuleViewModel.kt | 37 ++++++++--------- .../java/com/topjohnwu/magisk/utils/XList.kt | 6 +++ 3 files changed, 47 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/com/topjohnwu/magisk/utils/XList.kt diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt index c775dd733..897196b3a 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/hide/HideViewModel.kt @@ -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>() val items = DiffObservableList(ComparableRvItem.callback) val itemBinding = OnItemBind> { itemBinding, _, item -> item.bind(itemBinding) @@ -72,27 +73,30 @@ 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() - .map { it.filterIsInstance() } - .flattenAsFlowable { it } - .filter { - 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() - .subscribeK { items.update(it) } - .add() - } + 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() } + .flattenAsFlowable { it } + .filter { + 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) { val state = if (item.isHidden.value) "add" else "rm" diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt index 5ec8995f9..ddee18eca 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/module/ModuleViewModel.kt @@ -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>() val itemsInstalled = DiffObservableList(ComparableRvItem.callback) val itemsRemote = DiffObservableList(ComparableRvItem.callback) @@ -73,27 +74,27 @@ 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() - .map { it.filterIsInstance() } - .flattenAsFlowable { it } - .filter { - it.item.name.contains(query, ignoreCase = true) || - it.item.author.contains(query, ignoreCase = true) || - it.item.description.contains(query, ignoreCase = true) - } - .toList() - .subscribeK { itemsRemote.update(it) } - .add() - } + 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() } + .flattenAsFlowable { it } + .filter { + it.item.name.contains(query, ignoreCase = true) || + it.item.author.contains(query, ignoreCase = true) || + it.item.description.contains(query, ignoreCase = true) + } + .toList() + .map { it to itemsRemote.calculateDiff(it) } private fun Cursor.toList(transformer: (Cursor) -> Result): List { val out = mutableListOf() diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/XList.kt b/app/src/main/java/com/topjohnwu/magisk/utils/XList.kt new file mode 100644 index 000000000..f5f8a41d5 --- /dev/null +++ b/app/src/main/java/com/topjohnwu/magisk/utils/XList.kt @@ -0,0 +1,6 @@ +package com.topjohnwu.magisk.utils + +fun MutableList.update(newList: List) { + clear() + addAll(newList) +} \ No newline at end of file