Skip to content

Commit d39b192

Browse files
authored
Merge pull request #10947 from nextcloud/backport/10926/stable-3.22
[stable-3.22] FilesUploadWorker: ensure only one worker can be running for the same user
2 parents 42feaa1 + 486417b commit d39b192

File tree

3 files changed

+26
-8
lines changed

3 files changed

+26
-8
lines changed

app/src/androidTest/java/com/owncloud/android/files/services/FileUploadWorkerIT.kt

+7-1
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,17 @@
2222

2323
package com.owncloud.android.files.services
2424

25+
import org.junit.After
2526
import org.junit.Before
2627

2728
class FileUploadWorkerIT : FileUploaderIT() {
2829
@Before
29-
fun enableWorker() {
30+
fun forceUploadWorker() {
3031
FileUploader.setForceNewUploadWorker(true)
3132
}
33+
34+
@After
35+
fun resetForceUploadWorker() {
36+
FileUploader.setForceNewUploadWorker(false)
37+
}
3238
}

app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ internal class BackgroundJobManagerImpl(
455455
.setInputData(data)
456456
.build()
457457

458-
workManager.enqueue(request)
458+
workManager.enqueueUniqueWork(JOB_FILES_UPLOAD + user.accountName, ExistingWorkPolicy.KEEP, request)
459459
}
460460

461461
override fun getFileUploads(user: User): LiveData<List<JobInfo>> {

app/src/main/java/com/nextcloud/client/jobs/FilesUploadWorker.kt

+18-6
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import android.app.PendingIntent
2727
import android.content.Context
2828
import android.content.Intent
2929
import android.os.Build
30-
import android.text.TextUtils
3130
import androidx.core.app.NotificationCompat
3231
import androidx.localbroadcastmanager.content.LocalBroadcastManager
3332
import androidx.work.Worker
@@ -74,14 +73,29 @@ class FilesUploadWorker(
7473

7574
override fun doWork(): Result {
7675
val accountName = inputData.getString(ACCOUNT)
77-
if (TextUtils.isEmpty(accountName)) {
76+
if (accountName.isNullOrEmpty()) {
77+
Log_OC.w(TAG, "User was null for file upload worker")
7878
return Result.failure() // user account is needed
7979
}
8080

81+
// get all pending uploads
82+
var currentAndPendingUploadsForAccount =
83+
uploadsStorageManager.getCurrentAndPendingUploadsForAccount(accountName)
84+
while (currentAndPendingUploadsForAccount.isNotEmpty()) {
85+
Log_OC.d(TAG, "Handling ${currentAndPendingUploadsForAccount.size} uploads for account $accountName")
86+
handlePendingUploads(currentAndPendingUploadsForAccount, accountName)
87+
currentAndPendingUploadsForAccount =
88+
uploadsStorageManager.getCurrentAndPendingUploadsForAccount(accountName)
89+
}
90+
91+
Log_OC.d(TAG, "No more pending uploads for account $accountName, stopping work")
92+
return Result.success()
93+
}
94+
95+
private fun handlePendingUploads(uploads: Array<OCUpload>, accountName: String) {
8196
val user = userAccountManager.getUser(accountName)
8297

83-
// get all pending uploads
84-
for (upload in uploadsStorageManager.getCurrentAndPendingUploadsForAccount(accountName!!)) {
98+
for (upload in uploads) {
8599
// create upload file operation
86100
if (user.isPresent) {
87101
val uploadFileOperation = createUploadFileOperation(upload, user.get())
@@ -100,8 +114,6 @@ class FilesUploadWorker(
100114
uploadsStorageManager.removeUpload(upload.uploadId)
101115
}
102116
}
103-
104-
return Result.success()
105117
}
106118

107119
/**

0 commit comments

Comments
 (0)