[修复] 替换净化界面的闪退问题
This commit is contained in:
@@ -5,6 +5,7 @@ import androidx.room.Delete
|
||||
import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import androidx.room.Transaction
|
||||
import androidx.room.Update
|
||||
import io.legado.app.constant.AppPattern
|
||||
import io.legado.app.data.entities.ReplaceRule
|
||||
@@ -159,6 +160,13 @@ interface ReplaceRuleDao {
|
||||
@Delete
|
||||
fun delete(vararg replaceRules: ReplaceRule)
|
||||
|
||||
@Transaction
|
||||
suspend fun updateAllOrders(rules: List<ReplaceRule>) {
|
||||
rules.forEachIndexed { index, rule ->
|
||||
updateOrder(rule.id, index + 1)
|
||||
}
|
||||
}
|
||||
|
||||
private fun dealGroups(list: List<String>): List<String> {
|
||||
val groups = linkedSetOf<String>()
|
||||
list.forEach {
|
||||
|
||||
@@ -3,11 +3,13 @@ package io.legado.app.data.repository
|
||||
import android.text.TextUtils
|
||||
import io.legado.app.data.appDb
|
||||
import io.legado.app.data.entities.ReplaceRule
|
||||
import io.legado.app.ui.replace.ReplaceRuleItemUi
|
||||
import io.legado.app.utils.splitNotBlank
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.withContext
|
||||
import kotlin.collections.map
|
||||
|
||||
class ReplaceRuleRepository {
|
||||
|
||||
@@ -170,4 +172,14 @@ class ReplaceRuleRepository {
|
||||
appDb.replaceRuleDao.update(*updated.toTypedArray())
|
||||
}
|
||||
|
||||
suspend fun moveOrder(currentRules: List<ReplaceRuleItemUi>) {
|
||||
withContext(Dispatchers.IO) {
|
||||
val updatedRules = currentRules.mapIndexed { index, itemUi ->
|
||||
itemUi.rule.copy(order = index + 1)
|
||||
}
|
||||
|
||||
appDb.replaceRuleDao.update(*updatedRules.toTypedArray())
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,7 +17,6 @@ import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.SharingStarted
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.combine
|
||||
import kotlinx.coroutines.flow.distinctUntilChanged
|
||||
import kotlinx.coroutines.flow.flatMapLatest
|
||||
import kotlinx.coroutines.flow.flowOn
|
||||
import kotlinx.coroutines.flow.map
|
||||
@@ -51,7 +50,7 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
|
||||
private val repository = ReplaceRuleRepository()
|
||||
private val _sortMode = MutableStateFlow(context.getPrefString(PreferKey.replaceSortMode, "desc") ?: "desc")
|
||||
private val _searchKey = MutableStateFlow<String?>(null)
|
||||
|
||||
private val _uiRules = MutableStateFlow<List<ReplaceRuleItemUi>>(emptyList())
|
||||
private val _selectedRuleIds = MutableStateFlow<Set<Long>>(emptySet())
|
||||
val selectedRuleIds: StateFlow<Set<Long>> = _selectedRuleIds
|
||||
|
||||
@@ -97,14 +96,14 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
|
||||
when (it.order) {
|
||||
-1 -> Long.MIN_VALUE
|
||||
-2 -> Long.MAX_VALUE
|
||||
else -> 0
|
||||
else -> 0L
|
||||
}
|
||||
}.thenBy { it.name.lowercase() }
|
||||
"name_desc" -> compareBy<ReplaceRule> {
|
||||
when (it.order) {
|
||||
-1 -> Long.MIN_VALUE
|
||||
-2 -> Long.MAX_VALUE
|
||||
else -> 0
|
||||
else -> 0L
|
||||
}
|
||||
}.thenByDescending { it.name.lowercase() }
|
||||
else -> null
|
||||
@@ -249,4 +248,21 @@ class ReplaceRuleViewModel(application: Application) : BaseViewModel(application
|
||||
repository.delGroup(group)
|
||||
}
|
||||
}
|
||||
|
||||
fun moveItemInList(fromIndex: Int, toIndex: Int) {
|
||||
_uiRules.update { currentList ->
|
||||
val list = currentList.toMutableList()
|
||||
val item = list.removeAt(fromIndex)
|
||||
list.add(toIndex, item)
|
||||
list
|
||||
}
|
||||
}
|
||||
|
||||
fun saveSortOrder() {
|
||||
val currentRules = _uiRules.value
|
||||
execute {
|
||||
repository.moveOrder(currentRules)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user