|
|
@@ -0,0 +1,82 @@
|
|
|
+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<Preferences>,
|
|
|
+ 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
|
|
|
+ )
|
|
|
+ )
|
|
|
+ }
|
|
|
+}
|