1
1
/*
2
- * Copyright 2024 Google LLC
2
+ * Copyright 2024-2025 Google LLC
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
@@ -31,36 +31,43 @@ import com.google.android.fhir.sync.RepeatInterval
31
31
import com.google.android.fhir.sync.Sync
32
32
import com.google.android.fhir.sync.SyncJobStatus
33
33
import java.util.concurrent.TimeUnit
34
+ import kotlinx.coroutines.flow.MutableSharedFlow
34
35
import kotlinx.coroutines.flow.MutableStateFlow
35
- import kotlinx.coroutines.flow.SharedFlow
36
- import kotlinx.coroutines.flow.SharingStarted
37
36
import kotlinx.coroutines.flow.StateFlow
38
- import kotlinx.coroutines.flow.shareIn
39
37
import kotlinx.coroutines.launch
38
+ import timber.log.Timber
40
39
41
40
class PeriodicSyncViewModel (application : Application ) : AndroidViewModel(application) {
42
41
43
- val pollPeriodicSyncJobStatus: SharedFlow <PeriodicSyncJobStatus > =
44
- Sync .periodicSync<DemoFhirSyncWorker >(
45
- application.applicationContext,
42
+ private val _uiStateFlow = MutableStateFlow (PeriodicSyncUiState ())
43
+ val uiStateFlow: StateFlow <PeriodicSyncUiState > = _uiStateFlow
44
+
45
+ private val _pollPeriodicSyncJobStatus = MutableSharedFlow <PeriodicSyncJobStatus >(replay = 10 )
46
+
47
+ init {
48
+ viewModelScope.launch { initializePeriodicSync() }
49
+ }
50
+
51
+ private suspend fun initializePeriodicSync () {
52
+ val periodicSyncJobStatusFlow =
53
+ Sync .periodicSync<DemoFhirSyncWorker >(
54
+ context = getApplication<Application >().applicationContext,
46
55
periodicSyncConfiguration =
47
56
PeriodicSyncConfiguration (
48
57
syncConstraints = Constraints .Builder ().build(),
49
58
repeat = RepeatInterval (interval = 15 , timeUnit = TimeUnit .MINUTES ),
50
59
),
51
60
)
52
- .shareIn(viewModelScope, SharingStarted .Eagerly , 10 )
53
-
54
- private val _uiStateFlow = MutableStateFlow (PeriodicSyncUiState ())
55
- val uiStateFlow: StateFlow <PeriodicSyncUiState > = _uiStateFlow
56
61
57
- init {
58
- collectPeriodicSyncJobStatus()
62
+ periodicSyncJobStatusFlow.collect { status -> _pollPeriodicSyncJobStatus .emit(status) }
59
63
}
60
64
61
- private fun collectPeriodicSyncJobStatus () {
65
+ fun collectPeriodicSyncJobStatus () {
62
66
viewModelScope.launch {
63
- pollPeriodicSyncJobStatus.collect { periodicSyncJobStatus ->
67
+ _pollPeriodicSyncJobStatus .collect { periodicSyncJobStatus ->
68
+ Timber .d(
69
+ " currentSyncJobStatus: ${periodicSyncJobStatus.currentSyncJobStatus} lastSyncJobStatus ${periodicSyncJobStatus.lastSyncJobStatus} " ,
70
+ )
64
71
val lastSyncStatus = getLastSyncStatus(periodicSyncJobStatus.lastSyncJobStatus)
65
72
val lastSyncTime = getLastSyncTime(periodicSyncJobStatus.lastSyncJobStatus)
66
73
val currentSyncStatus =
@@ -83,6 +90,14 @@ class PeriodicSyncViewModel(application: Application) : AndroidViewModel(applica
83
90
}
84
91
}
85
92
93
+ fun cancelPeriodicSyncJob () {
94
+ viewModelScope.launch {
95
+ Sync .cancelPeriodicSync<DemoFhirSyncWorker >(
96
+ getApplication<FhirApplication >().applicationContext,
97
+ )
98
+ }
99
+ }
100
+
86
101
private fun getLastSyncStatus (lastSyncJobStatus : LastSyncJobStatus ? ): String? {
87
102
return when (lastSyncJobStatus) {
88
103
is LastSyncJobStatus .Succeeded ->
0 commit comments