package com.example.modifier.data import android.content.Context import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.core.edit import androidx.datastore.preferences.core.intPreferencesKey import androidx.lifecycle.MutableLiveData import androidx.lifecycle.asFlow import kotlinx.coroutines.flow.combine class AppStateRepository( private val dataStore: DataStore, private val context: Context ) { private object PreferencesKeys { val SEND = booleanPreferencesKey("send") val EXECUTED_NUM = intPreferencesKey("executed_num") val SUCCESS_NUM = intPreferencesKey("success_num") val REQUESTED_NUM = intPreferencesKey("requested_num") } private val appRuntimeFlags = MutableLiveData(AppRuntimeFlags()) val appStateFlow = dataStore.data.combine(appRuntimeFlags.asFlow()) { preferences, runtimeFlags -> AppState( send = preferences[PreferencesKeys.SEND] ?: false, executedNum = preferences[PreferencesKeys.EXECUTED_NUM] ?: 0, successNum = preferences[PreferencesKeys.SUCCESS_NUM] ?: 0, requestedNum = preferences[PreferencesKeys.REQUESTED_NUM] ?: 0, running = runtimeFlags.running, requesting = runtimeFlags.requesting, preparing = runtimeFlags.preparing, checkingConnection = runtimeFlags.checkingConnection, busy = runtimeFlags.running || runtimeFlags.requesting || runtimeFlags.preparing || runtimeFlags.checkingConnection ) } suspend fun incrementExecutedNum(success: Boolean) { dataStore.edit { preferences -> val executedNum = (preferences[PreferencesKeys.EXECUTED_NUM] ?: 0) + 1 preferences[PreferencesKeys.EXECUTED_NUM] = executedNum if (success) { val successNum = (preferences[PreferencesKeys.SUCCESS_NUM] ?: 0) + 1 preferences[PreferencesKeys.SUCCESS_NUM] = successNum } } } suspend fun incrementRequestedNum() { dataStore.edit { preferences -> val requestedNum = (preferences[PreferencesKeys.REQUESTED_NUM] ?: 0) + 1 preferences[PreferencesKeys.REQUESTED_NUM] = requestedNum } } suspend fun updateSend(send: Boolean) { dataStore.edit { preferences -> preferences[PreferencesKeys.SEND] = send } } fun updateRuntimeFlags( running: Boolean?, requesting: Boolean?, preparing: Boolean?, checkingConnection: Boolean? ) { val value = appRuntimeFlags.value ?: AppRuntimeFlags() appRuntimeFlags.postValue( value.copy( running = running ?: value.running, requesting = requesting ?: value.requesting, preparing = preparing ?: value.preparing, checkingConnection = checkingConnection ?: value.checkingConnection ) ) } }