diff --git a/app/src/main/java/com/nextcloud/client/database/dao/UploadDao.kt b/app/src/main/java/com/nextcloud/client/database/dao/UploadDao.kt index 2e1d86d726d5..c949f83e04bf 100644 --- a/app/src/main/java/com/nextcloud/client/database/dao/UploadDao.kt +++ b/app/src/main/java/com/nextcloud/client/database/dao/UploadDao.kt @@ -71,6 +71,16 @@ interface UploadDao { ) suspend fun updateStatus(remotePath: String, accountName: String, status: Int): Int + @Query( + """ + UPDATE ${ProviderTableMeta.UPLOADS_TABLE_NAME} + SET ${ProviderTableMeta.UPLOADS_STATUS} = :status + WHERE ${ProviderTableMeta.UPLOADS_ACCOUNT_NAME} = :accountName + AND ${ProviderTableMeta.UPLOADS_REMOTE_PATH} IN (:remotePaths) +""" + ) + suspend fun updateStatuses(remotePaths: List, accountName: String, status: Int): Int + @Query( """ SELECT * FROM ${ProviderTableMeta.UPLOADS_TABLE_NAME} diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt index a22b5a5999cb..2fd8ae6020cc 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt @@ -47,6 +47,7 @@ import com.owncloud.android.utils.FileUtil import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.io.File import java.util.concurrent.Semaphore import javax.inject.Inject @@ -331,6 +332,11 @@ class FileUploadHelper { } } + suspend fun updateUploadStatuses(remotePaths: List, accountName: String, status: UploadStatus) = + withContext(Dispatchers.IO) { + uploadsStorageManager.uploadDao.updateStatuses(remotePaths, accountName, status.value) + } + /** * Retrieves uploads filtered by their status, optionally for a specific account. * diff --git a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt index 668f01d0d394..84363e6f1543 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadWorker.kt @@ -106,6 +106,14 @@ class FileUploadWorker( onCompleted() } + suspend fun cancelUploads(remotePaths: List, accountName: String) { + withContext(Dispatchers.IO) { + remotePaths.forEach { + cancelUpload(it, accountName) + } + } + } + fun getCurrentUpload(id: Long?): UploadFileOperation? = activeOperations[id] fun isUploading(remotePath: String?, accountName: String?): Boolean = activeOperations.values.any { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/UploadListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/UploadListAdapter.kt index 248bb46e4c9a..54b0783f0761 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/UploadListAdapter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/uploadList/UploadListAdapter.kt @@ -159,21 +159,16 @@ class UploadListAdapter( private fun cancelAllCurrentUploads(group: UploadListSection) { val items = group.items.takeIf { it.isNotEmpty() } ?: return val accountName = items[0].accountName - var completedCount = 0 - items.forEach { upload -> - uploadHelper.updateUploadStatus( - upload.remotePath, + val remotePaths = items.map { it.remotePath } + activity.lifecycleScope.launch(Dispatchers.IO) { + uploadHelper.updateUploadStatuses( + remotePaths, accountName, UploadsStorageManager.UploadStatus.UPLOAD_CANCELLED - ) { - FileUploadWorker.cancelUpload(upload.remotePath, accountName) { - completedCount++ - if (completedCount == items.size) { - Log_OC.d(TAG, "refreshing upload items") - loadUploadItemsFromDb() - } - } - } + ) + FileUploadWorker.cancelUploads(remotePaths, accountName) + Log_OC.d(TAG, "refreshing upload items") + loadUploadItemsFromDb() } }