Skip to content

Commit dae8386

Browse files
committed
fix(upload): pause
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 185885b commit dae8386

7 files changed

Lines changed: 56 additions & 24 deletions

File tree

app/src/main/java/com/nextcloud/client/jobs/upload/AlbumFileUploadWorker.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,14 @@ class AlbumFileUploadWorker(
104104
}
105105
}
106106

107+
fun pauseActiveUploads() {
108+
activeOperations.values.forEach {
109+
Log_OC.d(TAG, "upload operation is paused: ${it.remotePath}")
110+
it.pause()
111+
}
112+
activeOperations.clear()
113+
}
114+
107115
fun getCurrentUpload(id: Long?): UploadFileOperation? = activeOperations[id]
108116

109117
fun isUploading(remotePath: String?, accountName: String?): Boolean = activeOperations.values.any {

app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.nextcloud.client.preferences.AppPreferences
2727
import com.nextcloud.utils.ForegroundServiceHelper
2828
import com.nextcloud.utils.extensions.getPercent
2929
import com.nextcloud.utils.extensions.isNonRetryable
30+
import com.nextcloud.utils.extensions.isUserCancellation
3031
import com.nextcloud.utils.extensions.toFile
3132
import com.owncloud.android.R
3233
import com.owncloud.android.datamodel.ForegroundServiceType
@@ -119,6 +120,14 @@ class FileUploadWorker(
119120
}
120121
}
121122

123+
fun pauseActiveUploads() {
124+
activeOperations.values.forEach {
125+
Log_OC.d(TAG, "upload operation is paused: ${it.remotePath}")
126+
it.pause()
127+
}
128+
activeOperations.clear()
129+
}
130+
122131
fun getCurrentUpload(id: Long?): UploadFileOperation? = activeOperations[id]
123132

