@@ -20,7 +20,6 @@ import android.os.Bundle
2020import android.os.Parcel
2121import android.os.Parcelable
2222import androidx.annotation.CheckResult
23- import androidx.core.content.edit
2423import androidx.core.os.BundleCompat
2524import androidx.core.os.bundleOf
2625import androidx.lifecycle.SavedStateHandle
@@ -82,7 +81,6 @@ import com.ichi2.anki.settings.Prefs
8281import com.ichi2.anki.settings.PrefsRepository
8382import com.ichi2.anki.utils.ext.currentCardBrowse
8483import com.ichi2.anki.utils.ext.getCardOrNull
85- import com.ichi2.anki.utils.ext.ignoreAccentsInSearch
8684import com.ichi2.anki.utils.ext.setUserFlagForCards
8785import kotlinx.coroutines.Deferred
8886import kotlinx.coroutines.Job
@@ -141,6 +139,8 @@ class CardBrowserViewModel(
141139 preferences : SharedPreferencesProvider ,
142140 val isFragmented : Boolean ,
143141 val savedStateHandle : SavedStateHandle ,
142+ private val browserOptionsRepository : BrowserOptionsRepository =
143+ BrowserOptionsRepository (preferences.sharedPrefs()),
144144 private val manualInit : Boolean = false ,
145145) : ViewModel(),
146146 SharedPreferencesProvider by preferences {
@@ -168,8 +168,8 @@ class CardBrowserViewModel(
168168 * Whether the browser is working in Cards mode or Notes mode.
169169 * default: [CARDS]
170170 * */
171- private val flowOfCardsOrNotes = MutableStateFlow ( CARDS )
172- val cardsOrNotes get() = flowOfCardsOrNotes.value
171+ val flowOfCardsOrNotes: StateFlow < CardsOrNotes > = browserOptionsRepository.cardsOrNotes
172+ val cardsOrNotes: CardsOrNotes get() = flowOfCardsOrNotes.value
173173
174174 // card that was clicked (not marked)
175175 var currentCardId: CardId ? = null
@@ -234,11 +234,10 @@ class CardBrowserViewModel(
234234 .map { it?.isNotEmpty() == true }
235235 .stateIn(viewModelScope, SharingStarted .Eagerly , initialValue = false )
236236
237- val flowOfIsTruncated: MutableStateFlow <Boolean > =
238- MutableStateFlow (sharedPrefs().getBoolean(" isTruncated" , false ))
239- val isTruncated get() = flowOfIsTruncated.value
237+ val flowOfIsTruncated: StateFlow <Boolean > = browserOptionsRepository.isTruncated
238+ val isTruncated: Boolean get() = flowOfIsTruncated.value
240239
241- var shouldIgnoreAccents: Boolean = false
240+ val shouldIgnoreAccents: Boolean get() = browserOptionsRepository.ignoreAccentsInSearch.value
242241
243242 private val _selectedRows : MutableSet <CardOrNoteId > = Collections .synchronizedSet(LinkedHashSet ())
244243
@@ -499,16 +498,13 @@ class CardBrowserViewModel(
499498 }.launchIn(viewModelScope)
500499
501500 viewModelScope.launch {
502- shouldIgnoreAccents = withCol { config.ignoreAccentsInSearch }
501+ browserOptionsRepository.load()
503502
504503 val initialDeckId = if (selectAllDecks) SelectableDeck .AllDecks else getInitialDeck()
505504 // PERF: slightly inefficient if the source was lastDeckId
506505 setSelectedDeck(initialDeckId)
507506 refreshBackendColumns()
508507
509- val cardsOrNotes = withCol { CardsOrNotes .fromCollection(this @withCol) }
510- flowOfCardsOrNotes.update { cardsOrNotes }
511-
512508 withCol {
513509 sortTypeFlow.update { LegacySortType .fromCol(config, cardsOrNotes, prefs) }
514510 reverseDirectionFlow.update { ReverseDirection .fromConfig(config) }
@@ -691,32 +687,11 @@ class CardBrowserViewModel(
691687 }
692688 }
693689
694- fun setCardsOrNotes (newValue : CardsOrNotes ) =
695- viewModelScope.launch {
696- Timber .i(" setting mode to %s" , newValue)
697- withCol {
698- // Change this to only change the preference on a state change
699- newValue.saveToCollection(this @withCol)
700- }
701- flowOfCardsOrNotes.update { newValue }
702- }
690+ fun setCardsOrNotes (newValue : CardsOrNotes ) = viewModelScope.launch { browserOptionsRepository.setCardsOrNotes(newValue) }
703691
704- fun setTruncated (value : Boolean ) {
705- viewModelScope.launch {
706- flowOfIsTruncated.emit(value)
707- }
708- sharedPrefs().edit {
709- putBoolean(" isTruncated" , value)
710- }
711- }
692+ fun setTruncated (value : Boolean ) = viewModelScope.launch { browserOptionsRepository.setIsTruncated(value) }
712693
713- fun setIgnoreAccents (value : Boolean ) {
714- Timber .d(" Setting ignore accent in search to: $value " )
715- viewModelScope.launch {
716- shouldIgnoreAccents = value
717- withCol { config.ignoreAccentsInSearch = value }
718- }
719- }
694+ fun setIgnoreAccents (value : Boolean ) = viewModelScope.launch { browserOptionsRepository.setIgnoreAccentsInSearch(value) }
720695
721696 fun selectAll (): Job ? {
722697 if (! _selectedRows .addAll(cards)) return null
0 commit comments