From 2a9df810d9cbb34cd52f8a1313da56ec1e546dc3 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 17 Apr 2026 08:23:19 +0200 Subject: [PATCH 1/2] fix(upload-list): npe conflict check Signed-off-by: alperozturk96 --- .../datamodel/FileDataStorageManager.java | 8 ++++-- .../android/ui/activity/UploadListActivity.kt | 28 +++++++++---------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java b/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java index 3cc664b7b6c3..4c1205da019a 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -358,8 +358,12 @@ public void keepOfflineOperationAndServerFile(OfflineOperationEntity entity, OCF offlineOperationsRepository.updateNextOperations(entity); } - private @Nullable - OCFile getFileByPath(String type, String path) { + @Nullable + private OCFile getFileByPath(String type, String path) { + if (path == null) { + return null; + } + final boolean shouldUseEncryptedPath = ProviderTableMeta.FILE_PATH.equals(type); FileEntity fileEntity = shouldUseEncryptedPath ? fileDao.getFileByEncryptedRemotePath(path, user.getAccountName()) : diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt index 56debc1a184c..8800d6c2c54b 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt @@ -320,21 +320,21 @@ class UploadListActivity : val client = clientRepository.getOwncloudClient() // Check parent folder exists - val parentPath = storageManager - .getFileByPath(upload.remotePath) - .parentRemotePath - ?: upload.remotePath.webDavParentPath() - - val checkOp = ExistenceCheckRemoteOperation(parentPath, false) - val checkResult = checkOp.execute(client) - - if (!checkResult.isSuccess && - checkResult.code == RemoteOperationResult.ResultCode.FILE_NOT_FOUND - ) { - withContext(Dispatchers.Main) { - showConflictSnackbar(R.string.uploader_file_not_found_message) + val file = storageManager.getFileByPath(upload.remotePath) + val parentPath = (file?.parentRemotePath ?: upload.remotePath?.webDavParentPath()) + + parentPath?.let { + val checkOp = ExistenceCheckRemoteOperation(it, false) + val checkResult = checkOp.execute(client) + + if (!checkResult.isSuccess && + checkResult.code == RemoteOperationResult.ResultCode.FILE_NOT_FOUND + ) { + withContext(Dispatchers.Main) { + showConflictSnackbar(R.string.uploader_file_not_found_message) + } + return@launch } - return@launch } val result = uploadFileOperationFactory From fd3f24165c347443669d4bd07576acda49a6b84e Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 17 Apr 2026 08:30:10 +0200 Subject: [PATCH 2/2] fix(upload-list): dismiss conflict resolve notification after resolving Signed-off-by: alperozturk96 --- .../jobs/utils/UploadErrorNotificationManager.kt | 6 ++++++ .../android/ui/activity/ConflictsResolveActivity.kt | 11 +++++------ .../android/ui/activity/UploadListActivity.kt | 5 +++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/utils/UploadErrorNotificationManager.kt b/app/src/main/java/com/nextcloud/client/jobs/utils/UploadErrorNotificationManager.kt index 409e66c0c9fd..e1ec1276ecfe 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/utils/UploadErrorNotificationManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/utils/UploadErrorNotificationManager.kt @@ -8,6 +8,7 @@ package com.nextcloud.client.jobs.utils import android.app.Notification +import android.app.NotificationManager import android.app.PendingIntent import android.content.Context import android.content.Intent @@ -32,6 +33,11 @@ import kotlinx.coroutines.withContext object UploadErrorNotificationManager { private const val TAG = "UploadErrorNotificationManager" + fun dismissConflictResolveNotification(context: Context, id: Long) { + val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + manager.cancel(id.toInt()) + } + /** * Processes the result of an upload operation and manages error notifications. * * It filters out successful or silent results and handles [ResultCode.SYNC_CONFLICT], [ResultCode.CONFLICT] diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt index e8ed8b5411dc..7059576a2a19 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt @@ -10,7 +10,6 @@ package com.owncloud.android.ui.activity import android.annotation.SuppressLint -import android.app.NotificationManager import android.content.Context import android.content.Intent import android.os.Bundle @@ -24,6 +23,7 @@ import com.nextcloud.client.jobs.operation.FileOperationHelper import com.nextcloud.client.jobs.upload.FileUploadHelper import com.nextcloud.client.jobs.upload.FileUploadWorker import com.nextcloud.client.jobs.upload.UploadNotificationManager +import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager import com.nextcloud.model.HTTPStatusCodes import com.nextcloud.utils.extensions.getDecryptedPath import com.nextcloud.utils.extensions.getParcelableArgument @@ -141,7 +141,10 @@ class ConflictsResolveActivity : } withContext(Dispatchers.Main) { - dismissConflictResolveNotification() + UploadErrorNotificationManager.dismissConflictResolveNotification( + this@ConflictsResolveActivity, + conflictUploadId + ) finish() } } @@ -332,10 +335,6 @@ class ConflictsResolveActivity : fileDataStorageManager.saveFile(file) } - private fun dismissConflictResolveNotification() { - (getSystemService(NOTIFICATION_SERVICE) as NotificationManager).cancel(conflictUploadId.toInt()) - } - private fun showErrorAndFinish(code: Int? = null) { val message = if (code == HTTPStatusCodes.NOT_FOUND.code) { getString(R.string.uploader_file_not_found_on_server_message) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt index 8800d6c2c54b..7cf9c37b2aa4 100755 --- a/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt @@ -26,6 +26,7 @@ import com.nextcloud.client.core.Clock import com.nextcloud.client.device.PowerManagementService import com.nextcloud.client.jobs.upload.FileUploadEventBroadcaster import com.nextcloud.client.jobs.upload.FileUploadHelper +import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager import com.nextcloud.client.utils.Throttler import com.nextcloud.utils.extensions.webDavParentPath import com.owncloud.android.R @@ -343,6 +344,10 @@ class UploadListActivity : if (result.isSuccess) { withContext(Dispatchers.Main) { + UploadErrorNotificationManager.dismissConflictResolveNotification( + this@UploadListActivity, + upload.uploadId + ) uploadListAdapter.loadUploadItemsFromDb() } }