124133
fun isUploading(remotePath: String?, accountName: String?): Boolean = activeOperations.values.any {
@@ -290,6 +299,11 @@ class FileUploadWorker(
290299
continue
291300
}
292301

302+
if (isUploading(upload.remotePath, accountName)) {
303+
Log_OC.d(TAG, "skipping upload, another worker is still transferring it: ${upload.remotePath}")
304+
continue
305+
}
306+
293307
delay(retryPolicy.getDelay().milliseconds)
294308

295309
if (!skipAutoUploadCheck && isBelongToAnySyncedFolder(upload, syncFolderHelper, syncedFolders)) {
@@ -339,11 +353,9 @@ class FileUploadWorker(
339353
break
340354
}
341355

342-
// check upload result for worker
343-
val uploadResult = UploadResult.fromOperationResult(result)
344-
if (!result.isSuccess) {
356+
if (!result.isSuccess && !result.code.isUserCancellation()) {
345357
Log_OC.e(TAG, "upload failed for ${upload.remotePath}: ${result.code}")
346-
if (uploadResult.isNonRetryable()) {
358+
if (UploadResult.fromOperationResult(result).isNonRetryable()) {
347359
hasNonRetryableFailure = true
348360
} else {
349361
hasRetryableFailure = true
@@ -368,7 +380,7 @@ class FileUploadWorker(
368380
}
369381

370382
private fun skip(upload: OCUpload): Boolean = when (upload.uploadStatus) {
371-
UploadStatus.UPLOAD_SUCCEEDED -> true
383+
UploadStatus.UPLOAD_SUCCEEDED, UploadStatus.UPLOAD_CANCELLED -> true
372384
UploadStatus.UPLOAD_FAILED -> upload.lastResult.isNonRetryable()
373385
else -> false
374386
}

app/src/main/java/com/nextcloud/utils/extensions/RemoteOperationResultExtensions.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ fun ResultCode.isFileSpecificError(): Boolean {
4444
return !generalErrorCodes.contains(this)
4545
}
4646

47+
fun ResultCode.isUserCancellation(): Boolean = this == ResultCode.CANCELLED || this == ResultCode.USER_CANCELLED
48+
4749
fun ResultCode.isConflict(): Boolean {
4850
val errorCodes = listOf(
4951
ResultCode.SYNC_CONFLICT,

app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import com.nextcloud.client.jobs.upload.FileUploadHelper
3131
import com.nextcloud.client.jobs.upload.FileUploadWorker
3232
import com.nextcloud.utils.autoRename.AutoRename
3333
import com.nextcloud.utils.extensions.isConflict
34+
import com.nextcloud.utils.extensions.isUserCancellation
3435
import com.owncloud.android.MainApp
3536
import com.owncloud.android.db.OCUpload
3637
import com.owncloud.android.db.ProviderMeta.ProviderTableMeta
@@ -211,19 +212,6 @@ class UploadsStorageManager(
211212
return result
212213
}
213214

214-
private fun removeUpload(accountName: String?, remotePath: String?): Int {
215-
val result = contentResolver.delete(
216-
ProviderTableMeta.CONTENT_URI_UPLOADS,
217-
ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "=? AND " + ProviderTableMeta.UPLOADS_REMOTE_PATH + "=?",
218-
arrayOf(accountName, remotePath)
219-
)
220-
Log_OC.d(TAG, "delete returns $result for file $remotePath in $accountName")
221-
if (result > 0) {
222-
notifyObserversNow()
223-
}
224-
return result
225-
}
226-
227215
fun removeUploads(accountName: String?): Int {
228216
val result = contentResolver.delete(
229217
ProviderTableMeta.CONTENT_URI_UPLOADS,
@@ -476,9 +464,8 @@ class UploadsStorageManager(
476464
fun updateDatabaseUploadResult(uploadResult: RemoteOperationResult<*>, upload: UploadFileOperation) {
477465
Log_OC.d(TAG, "updateDatabaseUploadResult uploadResult: $uploadResult upload: $upload")
478466

479-
if (uploadResult.isCancelled) {
480-
Log_OC.w(TAG, "upload is cancelled, removing upload")
481-
removeUpload(upload.user.accountName, upload.remotePath)
467+
if (upload.isPaused) {
468+
Log_OC.d(TAG, "upload is paused, keeping it queued: ${upload.remotePath}")
482469
return
483470
}
484471

@@ -492,7 +479,10 @@ class UploadsStorageManager(
492479
var result = UploadResult.fromOperationResult(uploadResult)
493480
val code = uploadResult.code
494481

495-
if (uploadResult.isSuccess) {
482+
if (code.isUserCancellation()) {
483+
status = UploadStatus.UPLOAD_CANCELLED
484+
result = UploadResult.CANCELLED
485+
} else if (uploadResult.isSuccess) {
496486
status = UploadStatus.UPLOAD_SUCCEEDED
497487
result = if (upload.wasSkipped()) UploadResult.SKIPPED else UploadResult.UPLOADED
498488
} else if (code.isConflict()) {

app/src/main/java/com/owncloud/android/db/UploadResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public static UploadResult fromOperationResult(RemoteOperationResult result) {
103103
case OLD_ANDROID_API -> OLD_ANDROID_API;
104104
case SYNC_CONFLICT -> SYNC_CONFLICT;
105105
case FORBIDDEN -> PRIVILEGES_ERROR;
106-
case CANCELLED -> CANCELLED;
106+
case CANCELLED, USER_CANCELLED -> CANCELLED;
107107
case DELAYED_FOR_WIFI -> DELAYED_FOR_WIFI;
108108
case DELAYED_FOR_CHARGING -> DELAYED_FOR_CHARGING;
109109
case DELAYED_IN_POWER_SAVE_MODE -> DELAYED_IN_POWER_SAVE_MODE;

app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,7 @@ public class UploadFileOperation extends SyncOperation {
158158

159159
private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
160160
private final AtomicBoolean mUploadStarted = new AtomicBoolean(false);
161+
private final AtomicBoolean mPaused = new AtomicBoolean(false);
161162

162163
private Context mContext;
163164

@@ -448,6 +449,7 @@ protected RemoteOperationResult run(OwnCloudClient client) {
448449
}
449450

450451
mCancellationRequested.set(false);
452+
mPaused.set(false);
451453
mUploadStarted.set(true);
452454

453455
updateSize(0);
@@ -1591,6 +1593,15 @@ public void cancel(ResultCode cancellationReason) {
15911593
}
15921594
}
15931595

1596+
public void pause() {
1597+
mPaused.set(true);
1598+
cancel(ResultCode.USER_CANCELLED);
1599+
}
1600+
1601+
public boolean isPaused() {
1602+
return mPaused.get();
1603+
}
1604+
15941605
/**
15951606
* As soon as this method return true, upload can be cancel via cancel().
15961607
*/

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ import com.google.android.material.snackbar.Snackbar
2424
import com.nextcloud.client.account.User
2525
import com.nextcloud.client.core.Clock
2626
import com.nextcloud.client.device.PowerManagementService
27+
import com.nextcloud.client.jobs.upload.AlbumFileUploadWorker
2728
import com.nextcloud.client.jobs.upload.FileUploadEventBroadcaster
2829
import com.nextcloud.client.jobs.upload.FileUploadHelper
30+
import com.nextcloud.client.jobs.upload.FileUploadWorker
2931
import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager
3032
import com.nextcloud.client.utils.Throttler
3133
import com.nextcloud.ui.component.UploadWarningCard
@@ -237,8 +239,15 @@ class UploadListActivity :
237239

238240
@SuppressLint("NotifyDataSetChanged")
239241
private fun toggleGlobalPause(item: MenuItem) {
240-
preferences.setGlobalUploadPaused(!preferences.isGlobalUploadPaused())
242+
val paused = !preferences.isGlobalUploadPaused()
243+
preferences.setGlobalUploadPaused(paused)
241244
updateGlobalPauseIcon(item)
245+
246+
if (paused) {
247+
FileUploadWorker.pauseActiveUploads()
248+
AlbumFileUploadWorker.pauseActiveUploads()
249+
}
250+
242251
val uploadHelper = FileUploadHelper.instance()
243252
accountManager.getAllUsers().filterNotNull().forEach { user ->
244253
val ids = uploadsStorageManager.getCurrentUploadIds(user.accountName)

0 commit comments

Comments
 (0)