AppStateRepository.kt 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package com.example.modifier.data
  2. import android.content.Context
  3. import androidx.datastore.core.DataStore
  4. import androidx.datastore.preferences.core.Preferences
  5. import androidx.datastore.preferences.core.booleanPreferencesKey
  6. import androidx.datastore.preferences.core.edit
  7. import androidx.datastore.preferences.core.intPreferencesKey
  8. import androidx.lifecycle.MutableLiveData
  9. import androidx.lifecycle.asFlow
  10. import kotlinx.coroutines.flow.combine
  11. class AppStateRepository(
  12. private val dataStore: DataStore<Preferences>,
  13. private val context: Context
  14. ) {
  15. private object PreferencesKeys {
  16. val SEND = booleanPreferencesKey("send")
  17. val EXECUTED_NUM = intPreferencesKey("executed_num")
  18. val SUCCESS_NUM = intPreferencesKey("success_num")
  19. val REQUESTED_NUM = intPreferencesKey("requested_num")
  20. }
  21. private val appRuntimeFlags = MutableLiveData(AppRuntimeFlags())
  22. val appStateFlow =
  23. dataStore.data.combine(appRuntimeFlags.asFlow()) { preferences, runtimeFlags ->
  24. AppState(
  25. send = preferences[PreferencesKeys.SEND] ?: false,
  26. executedNum = preferences[PreferencesKeys.EXECUTED_NUM] ?: 0,
  27. successNum = preferences[PreferencesKeys.SUCCESS_NUM] ?: 0,
  28. requestedNum = preferences[PreferencesKeys.REQUESTED_NUM] ?: 0,
  29. running = runtimeFlags.running,
  30. requesting = runtimeFlags.requesting,
  31. preparing = runtimeFlags.preparing,
  32. checkingConnection = runtimeFlags.checkingConnection,
  33. busy = runtimeFlags.running || runtimeFlags.requesting || runtimeFlags.preparing || runtimeFlags.checkingConnection
  34. )
  35. }
  36. suspend fun incrementExecutedNum(success: Boolean) {
  37. dataStore.edit { preferences ->
  38. val executedNum = (preferences[PreferencesKeys.EXECUTED_NUM] ?: 0) + 1
  39. preferences[PreferencesKeys.EXECUTED_NUM] = executedNum
  40. if (success) {
  41. val successNum = (preferences[PreferencesKeys.SUCCESS_NUM] ?: 0) + 1
  42. preferences[PreferencesKeys.SUCCESS_NUM] = successNum
  43. }
  44. }
  45. }
  46. suspend fun incrementRequestedNum() {
  47. dataStore.edit { preferences ->
  48. val requestedNum = (preferences[PreferencesKeys.REQUESTED_NUM] ?: 0) + 1
  49. preferences[PreferencesKeys.REQUESTED_NUM] = requestedNum
  50. }
  51. }
  52. suspend fun updateSend(send: Boolean) {
  53. dataStore.edit { preferences ->
  54. preferences[PreferencesKeys.SEND] = send
  55. }
  56. }
  57. fun updateRuntimeFlags(
  58. running: Boolean?,
  59. requesting: Boolean?,
  60. preparing: Boolean?,
  61. checkingConnection: Boolean?
  62. ) {
  63. val value = appRuntimeFlags.value ?: AppRuntimeFlags()
  64. appRuntimeFlags.postValue(
  65. value.copy(
  66. running = running ?: value.running,
  67. requesting = requesting ?: value.requesting,
  68. preparing = preparing ?: value.preparing,
  69. checkingConnection = checkingConnection ?: value.checkingConnection
  70. )
  71. )
  72. }
  73. }