From 9c4222272baf2cd1f13de0d6a7407673861b8114 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 12 Jan 2026 08:54:40 +0100 Subject: [PATCH 1/2] fix(auto-upload): handle existing sync conflicts Signed-off-by: alperozturk --- .../jobs/autoUpload/AutoUploadWorker.kt | 20 ++++++++++++++++--- .../jobs/autoUpload/FileSystemRepository.kt | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt index 2c54909872ae..277c64d047ec 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt @@ -36,6 +36,7 @@ import com.owncloud.android.datamodel.SyncedFolder import com.owncloud.android.datamodel.SyncedFolderProvider 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.OwnCloudClientManagerFactory import com.owncloud.android.lib.common.utils.Log_OC @@ -320,7 +321,14 @@ class AutoUploadWorker( ) try { - var (uploadEntity, upload) = createEntityAndUpload(user, localPath, remotePath) + val result = createEntityAndUpload(user, localPath, remotePath) + if (result == null) { + repository.markFileAsHandled(localPath, syncedFolder) + Log_OC.d(TAG, "Marked file as handled due to existing conflict: $localPath") + continue + } + + var (uploadEntity, upload) = result // if local file deleted, upload process cannot be started or retriable thus needs to be removed if (path.isEmpty() || !file.exists()) { @@ -349,7 +357,7 @@ class AutoUploadWorker( ) if (result.isSuccess) { - repository.markFileAsUploaded(localPath, syncedFolder) + repository.markFileAsHandled(localPath, syncedFolder) Log_OC.d(TAG, "✅ upload completed: $localPath") } else { Log_OC.e( @@ -393,7 +401,7 @@ class AutoUploadWorker( uploadsStorageManager.removeUpload(upload) } - private fun createEntityAndUpload(user: User, localPath: String, remotePath: String): Pair { + private fun createEntityAndUpload(user: User, localPath: String, remotePath: String): Pair? { val (needsCharging, needsWifi, uploadAction) = getUploadSettings(syncedFolder) Log_OC.d(TAG, "creating oc upload for ${user.accountName}") @@ -404,6 +412,12 @@ class AutoUploadWorker( accountName = user.accountName ) + val lastUploadResult = uploadEntity?.lastResult?.let { UploadResult.fromValue(it) } + if (lastUploadResult == UploadResult.SYNC_CONFLICT) { + Log_OC.w(TAG, "Conflict already exists, skipping auto-upload: $localPath") + return null + } + val upload = ( uploadEntity?.toOCUpload(null) ?: OCUpload( localPath, diff --git a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/FileSystemRepository.kt b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/FileSystemRepository.kt index b322b1bc7fc4..9ff924c6aadf 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/FileSystemRepository.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/FileSystemRepository.kt @@ -63,7 +63,7 @@ class FileSystemRepository(private val dao: FileSystemDao, private val context: return filtered } - suspend fun markFileAsUploaded(localPath: String, syncedFolder: SyncedFolder) { + suspend fun markFileAsHandled(localPath: String, syncedFolder: SyncedFolder) { val syncedFolderIdStr = syncedFolder.id.toString() try { From 116078c5f8847ba59e02ca790b3ee60e6c97126a Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 12 Jan 2026 08:55:47 +0100 Subject: [PATCH 2/2] fix(auto-upload): codacy Signed-off-by: alperozturk --- .../nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt index 277c64d047ec..af43a1977be9 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt @@ -401,7 +401,11 @@ class AutoUploadWorker( uploadsStorageManager.removeUpload(upload) } - private fun createEntityAndUpload(user: User, localPath: String, remotePath: String): Pair? { + private fun createEntityAndUpload( + user: User, + localPath: String, + remotePath: String + ): Pair? { val (needsCharging, needsWifi, uploadAction) = getUploadSettings(syncedFolder) Log_OC.d(TAG, "creating oc upload for ${user.accountName}")