Jelajahi Sumber

fix: 阅读记录持久化

HapeLee 3 bulan lalu
induk
melakukan
3dbdee9b9a

+ 1 - 0
app/src/main/java/io/legado/app/data/local/preferences/LocalPreferences.kt

@@ -30,6 +30,7 @@ object LocalPreferencesKeys {
     val ENABLE_READ_RECORD = booleanPreferencesKey("enableReadRecord")
     val ENABLE_READ_RECORD = booleanPreferencesKey("enableReadRecord")
     val HOME_SOURCE_SET_URL = stringPreferencesKey("home_source_set_url")
     val HOME_SOURCE_SET_URL = stringPreferencesKey("home_source_set_url")
     val HOME_DASHBOARD_SECTIONS = stringPreferencesKey("home_dashboard_sections")
     val HOME_DASHBOARD_SECTIONS = stringPreferencesKey("home_dashboard_sections")
+    val READ_RECORD_DISPLAY_MODE = stringPreferencesKey("readRecordDisplayMode")
     val COVER_ALBUM_MIGRATED = booleanPreferencesKey("cover_album_migrated")
     val COVER_ALBUM_MIGRATED = booleanPreferencesKey("cover_album_migrated")
     val SELECTED_COVER_ALBUM_ID = stringPreferencesKey("selected_cover_album_id")
     val SELECTED_COVER_ALBUM_ID = stringPreferencesKey("selected_cover_album_id")
     val SELECTED_LIGHT_COVER_ALBUM_ID = stringPreferencesKey("selected_light_cover_album_id")
     val SELECTED_LIGHT_COVER_ALBUM_ID = stringPreferencesKey("selected_light_cover_album_id")

+ 22 - 10
app/src/main/java/io/legado/app/ui/book/readRecord/ReadRecordViewModel.kt

@@ -3,10 +3,11 @@ package io.legado.app.ui.book.readRecord
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.viewModelScope
 import androidx.lifecycle.viewModelScope
 import cn.hutool.core.date.DateUtil
 import cn.hutool.core.date.DateUtil
-import io.legado.app.constant.PreferKey
 import io.legado.app.data.entities.readRecord.ReadRecord
 import io.legado.app.data.entities.readRecord.ReadRecord
 import io.legado.app.data.entities.readRecord.ReadRecordDetail
 import io.legado.app.data.entities.readRecord.ReadRecordDetail
 import io.legado.app.data.entities.readRecord.ReadRecordSession
 import io.legado.app.data.entities.readRecord.ReadRecordSession
+import io.legado.app.data.local.preferences.LocalPreferencesKeys
+import io.legado.app.data.local.preferences.LocalPreferencesRepository
 import io.legado.app.data.repository.BookRepository
 import io.legado.app.data.repository.BookRepository
 import io.legado.app.data.repository.ReadRecordRepository
 import io.legado.app.data.repository.ReadRecordRepository
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -15,15 +16,13 @@ import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.first
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.flow.stateIn
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.launch
 import java.time.LocalDate
 import java.time.LocalDate
 import java.time.format.DateTimeFormatter
 import java.time.format.DateTimeFormatter
 import java.util.Date
 import java.util.Date
-import splitties.init.appCtx
-import io.legado.app.utils.getPrefString
-import io.legado.app.utils.putPrefString
 
 
 data class ReadRecordUiState(
 data class ReadRecordUiState(
     val isLoading: Boolean = true,
     val isLoading: Boolean = true,
@@ -46,14 +45,23 @@ enum class DisplayMode {
 @OptIn(ExperimentalCoroutinesApi::class)
 @OptIn(ExperimentalCoroutinesApi::class)
 class ReadRecordViewModel(
 class ReadRecordViewModel(
     private val repository: ReadRecordRepository,
     private val repository: ReadRecordRepository,
-    private val bookRepository: BookRepository
+    private val bookRepository: BookRepository,
+    private val localPreferencesRepository: LocalPreferencesRepository
 ) : ViewModel() {
 ) : ViewModel() {
 
 
-    private val _displayMode = MutableStateFlow(
-        runCatching { DisplayMode.valueOf(appCtx.getPrefString(PreferKey.readRecordDisplayMode) ?: DisplayMode.AGGREGATE.name) }
-            .getOrDefault(DisplayMode.AGGREGATE)
-    )
+    private val _displayMode = MutableStateFlow(DisplayMode.AGGREGATE)
     val displayMode = _displayMode.asStateFlow()
     val displayMode = _displayMode.asStateFlow()
+
+    init {
+        viewModelScope.launch {
+            val saved = localPreferencesRepository.getPreference(
+                LocalPreferencesKeys.READ_RECORD_DISPLAY_MODE, DisplayMode.AGGREGATE.name
+            ).first()
+            _displayMode.value = runCatching { DisplayMode.valueOf(saved) }
+                .getOrDefault(DisplayMode.AGGREGATE)
+        }
+    }
+
     private val _searchKey = MutableStateFlow("")
     private val _searchKey = MutableStateFlow("")
     private val _selectedDate = MutableStateFlow<LocalDate?>(null)
     private val _selectedDate = MutableStateFlow<LocalDate?>(null)
     val readRecordEnabled: StateFlow<Boolean> = repository.readRecordEnabled
     val readRecordEnabled: StateFlow<Boolean> = repository.readRecordEnabled
@@ -137,7 +145,11 @@ class ReadRecordViewModel(
 
 
     fun setDisplayMode(mode: DisplayMode) {
     fun setDisplayMode(mode: DisplayMode) {
         _displayMode.value = mode
         _displayMode.value = mode
-        appCtx.putPrefString(PreferKey.readRecordDisplayMode, mode.name)
+        viewModelScope.launch {
+            localPreferencesRepository.updatePreference(
+                LocalPreferencesKeys.READ_RECORD_DISPLAY_MODE, mode.name
+            )
+        }
     }
     }
 
 
     fun setSelectedDate(date: LocalDate?) {
     fun setSelectedDate(date: LocalDate?) {