From bcdcaa3a00863a37c1230acc4900855d32a74087 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 16 Jun 2026 13:42:36 +0200 Subject: [PATCH 1/4] fix(file-upload-worker): better error handling Signed-off-by: alperozturk96 # Conflicts: # gradle/libs.versions.toml --- .../client/jobs/upload/FileUploadWorker.kt | 50 +++++++++++++++---- gradle/verification-metadata.xml | 8 +++ 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt index a23d3590eda9..726dfa792279 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt @@ -26,6 +26,7 @@ import com.nextcloud.client.network.ConnectivityService import com.nextcloud.client.preferences.AppPreferences import com.nextcloud.utils.ForegroundServiceHelper import com.nextcloud.utils.extensions.getPercent +import com.nextcloud.utils.extensions.isNonRetryable import com.nextcloud.utils.extensions.toFile import com.owncloud.android.R import com.owncloud.android.datamodel.ForegroundServiceType @@ -34,6 +35,7 @@ import com.owncloud.android.datamodel.SyncedFolderProvider import com.owncloud.android.datamodel.ThumbnailsCacheManager import com.owncloud.android.datamodel.UploadsStorageManager import com.owncloud.android.db.OCUpload +import com.owncloud.android.db.UploadResult import com.owncloud.android.lib.common.OwnCloudAccount import com.owncloud.android.lib.common.OwnCloudClient import com.owncloud.android.lib.common.OwnCloudClientManagerFactory @@ -204,6 +206,18 @@ class FileUploadWorker( .setSilent(true) .build() + private enum class UploadFilesResult { + Success, + Error, + Retry; + + fun toWorkerResult(): Result = when (this) { + Success -> Result.success() + Error -> Result.failure() + Retry -> Result.retry() + } + } + @Suppress("ReturnCount", "LongMethod", "DEPRECATION") private suspend fun uploadFiles(): Result = withContext(Dispatchers.IO) { val accountName = inputData.getString(ACCOUNT) @@ -246,6 +260,7 @@ class FileUploadWorker( val client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(ocAccount, context) val syncFolderHelper = SyncFolderHelper(context) val syncedFolders = syncedFolderProvider.syncedFolders + var uploadFilesResult = UploadFilesResult.Success for ((index, upload) in uploads.withIndex()) { ensureActive() @@ -288,20 +303,32 @@ class FileUploadWorker( ) val result = withContext(Dispatchers.IO) { - upload(upload, operation, user, client) + upload(operation, user, client) } activeOperations.remove(upload.uploadId) + // check quota first if (result.code == ResultCode.QUOTA_EXCEEDED) { Log_OC.w(TAG, "Quota exceeded, stopping uploads") notificationManager.showQuotaExceedNotification(operation) break } + // check upload result for worker + val uploadResult = UploadResult.fromOperationResult(result) + if (!result.isSuccess) { + Log_OC.e(TAG, "upload failed for ${upload.remotePath}: ${result.code}") + uploadFilesResult = if (uploadResult.isNonRetryable()) { + UploadFilesResult.Error + } else { + UploadFilesResult.Retry + } + } + sendUploadFinishEvent(totalUploadSize, currentUploadIndex, operation, result) } - return@withContext Result.success() + return@withContext uploadFilesResult.toWorkerResult() } @Suppress("ReturnCount") @@ -356,21 +383,24 @@ class FileUploadWorker( @Suppress("TooGenericExceptionCaught", "DEPRECATION") private suspend fun upload( - upload: OCUpload, operation: UploadFileOperation, user: User, client: OwnCloudClient ): RemoteOperationResult = withContext(Dispatchers.IO) { - lateinit var result: RemoteOperationResult + var result: RemoteOperationResult try { val storageManager = operation.storageManager - result = operation.execute(client) - val task = ThumbnailsCacheManager.ThumbnailGenerationTask(storageManager, user) - val file = File(operation.originalStoragePath) - val remoteId: String? = operation.file.remoteId - task.execute(ThumbnailsCacheManager.ThumbnailGenerationTaskObject(file, remoteId)) fileUploadEventBroadcaster.sendUploadStarted(operation, context) + result = operation.execute(client) + + // only generate a thumbnail if the upload actually succeeded + if (result.isSuccess) { + val task = ThumbnailsCacheManager.ThumbnailGenerationTask(storageManager, user) + val file = File(operation.originalStoragePath) + val remoteId: String? = operation.file.remoteId + task.execute(ThumbnailsCacheManager.ThumbnailGenerationTaskObject(file, remoteId)) + } } catch (e: Exception) { Log_OC.e(TAG, "Error uploading", e) result = RemoteOperationResult(e) @@ -405,7 +435,7 @@ class FileUploadWorker( private var lastUpdateTime = 0L /** - * Receives from [com.owncloud.android.operations.UploadFileOperation.normalUpload] + * Receives from [UploadFileOperation.normalUpload] */ @Suppress("MagicNumber") override fun onTransferProgress( diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index b322aee4d9e6..5e7c8cb875e8 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -21388,6 +21388,14 @@ + + + + + + + + From ba075e81252a7c626091cd51071131ebf668d805 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 16 Jun 2026 13:47:41 +0200 Subject: [PATCH 2/4] fix(file-upload-worker): better error handling Signed-off-by: alperozturk96 --- .../com/nextcloud/client/jobs/upload/FileUploadWorker.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt index 726dfa792279..65bb0308e537 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt @@ -318,10 +318,11 @@ class FileUploadWorker( val uploadResult = UploadResult.fromOperationResult(result) if (!result.isSuccess) { Log_OC.e(TAG, "upload failed for ${upload.remotePath}: ${result.code}") - uploadFilesResult = if (uploadResult.isNonRetryable()) { - UploadFilesResult.Error - } else { - UploadFilesResult.Retry + if (uploadResult.isNonRetryable()) { + uploadFilesResult = UploadFilesResult.Error + } else if (uploadFilesResult != UploadFilesResult.Error) { + // only set retry if any other not failed before + uploadFilesResult = UploadFilesResult.Retry } } From 7286de57718cebf528180d3c05b9718db7d98b05 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 19 Jun 2026 12:27:43 +0200 Subject: [PATCH 3/4] wip Signed-off-by: alperozturk96 # Conflicts: # gradle/libs.versions.toml --- gradle/verification-metadata.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 5e7c8cb875e8..89c8f10c17d7 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -20932,6 +20932,14 @@ + + + + + + + + From c32d44f75ce3e34c6d8180e6b27e58de984d9a27 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Mon, 22 Jun 2026 11:58:44 +0200 Subject: [PATCH 4/4] update lib update lib Signed-off-by: alperozturk96 [skip ci] --- gradle/verification-metadata.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 89c8f10c17d7..61870b6e8507 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -20804,6 +20804,14 @@ + + + + + + + +