SuperuserViewModel: fix updatePolicy

Starting biometrics may cause the SuperuserFragment to lost focus. After onResume(), doLoadWork() will refresh the itemsPolicies, so notify property changed will work on wrong items. Fixed by snapshotting items to be refreshed before starting biometrics.
This commit is contained in:
vvb2060 2023-07-29 00:47:23 +08:00 committed by John Wu
parent 207d7fd3f6
commit 9571b6f9be
5 changed files with 7 additions and 10 deletions

View File

@ -4,7 +4,6 @@ import com.topjohnwu.magisk.arch.ActivityExecutor
import com.topjohnwu.magisk.arch.UIActivity import com.topjohnwu.magisk.arch.UIActivity
import com.topjohnwu.magisk.arch.ViewEvent import com.topjohnwu.magisk.arch.ViewEvent
import com.topjohnwu.magisk.core.di.ServiceLocator import com.topjohnwu.magisk.core.di.ServiceLocator
import com.topjohnwu.magisk.core.utils.BiometricHelper
class BiometricEvent( class BiometricEvent(
builder: Builder.() -> Unit builder: Builder.() -> Unit

View File

@ -15,7 +15,6 @@ import com.topjohnwu.magisk.core.Info
import com.topjohnwu.magisk.core.di.ServiceLocator import com.topjohnwu.magisk.core.di.ServiceLocator
import com.topjohnwu.magisk.core.ktx.activity import com.topjohnwu.magisk.core.ktx.activity
import com.topjohnwu.magisk.core.tasks.HideAPK import com.topjohnwu.magisk.core.tasks.HideAPK
import com.topjohnwu.magisk.core.utils.BiometricHelper
import com.topjohnwu.magisk.core.utils.MediaStoreUtils import com.topjohnwu.magisk.core.utils.MediaStoreUtils
import com.topjohnwu.magisk.core.utils.availableLocales import com.topjohnwu.magisk.core.utils.availableLocales
import com.topjohnwu.magisk.core.utils.currentLocale import com.topjohnwu.magisk.core.utils.currentLocale

View File

@ -73,6 +73,8 @@ class PolicyRvItem(
viewModel.deletePressed(this) viewModel.deletePressed(this)
} }
override fun itemSameAs(other: PolicyRvItem) = item.uid == other.item.uid override fun itemSameAs(other: PolicyRvItem) = packageName == other.packageName
override fun contentSameAs(other: PolicyRvItem) = item.policy == other.item.policy
} }

View File

@ -16,7 +16,6 @@ import com.topjohnwu.magisk.core.di.AppContext
import com.topjohnwu.magisk.core.di.ServiceLocator import com.topjohnwu.magisk.core.di.ServiceLocator
import com.topjohnwu.magisk.core.ktx.getLabel import com.topjohnwu.magisk.core.ktx.getLabel
import com.topjohnwu.magisk.core.model.su.SuPolicy import com.topjohnwu.magisk.core.model.su.SuPolicy
import com.topjohnwu.magisk.core.utils.BiometricHelper
import com.topjohnwu.magisk.core.utils.currentLocale import com.topjohnwu.magisk.core.utils.currentLocale
import com.topjohnwu.magisk.databinding.* import com.topjohnwu.magisk.databinding.*
import com.topjohnwu.magisk.dialog.SuperuserRevokeDialog import com.topjohnwu.magisk.dialog.SuperuserRevokeDialog
@ -107,7 +106,7 @@ class SuperuserViewModel(
fun updateState() = viewModelScope.launch { fun updateState() = viewModelScope.launch {
db.delete(item.item.uid) db.delete(item.item.uid)
val list = ArrayList(itemsPolicies) val list = ArrayList(itemsPolicies)
list.removeAll { it.itemSameAs(item) } list.removeAll { it.item.uid == item.item.uid }
itemsPolicies.update(list) itemsPolicies.update(list)
if (list.isEmpty() && itemsHelpers.isEmpty()) { if (list.isEmpty() && itemsHelpers.isEmpty()) {
itemsHelpers.add(itemNoData) itemsHelpers.add(itemNoData)
@ -156,15 +155,14 @@ class SuperuserViewModel(
} }
fun togglePolicy(item: PolicyRvItem, enable: Boolean) { fun togglePolicy(item: PolicyRvItem, enable: Boolean) {
val items = itemsPolicies.filter { it.item.uid == item.item.uid }
fun updateState() { fun updateState() {
viewModelScope.launch { viewModelScope.launch {
val res = if (enable) R.string.su_snack_grant else R.string.su_snack_deny val res = if (enable) R.string.su_snack_grant else R.string.su_snack_deny
item.item.policy = if (enable) SuPolicy.ALLOW else SuPolicy.DENY item.item.policy = if (enable) SuPolicy.ALLOW else SuPolicy.DENY
db.update(item.item) db.update(item.item)
itemsPolicies.forEach { items.forEach {
if (it.item.uid == item.item.uid) { it.notifyPropertyChanged(BR.enabled)
it.notifyPropertyChanged(BR.enabled)
}
} }
SnackbarEvent(res.asText(item.appName)).publish() SnackbarEvent(res.asText(item.appName)).publish()
} }

View File

@ -28,7 +28,6 @@ import com.topjohnwu.magisk.core.ktx.toast
import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.ALLOW import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.ALLOW
import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.DENY import com.topjohnwu.magisk.core.model.su.SuPolicy.Companion.DENY
import com.topjohnwu.magisk.core.su.SuRequestHandler import com.topjohnwu.magisk.core.su.SuRequestHandler
import com.topjohnwu.magisk.core.utils.BiometricHelper
import com.topjohnwu.magisk.databinding.set import com.topjohnwu.magisk.databinding.set
import com.topjohnwu.magisk.events.BiometricEvent import com.topjohnwu.magisk.events.BiometricEvent
import com.topjohnwu.magisk.events.DieEvent import com.topjohnwu.magisk.events.DieEvent