Skip to content

Commit 2c649c2

Browse files
Merge pull request #16873 from nextcloud/backport/16868/stable-33.1.0
[stable-33.1.0] fix(upload-list): conflict check npe
2 parents ef4c1e3 + fd3f241 commit 2c649c2

4 files changed

Lines changed: 36 additions & 22 deletions

File tree

app/src/main/java/com/nextcloud/client/jobs/utils/UploadErrorNotificationManager.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.nextcloud.client.jobs.utils
99

1010
import android.app.Notification
11+
import android.app.NotificationManager
1112
import android.app.PendingIntent
1213
import android.content.Context
1314
import android.content.Intent
@@ -32,6 +33,11 @@ import kotlinx.coroutines.withContext
3233
object UploadErrorNotificationManager {
3334
private const val TAG = "UploadErrorNotificationManager"
3435

36+
fun dismissConflictResolveNotification(context: Context, id: Long) {
37+
val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
38+
manager.cancel(id.toInt())
39+
}
40+
3541
/**
3642
* Processes the result of an upload operation and manages error notifications.
3743
* * It filters out successful or silent results and handles [ResultCode.SYNC_CONFLICT], [ResultCode.CONFLICT]

app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,12 @@ public void keepOfflineOperationAndServerFile(OfflineOperationEntity entity, OCF
358358
offlineOperationsRepository.updateNextOperations(entity);
359359
}
360360

361-
private @Nullable
362-
OCFile getFileByPath(String type, String path) {
361+
@Nullable
362+
private OCFile getFileByPath(String type, String path) {
363+
if (path == null) {
364+
return null;
365+
}
366+
363367
final boolean shouldUseEncryptedPath = ProviderTableMeta.FILE_PATH.equals(type);
364368
FileEntity fileEntity = shouldUseEncryptedPath ?
365369
fileDao.getFileByEncryptedRemotePath(path, user.getAccountName()) :

app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
package com.owncloud.android.ui.activity
1111

1212
import android.annotation.SuppressLint
13-
import android.app.NotificationManager
1413
import android.content.Context
1514
import android.content.Intent
1615
import android.os.Bundle
@@ -24,6 +23,7 @@ import com.nextcloud.client.jobs.operation.FileOperationHelper
2423
import com.nextcloud.client.jobs.upload.FileUploadHelper
2524
import com.nextcloud.client.jobs.upload.FileUploadWorker
2625
import com.nextcloud.client.jobs.upload.UploadNotificationManager
26+
import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager
2727
import com.nextcloud.model.HTTPStatusCodes
2828
import com.nextcloud.utils.extensions.getDecryptedPath
2929
import com.nextcloud.utils.extensions.getParcelableArgument
@@ -141,7 +141,10 @@ class ConflictsResolveActivity :
141141
}
142142

143143
withContext(Dispatchers.Main) {
144-
dismissConflictResolveNotification()
144+
UploadErrorNotificationManager.dismissConflictResolveNotification(
145+
this@ConflictsResolveActivity,
146+
conflictUploadId
147+
)
145148
finish()
146149
}
147150
}
@@ -332,10 +335,6 @@ class ConflictsResolveActivity :
332335
fileDataStorageManager.saveFile(file)
333336
}
334337

335-
private fun dismissConflictResolveNotification() {
336-
(getSystemService(NOTIFICATION_SERVICE) as NotificationManager).cancel(conflictUploadId.toInt())
337-
}
338-
339338
private fun showErrorAndFinish(code: Int? = null) {
340339
val message = if (code == HTTPStatusCodes.NOT_FOUND.code) {
341340
getString(R.string.uploader_file_not_found_on_server_message)

app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.kt

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.nextcloud.client.core.Clock
2626
import com.nextcloud.client.device.PowerManagementService
2727
import com.nextcloud.client.jobs.upload.FileUploadEventBroadcaster
2828
import com.nextcloud.client.jobs.upload.FileUploadHelper
29+
import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager
2930
import com.nextcloud.client.utils.Throttler
3031
import com.nextcloud.utils.extensions.webDavParentPath
3132
import com.owncloud.android.R
@@ -320,21 +321,21 @@ class UploadListActivity :
320321
val client = clientRepository.getOwncloudClient()
321322

322323
// Check parent folder exists
323-
val parentPath = storageManager
324-
.getFileByPath(upload.remotePath)
325-
.parentRemotePath
326-
?: upload.remotePath.webDavParentPath()
327-
328-
val checkOp = ExistenceCheckRemoteOperation(parentPath, false)
329-
val checkResult = checkOp.execute(client)
330-
331-
if (!checkResult.isSuccess &&
332-
checkResult.code == RemoteOperationResult.ResultCode.FILE_NOT_FOUND
333-
) {
334-
withContext(Dispatchers.Main) {
335-
showConflictSnackbar(R.string.uploader_file_not_found_message)
324+
val file = storageManager.getFileByPath(upload.remotePath)
325+
val parentPath = (file?.parentRemotePath ?: upload.remotePath?.webDavParentPath())
326+
327+
parentPath?.let {
328+
val checkOp = ExistenceCheckRemoteOperation(it, false)
329+
val checkResult = checkOp.execute(client)
330+
331+
if (!checkResult.isSuccess &&
332+
checkResult.code == RemoteOperationResult.ResultCode.FILE_NOT_FOUND
333+
) {
334+
withContext(Dispatchers.Main) {
335+
showConflictSnackbar(R.string.uploader_file_not_found_message)
336+
}
337+
return@launch
336338
}
337-
return@launch
338339
}
339340

340341
val result = uploadFileOperationFactory
@@ -343,6 +344,10 @@ class UploadListActivity :
343344

344345
if (result.isSuccess) {
345346
withContext(Dispatchers.Main) {
347+
UploadErrorNotificationManager.dismissConflictResolveNotification(
348+
this@UploadListActivity,
349+
upload.uploadId
350+
)
346351
uploadListAdapter.loadUploadItemsFromDb()
347352
}
348353
}

0 commit comments

Comments
 (0)