@@ -34,6 +34,7 @@ import com.owncloud.android.datamodel.SyncedFolder
3434import com.owncloud.android.datamodel.SyncedFolderProvider
3535import com.owncloud.android.datamodel.ThumbnailsCacheManager
3636import com.owncloud.android.datamodel.UploadsStorageManager
37+ import com.owncloud.android.datamodel.UploadsStorageManager.UploadStatus
3738import com.owncloud.android.db.OCUpload
3839import com.owncloud.android.db.UploadResult
3940import com.owncloud.android.lib.common.OwnCloudAccount
@@ -261,11 +262,17 @@ class FileUploadWorker(
261262 val client = OwnCloudClientManagerFactory .getDefaultSingleton().getClientFor(ocAccount, context)
262263 val syncFolderHelper = SyncFolderHelper (context)
263264 val syncedFolders = syncedFolderProvider.syncedFolders
264- var uploadFilesResult = UploadFilesResult .Success
265+ var hasRetryableFailure = false
266+ var hasNonRetryableFailure = false
265267
266268 for ((index, upload) in uploads.withIndex()) {
267269 ensureActive()
268270
271+ if (skip(upload)) {
272+ Log_OC .d(TAG , " skipping already settled upload: ${upload.remotePath} , ${upload.lastResult} " )
273+ continue
274+ }
275+
269276 delay(retryPolicy.getDelay().milliseconds)
270277
271278 if (! skipAutoUploadCheck && isBelongToAnySyncedFolder(upload, syncFolderHelper, syncedFolders)) {
@@ -320,10 +327,9 @@ class FileUploadWorker(
320327 if (! result.isSuccess) {
321328 Log_OC .e(TAG , " upload failed for ${upload.remotePath} : ${result.code} " )
322329 if (uploadResult.isNonRetryable()) {
323- uploadFilesResult = UploadFilesResult .Error
324- } else if (uploadFilesResult != UploadFilesResult .Error ) {
325- // only set retry if any other not failed before
326- uploadFilesResult = UploadFilesResult .Retry
330+ hasNonRetryableFailure = true
331+ } else {
332+ hasRetryableFailure = true
327333 }
328334 }
329335
@@ -335,9 +341,21 @@ class FileUploadWorker(
335341 }
336342 }
337343
344+ val uploadFilesResult = when {
345+ hasRetryableFailure -> UploadFilesResult .Retry
346+ hasNonRetryableFailure -> UploadFilesResult .Error
347+ else -> UploadFilesResult .Success
348+ }
349+
338350 return @withContext uploadFilesResult.toWorkerResult()
339351 }
340352
353+ private fun skip (upload : OCUpload ): Boolean = when (upload.uploadStatus) {
354+ UploadStatus .UPLOAD_SUCCEEDED -> true
355+ UploadStatus .UPLOAD_FAILED -> upload.lastResult.isNonRetryable()
356+ else -> false
357+ }
358+
341359 @Suppress(" ReturnCount" )
342360 suspend fun isBelongToAnySyncedFolder (
343361 upload : OCUpload ,
0 commit comments