11package mil.nga.giat.mage.observation.sync
22
3- import android.app.Notification
43import android.content.Context
54import android.util.Log
65import androidx.core.app.NotificationCompat
76import androidx.hilt.work.HiltWorker
87import androidx.work.*
98import dagger.assisted.Assisted
109import dagger.assisted.AssistedInject
10+ import kotlinx.coroutines.sync.Mutex
11+ import kotlinx.coroutines.sync.withLock
1112import mil.nga.giat.mage.MageApplication
1213import mil.nga.giat.mage.R
1314import mil.nga.giat.mage.data.observation.ObservationRepository
1415import mil.nga.giat.mage.sdk.datastore.observation.Observation
1516import mil.nga.giat.mage.sdk.datastore.observation.ObservationFavorite
1617import mil.nga.giat.mage.sdk.datastore.observation.ObservationHelper
1718import mil.nga.giat.mage.sdk.datastore.observation.State
18- import java.io.IOException
1919import java.net.HttpURLConnection
2020import java.util.concurrent.TimeUnit
2121
@@ -29,18 +29,21 @@ class ObservationSyncWorker @AssistedInject constructor(
2929 private val observationHelper = ObservationHelper .getInstance(applicationContext)
3030
3131 override suspend fun doWork (): Result {
32- var result = RESULT_SUCCESS_FLAG
33-
34- try {
35- result = syncObservations().withFlag(result)
36- result = syncObservationImportant().withFlag(result)
37- result = syncObservationFavorites().withFlag(result)
38- } catch (e: Exception ) {
39- result = RESULT_RETRY_FLAG
40- Log .e(LOG_NAME , " Error trying to sync observations with server" , e)
32+ // Lock to ensure previous running work will complete when cancelled before new work is started.
33+ return mutex.withLock {
34+ var result = RESULT_SUCCESS_FLAG
35+
36+ try {
37+ result = syncObservations().withFlag(result)
38+ result = syncObservationImportant().withFlag(result)
39+ result = syncObservationFavorites().withFlag(result)
40+ } catch (e: Exception ) {
41+ result = RESULT_RETRY_FLAG
42+ Log .e(LOG_NAME , " Error trying to sync observations with server" , e)
43+ }
44+
45+ if (result.containsFlag(RESULT_RETRY_FLAG )) Result .retry() else Result .success()
4146 }
42-
43- return if (result.containsFlag(RESULT_RETRY_FLAG )) Result .retry() else Result .success()
4447 }
4548
4649 override suspend fun getForegroundInfo (): ForegroundInfo {
@@ -176,6 +179,8 @@ class ObservationSyncWorker @AssistedInject constructor(
176179 private const val RESULT_FAILURE_FLAG = 1
177180 private const val RESULT_RETRY_FLAG = 2
178181
182+ private val mutex = Mutex ()
183+
179184 fun scheduleWork (context : Context ) {
180185 val constraints = Constraints .Builder ()
181186 .setRequiredNetworkType(NetworkType .CONNECTED )
@@ -189,7 +194,7 @@ class ObservationSyncWorker @AssistedInject constructor(
189194
190195 WorkManager
191196 .getInstance(context)
192- .beginUniqueWork(OBSERVATION_SYNC_WORK , ExistingWorkPolicy .APPEND_OR_REPLACE , request)
197+ .beginUniqueWork(OBSERVATION_SYNC_WORK , ExistingWorkPolicy .REPLACE , request)
193198 .enqueue()
194199 }
195200 }
0 commit comments