/
vguzev
/
speed-reader
Обзор
Документация
Войти
/
vguzev
/
speed-reader
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
app/src/main/java/com/smartapps/speedreader/ui/settings/SettingsViewModel.kt
165 строк
6 KB
vguzev
First commit
05 июл 2026, 13:50
05 июл 2026, 13:50
4a0bffe
Код
Авторство
О чём код?
package com.smartapps.speedreader.ui.settings import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.ViewModelProvider import android.app.Application import com.smartapps.speedreader.ui.settings.SpeedStep private const val PREFS_NAME = "speed_reader_settings" private const val PREF_BASE_SPEED = "base_speed" private const val PREF_STEPS = "steps" data class SpeedSettings( val baseSpeed: Int = 60, val steps: List<SpeedStep> ) class SettingsViewModel(application: Application) : AndroidViewModel(application) { companion object { private var instance: SettingsViewModel? = null fun getInstance(application: Application): SettingsViewModel { println("[SettingsViewModel] getInstance called") if (instance == null) { println("[SettingsViewModel] Creating new instance") instance = SettingsViewModel(application) } return instance!! } } private val prefs = application.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) private val _settings = MutableStateFlow(loadSettingsFromPrefs()) val settings: StateFlow<SpeedSettings> = _settings.asStateFlow() private fun loadSettingsFromPrefs(): SpeedSettings { val baseSpeed = prefs.getInt(PREF_BASE_SPEED, 60) val stepsJson = prefs.getString(PREF_STEPS, null) val steps = if (stepsJson != null) { // Parse steps from JSON parseStepsFromJson(stepsJson) } else { listOf( SpeedStep(5, 120), SpeedStep(10, 300), SpeedStep(20, 500) ) } val result = SpeedSettings(baseSpeed = baseSpeed, steps = steps) println("[SettingsViewModel] loadSettingsFromPrefs returned: baseSpeed=${result.baseSpeed}, steps=${result.steps.size}") return result } private fun parseStepsFromJson(json: String): List<SpeedStep> { // Simple JSON parsing for steps // Format: "[5:120,10:300,20:500]" val steps = mutableListOf<SpeedStep>() val cleaned = json.replace("[", "").replace("]", "") cleaned.split(",").forEach { part -> val parts = part.split(":") if (parts.size == 2) { val time = parts[0].toIntOrNull() ?: 5 val speed = parts[1].toIntOrNull() ?: 60 steps.add(SpeedStep(time, speed)) } } return steps } private fun saveSettingsToPrefs() { val editor = prefs.edit() editor.putInt(PREF_BASE_SPEED, _settings.value.baseSpeed) // Serialize steps to JSON val stepsJson = _settings.value.steps.joinToString(",") { "${it.timeInSeconds}:${it.speed}" } editor.putString(PREF_STEPS, "[$stepsJson]") editor.apply() } fun setBaseSpeed(speed: Int) { _settings.value = _settings.value.copy(baseSpeed = speed) } fun setSpeedStep(index: Int, step: SpeedStep) { val newSteps = _settings.value.steps.toMutableList() if (index in newSteps.indices) { newSteps[index] = step _settings.value = _settings.value.copy(steps = newSteps) saveSettingsToPrefs() } } fun addSpeedStep(step: SpeedStep) { val newSteps = _settings.value.steps.toMutableList() newSteps.add(step) _settings.value = _settings.value.copy(steps = newSteps) saveSettingsToPrefs() } fun removeSpeedStep(index: Int) { val newSteps = _settings.value.steps.toMutableList() if (index in newSteps.indices) { newSteps.removeAt(index) _settings.value = _settings.value.copy(steps = newSteps) saveSettingsToPrefs() } } fun updateSpeedStep(index: Int, speed: Int) { val newSteps = _settings.value.steps.toMutableList() if (index in newSteps.indices) { newSteps[index] = newSteps[index].copy(speed = speed) _settings.value = _settings.value.copy(steps = newSteps) saveSettingsToPrefs() } } fun updateSettings(baseSpeed: Int, steps: List<SpeedStep>) { val newSettings = SpeedSettings(baseSpeed = baseSpeed, steps = steps) println("[SettingsViewModel] updateSettings called: baseSpeed=$baseSpeed, steps=${steps.size}") _settings.value = newSettings saveSettingsToPrefs() } fun resetToDefault() { _settings.value = SpeedSettings( baseSpeed = 60, steps = listOf( SpeedStep(5, 120), SpeedStep(10, 300), SpeedStep(20, 500) ) ) saveSettingsToPrefs() } override fun onCleared() { super.onCleared() saveSettingsToPrefs() } } data class SpeedStep( val timeInSeconds: Int, val speed: Int ) // Factory for ViewModel creation class SettingsViewModelFactory(private val application: Application) : ViewModelProvider.Factory { override fun <T : ViewModel> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(SettingsViewModel::class.java)) { return SettingsViewModel(application) as T } throw IllegalArgumentException("Unknown ViewModel class") } }