66package com.osfans.trime.ui.main.settings.schema
77
88import android.view.View
9+ import androidx.lifecycle.lifecycleScope
910import com.osfans.trime.core.SchemaItem
11+ import com.osfans.trime.daemon.RimeDaemon
1012import com.osfans.trime.daemon.launchOnReady
1113import com.osfans.trime.ui.components.OnItemChangedListener
1214import com.osfans.trime.ui.main.settings.ProgressFragment
15+ import com.osfans.trime.util.NaiveDustman
16+ import kotlinx.coroutines.Dispatchers
17+ import kotlinx.coroutines.NonCancellable
18+ import kotlinx.coroutines.launch
1319
1420class SchemaListFragment :
1521 ProgressFragment (),
@@ -28,6 +34,8 @@ class SchemaListFragment :
2834
2935 private lateinit var ui: SchemaListUi
3036
37+ private val dustman = NaiveDustman <SchemaItem >()
38+
3139 override suspend fun initialize (): View {
3240 val available = rime.runOnReady { availableSchemata().toSet() }
3341 val enabled = rime.runOnReady { enabledSchemata().map { it.id } }
@@ -38,6 +46,7 @@ class SchemaListFragment :
3846 initialEntries = entries,
3947 contentSource = { (available - adapter.items.toSet()).toTypedArray() },
4048 )
49+ resetDustman()
4150 ui.adapter.setViewModel(viewModel)
4251 ui.adapter.addOnItemChangedListener(this )
4352 viewModel.enableToolbarEditButton(enabled.isNotEmpty()) {
@@ -56,6 +65,7 @@ class SchemaListFragment :
5665 }
5766
5867 override fun onStop () {
68+ persistSchemaList()
5969 if (::ui.isInitialized) {
6070 ui.adapter.exitMultiSelect()
6171 }
@@ -74,21 +84,34 @@ class SchemaListFragment :
7484 idx : Int ,
7585 item : SchemaItem ,
7686 ) {
77- updateSchemaState( )
87+ dustman.addOrUpdate(item.toString(), item )
7888 }
7989
8090 override fun onItemRemoved (
8191 idx : Int ,
8292 item : SchemaItem ,
8393 ) {
84- updateSchemaState( )
94+ dustman.remove(item.toString() )
8595 }
8696
8797 override fun onItemAddedBatch (items : List <SchemaItem >) {
88- updateSchemaState()
98+ items.forEach { dustman.addOrUpdate(it.toString(), it) }
8999 }
90100
91101 override fun onItemRemovedBatch (items : List <SchemaItem >) {
92- updateSchemaState()
102+ items.forEach { dustman.remove(it.toString()) }
103+ }
104+
105+ private fun persistSchemaList () {
106+ if (! dustman.dirty) return
107+ resetDustman()
108+ lifecycleScope.launch(NonCancellable + Dispatchers .Default ) {
109+ updateSchemaState()
110+ RimeDaemon .restartRime(true )
111+ }
112+ }
113+
114+ private fun resetDustman () {
115+ dustman.reset(ui.adapter.items.associateBy { it.toString() })
93116 }
94117}
0 commit comments