@@ -26,6 +26,7 @@ import com.nextcloud.client.network.ConnectivityService
2626import com.nextcloud.client.preferences.AppPreferences
2727import com.nextcloud.utils.ForegroundServiceHelper
2828import com.nextcloud.utils.extensions.getPercent
29+ import com.nextcloud.utils.extensions.isNonRetryable
2930import com.nextcloud.utils.extensions.toFile
3031import com.owncloud.android.R
3132import com.owncloud.android.datamodel.ForegroundServiceType
@@ -34,6 +35,7 @@ import com.owncloud.android.datamodel.SyncedFolderProvider
3435import com.owncloud.android.datamodel.ThumbnailsCacheManager
3536import com.owncloud.android.datamodel.UploadsStorageManager
3637import com.owncloud.android.db.OCUpload
38+ import com.owncloud.android.db.UploadResult
3739import com.owncloud.android.lib.common.OwnCloudAccount
3840import com.owncloud.android.lib.common.OwnCloudClient
3941import com.owncloud.android.lib.common.OwnCloudClientManagerFactory
@@ -204,6 +206,18 @@ class FileUploadWorker(
204206 .setSilent(true )
205207 .build()
206208
209+ private enum class UploadFilesResult {
210+ Success ,
211+ Error ,
212+ Retry ;
213+
214+ fun toWorkerResult (): Result = when (this ) {
215+ Success -> Result .success()
216+ Error -> Result .failure()
217+ Retry -> Result .retry()
218+ }
219+ }
220+
207221 @Suppress(" ReturnCount" , " LongMethod" , " DEPRECATION" )
208222 private suspend fun uploadFiles (): Result = withContext(Dispatchers .IO ) {
209223 val accountName = inputData.getString(ACCOUNT )
@@ -246,6 +260,7 @@ class FileUploadWorker(
246260 val client = OwnCloudClientManagerFactory .getDefaultSingleton().getClientFor(ocAccount, context)
247261 val syncFolderHelper = SyncFolderHelper (context)
248262 val syncedFolders = syncedFolderProvider.syncedFolders
263+ var uploadFilesResult = UploadFilesResult .Success
249264
250265 for ((index, upload) in uploads.withIndex()) {
251266 ensureActive()
@@ -288,20 +303,33 @@ class FileUploadWorker(
288303 )
289304
290305 val result = withContext(Dispatchers .IO ) {
291- upload(upload, operation, user, client)
306+ upload(operation, user, client)
292307 }
293308 activeOperations.remove(upload.uploadId)
294309
310+ // check quota first
295311 if (result.code == ResultCode .QUOTA_EXCEEDED ) {
296312 Log_OC .w(TAG , " Quota exceeded, stopping uploads" )
297313 notificationManager.showQuotaExceedNotification(operation)
298314 break
299315 }
300316
317+ // check upload result for worker
318+ val uploadResult = UploadResult .fromOperationResult(result)
319+ if (! result.isSuccess) {
320+ Log_OC .e(TAG , " upload failed for ${upload.remotePath} : ${result.code} " )
321+ if (uploadResult.isNonRetryable()) {
322+ uploadFilesResult = UploadFilesResult .Error
323+ } else if (uploadFilesResult != UploadFilesResult .Error ) {
324+ // only set retry if any other not failed before
325+ uploadFilesResult = UploadFilesResult .Retry
326+ }
327+ }
328+
301329 sendUploadFinishEvent(totalUploadSize, currentUploadIndex, operation, result)
302330 }
303331
304- return @withContext Result .success ()
332+ return @withContext uploadFilesResult.toWorkerResult ()
305333 }
306334
307335 @Suppress(" ReturnCount" )
@@ -356,21 +384,24 @@ class FileUploadWorker(
356384
357385 @Suppress(" TooGenericExceptionCaught" , " DEPRECATION" )
358386 private suspend fun upload (
359- upload : OCUpload ,
360387 operation : UploadFileOperation ,
361388 user : User ,
362389 client : OwnCloudClient
363390 ): RemoteOperationResult <Any ?> = withContext(Dispatchers .IO ) {
364- lateinit var result: RemoteOperationResult <Any ?>
391+ var result: RemoteOperationResult <Any ?>
365392
366393 try {
367394 val storageManager = operation.storageManager
368- result = operation.execute(client)
369- val task = ThumbnailsCacheManager .ThumbnailGenerationTask (storageManager, user)
370- val file = File (operation.originalStoragePath)
371- val remoteId: String? = operation.file.remoteId
372- task.execute(ThumbnailsCacheManager .ThumbnailGenerationTaskObject (file, remoteId))
373395 fileUploadEventBroadcaster.sendUploadStarted(operation, context)
396+ result = operation.execute(client)
397+
398+ // only generate a thumbnail if the upload actually succeeded
399+ if (result.isSuccess) {
400+ val task = ThumbnailsCacheManager .ThumbnailGenerationTask (storageManager, user)
401+ val file = File (operation.originalStoragePath)
402+ val remoteId: String? = operation.file.remoteId
403+ task.execute(ThumbnailsCacheManager .ThumbnailGenerationTaskObject (file, remoteId))
404+ }
374405 } catch (e: Exception ) {
375406 Log_OC .e(TAG , " Error uploading" , e)
376407 result = RemoteOperationResult (e)
@@ -405,7 +436,7 @@ class FileUploadWorker(
405436 private var lastUpdateTime = 0L
406437
407438 /* *
408- * Receives from [com.owncloud.android.operations. UploadFileOperation.normalUpload]
439+ * Receives from [UploadFileOperation.normalUpload]
409440 */
410441 @Suppress(" MagicNumber" )
411442 override fun onTransferProgress (
0 commit comments