Skip to content

Commit 5e35708

Browse files
committed
Update work policy for sync'ing observations and attachments
* Use REPLACE policy and lock doWork() method to ensure previously running work will finish when cancelled before new work is started
1 parent a0222eb commit 5e35708

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

mage/src/main/java/mil/nga/giat/mage/observation/sync/AttachmentSyncWorker.kt

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import androidx.hilt.work.HiltWorker
77
import androidx.work.*
88
import dagger.assisted.Assisted
99
import dagger.assisted.AssistedInject
10+
import kotlinx.coroutines.sync.Mutex
11+
import kotlinx.coroutines.sync.withLock
1012
import mil.nga.giat.mage.MageApplication
1113
import mil.nga.giat.mage.R
1214
import mil.nga.giat.mage.data.observation.AttachmentRepository
@@ -23,17 +25,16 @@ class AttachmentSyncWorker @AssistedInject constructor(
2325
) : CoroutineWorker(context, params) {
2426

2527
override suspend fun doWork(): Result {
26-
val result = try {
27-
syncAttachments()
28-
} catch (e: Exception) {
29-
Log.e(LOG_NAME, "Failed to sync attachments", e)
30-
RESULT_RETRY_FLAG
31-
}
32-
33-
return if (result.containsFlag(RESULT_RETRY_FLAG)) {
34-
Result.retry()
35-
} else {
36-
Result.success()
28+
// Lock to ensure previous running work will complete when cancelled before new work is started.
29+
return mutex.withLock {
30+
val result = try {
31+
syncAttachments()
32+
} catch (e: Exception) {
33+
Log.e(LOG_NAME, "Failed to sync attachments", e)
34+
RESULT_RETRY_FLAG
35+
}
36+
37+
if (result.containsFlag(RESULT_RETRY_FLAG)) Result.retry() else Result.success()
3738
}
3839
}
3940

@@ -91,6 +92,8 @@ class AttachmentSyncWorker @AssistedInject constructor(
9192
private const val ATTACHMENT_SYNC_WORK = "mil.nga.mage.ATTACHMENT_SYNC_WORK"
9293
private const val ATTACHMENT_SYNC_NOTIFICATION_ID = 200
9394

95+
private val mutex = Mutex()
96+
9497
fun scheduleWork(context: Context) {
9598
val constraints = Constraints.Builder()
9699
.setRequiredNetworkType(NetworkType.CONNECTED)
@@ -104,7 +107,7 @@ class AttachmentSyncWorker @AssistedInject constructor(
104107

105108
WorkManager
106109
.getInstance(context)
107-
.beginUniqueWork(ATTACHMENT_SYNC_WORK, ExistingWorkPolicy.APPEND_OR_REPLACE, request)
110+
.beginUniqueWork(ATTACHMENT_SYNC_WORK, ExistingWorkPolicy.REPLACE, request)
108111
.enqueue()
109112
}
110113
}

mage/src/main/java/mil/nga/giat/mage/observation/sync/ObservationSyncWorker.kt

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
package mil.nga.giat.mage.observation.sync
22

3-
import android.app.Notification
43
import android.content.Context
54
import android.util.Log
65
import androidx.core.app.NotificationCompat
76
import androidx.hilt.work.HiltWorker
87
import androidx.work.*
98
import dagger.assisted.Assisted
109
import dagger.assisted.AssistedInject
10+
import kotlinx.coroutines.sync.Mutex
11+
import kotlinx.coroutines.sync.withLock
1112
import mil.nga.giat.mage.MageApplication
1213
import mil.nga.giat.mage.R
1314
import mil.nga.giat.mage.data.observation.ObservationRepository
1415
import mil.nga.giat.mage.sdk.datastore.observation.Observation
1516
import mil.nga.giat.mage.sdk.datastore.observation.ObservationFavorite
1617
import mil.nga.giat.mage.sdk.datastore.observation.ObservationHelper
1718
import mil.nga.giat.mage.sdk.datastore.observation.State
18-
import java.io.IOException
1919
import java.net.HttpURLConnection
2020
import 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

Comments
 (0)