Sfoglia il codice sorgente

Rebase master

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 anno fa
parent
commit
0b0691a3ac
31 ha cambiato i file con 272 aggiunte e 332 eliminazioni
  1. 0 0
      app/src/androidTest/java/com/nextcloud/client/EndToEndRandomIT.java
  2. 2 2
      app/src/androidTest/java/com/owncloud/android/AbstractIT.java
  3. 4 4
      app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java
  4. 12 12
      app/src/androidTest/java/com/owncloud/android/UploadIT.java
  5. 15 14
      app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt
  6. 2 2
      app/src/androidTest/java/com/owncloud/android/ui/helpers/UriUploaderIT.kt
  7. 1 1
      app/src/main/java/com/nextcloud/client/di/ComponentsModule.java
  8. 2 2
      app/src/main/java/com/nextcloud/client/documentscan/DocumentScanViewModel.kt
  9. 2 2
      app/src/main/java/com/nextcloud/client/documentscan/GeneratePdfFromImagesWork.kt
  10. 2 2
      app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt
  11. 5 5
      app/src/main/java/com/nextcloud/client/files/upload/PostUploadAction.kt
  12. 4 4
      app/src/main/java/com/nextcloud/client/files/uploader/FileUploaderIntents.kt
  13. 4 5
      app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt
  14. 32 0
      app/src/main/java/com/nextcloud/client/jobs/FilesUploadWorker.kt
  15. 10 9
      app/src/main/java/com/nextcloud/client/utils/FileUploaderDelegate.kt
  16. 3 3
      app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java
  17. 2 1
      app/src/main/java/com/owncloud/android/db/OCUpload.java
  18. 37 110
      app/src/main/java/com/owncloud/android/files/services/FileUploader.java
  19. 39 46
      app/src/main/java/com/owncloud/android/operations/SynchronizeFileOperation.java
  20. 36 36
      app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java
  21. 2 2
      app/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java
  22. 12 13
      app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt
  23. 26 35
      app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
  24. 3 3
      app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
  25. 3 3
      app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
  26. 2 2
      app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java
  27. 0 1
      app/src/main/java/com/owncloud/android/ui/asynctasks/CopyAndUploadContentUrisTask.java
  28. 7 7
      app/src/main/java/com/owncloud/android/ui/dialog/parcel/SyncedFolderParcelable.java
  29. 0 3
      app/src/main/java/com/owncloud/android/utils/FilesUploadHelper.kt
  30. 1 1
      app/src/main/res/values/setup.xml
  31. 2 2
      app/src/test/java/com/owncloud/android/ui/activity/SyncedFoldersActivityTest.java

+ 0 - 0
app/src/androidTest/java/com/nextcloud/client/EndToEndRandomIT.java


+ 2 - 2
app/src/androidTest/java/com/owncloud/android/AbstractIT.java

@@ -21,6 +21,7 @@ import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.account.UserAccountManagerImpl;
 import com.nextcloud.client.device.BatteryStatus;
 import com.nextcloud.client.device.PowerManagementService;
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.network.Connectivity;
 import com.nextcloud.client.network.ConnectivityService;
 import com.nextcloud.client.preferences.AppPreferencesImpl;
@@ -35,7 +36,6 @@ import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.db.OCUpload;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientFactory;
@@ -400,7 +400,7 @@ public abstract class AbstractIT {
             null,
             ocUpload,
             NameCollisionPolicy.DEFAULT,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             targetContext,
             false,
             false,

+ 4 - 4
app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java

@@ -13,13 +13,13 @@ import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.account.UserAccountManagerImpl;
 import com.nextcloud.client.device.BatteryStatus;
 import com.nextcloud.client.device.PowerManagementService;
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.network.Connectivity;
 import com.nextcloud.client.network.ConnectivityService;
 import com.nextcloud.java.util.Optional;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.db.OCUpload;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientFactory;
@@ -178,7 +178,7 @@ public abstract class AbstractOnServerIT extends AbstractIT {
     }
 
     public void uploadOCUpload(OCUpload ocUpload) {
-        uploadOCUpload(ocUpload, FileUploader.LOCAL_BEHAVIOUR_COPY);
+        uploadOCUpload(ocUpload, FilesUploadWorker.LOCAL_BEHAVIOUR_COPY);
     }
 
     public void uploadOCUpload(OCUpload ocUpload, int localBehaviour) {
@@ -253,8 +253,8 @@ public abstract class AbstractOnServerIT extends AbstractIT {
         assertNotNull(uploadedFile.getRemoteId());
         assertNotNull(uploadedFile.getPermissions());
 
-        if (localBehaviour == FileUploader.LOCAL_BEHAVIOUR_COPY ||
-            localBehaviour == FileUploader.LOCAL_BEHAVIOUR_MOVE) {
+        if (localBehaviour == FilesUploadWorker.LOCAL_BEHAVIOUR_COPY ||
+            localBehaviour == FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE) {
             assertTrue(new File(uploadedFile.getStoragePath()).exists());
         }
     }

+ 12 - 12
app/src/androidTest/java/com/owncloud/android/UploadIT.java

@@ -24,12 +24,12 @@ package com.owncloud.android;
 import com.nextcloud.client.account.UserAccountManagerImpl;
 import com.nextcloud.client.device.BatteryStatus;
 import com.nextcloud.client.device.PowerManagementService;
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.network.Connectivity;
 import com.nextcloud.client.network.ConnectivityService;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.db.OCUpload;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.accounts.AccountUtils;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -134,7 +134,7 @@ public class UploadIT extends AbstractOnServerIT {
                                          FOLDER + "nonEmpty.txt",
                                          account.name);
 
-        uploadOCUpload(ocUpload, FileUploader.LOCAL_BEHAVIOUR_COPY);
+        uploadOCUpload(ocUpload, FilesUploadWorker.LOCAL_BEHAVIOUR_COPY);
 
         File originalFile = new File(FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt");
         OCFile uploadedFile = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt");
@@ -150,7 +150,7 @@ public class UploadIT extends AbstractOnServerIT {
                                          FOLDER + "nonEmpty.txt",
                                          account.name);
 
-        uploadOCUpload(ocUpload, FileUploader.LOCAL_BEHAVIOUR_MOVE);
+        uploadOCUpload(ocUpload, FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE);
 
         File originalFile = new File(FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt");
         OCFile uploadedFile = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt");
@@ -166,7 +166,7 @@ public class UploadIT extends AbstractOnServerIT {
                                          FOLDER + "nonEmpty.txt",
                                          account.name);
 
-        uploadOCUpload(ocUpload, FileUploader.LOCAL_BEHAVIOUR_FORGET);
+        uploadOCUpload(ocUpload, FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET);
 
         File originalFile = new File(FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt");
         OCFile uploadedFile = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt");
@@ -182,7 +182,7 @@ public class UploadIT extends AbstractOnServerIT {
                                          FOLDER + "nonEmpty.txt",
                                          account.name);
 
-        uploadOCUpload(ocUpload, FileUploader.LOCAL_BEHAVIOUR_DELETE);
+        uploadOCUpload(ocUpload, FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE);
 
         File originalFile = new File(FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt");
         OCFile uploadedFile = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt");
@@ -222,7 +222,7 @@ public class UploadIT extends AbstractOnServerIT {
             null,
             ocUpload,
             NameCollisionPolicy.DEFAULT,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             targetContext,
             false,
             true,
@@ -270,7 +270,7 @@ public class UploadIT extends AbstractOnServerIT {
             null,
             ocUpload,
             NameCollisionPolicy.DEFAULT,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             targetContext,
             false,
             true,
@@ -315,7 +315,7 @@ public class UploadIT extends AbstractOnServerIT {
             null,
             ocUpload,
             NameCollisionPolicy.DEFAULT,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             targetContext,
             true,
             false,
@@ -345,7 +345,7 @@ public class UploadIT extends AbstractOnServerIT {
             null,
             ocUpload,
             NameCollisionPolicy.DEFAULT,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             targetContext,
             true,
             false,
@@ -400,7 +400,7 @@ public class UploadIT extends AbstractOnServerIT {
             null,
             ocUpload,
             NameCollisionPolicy.DEFAULT,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             targetContext,
             true,
             false,
@@ -433,7 +433,7 @@ public class UploadIT extends AbstractOnServerIT {
                 null,
                 ocUpload,
                 NameCollisionPolicy.DEFAULT,
-                FileUploader.LOCAL_BEHAVIOUR_COPY,
+                FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
                 targetContext,
                 false,
                 false,
@@ -487,7 +487,7 @@ public class UploadIT extends AbstractOnServerIT {
                         null,
                         ocUpload,
                         NameCollisionPolicy.DEFAULT,
-                        FileUploader.LOCAL_BEHAVIOUR_COPY,
+                        FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
                         targetContext,
                         false,
                         false,

+ 15 - 14
app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt

@@ -26,6 +26,7 @@ import com.nextcloud.client.account.UserAccountManager
 import com.nextcloud.client.account.UserAccountManagerImpl
 import com.nextcloud.client.device.BatteryStatus
 import com.nextcloud.client.device.PowerManagementService
+import com.nextcloud.client.jobs.FilesUploadWorker
 import com.nextcloud.client.network.Connectivity
 import com.nextcloud.client.network.ConnectivityService
 import com.owncloud.android.AbstractOnServerIT
@@ -143,7 +144,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             user,
             arrayOf(file.absolutePath),
             arrayOf("/testFile.txt"),
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             true,
             UploadFileOperation.CREATED_BY_USER,
             false,
@@ -165,7 +166,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             targetContext,
             user,
             ocFile2,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             NameCollisionPolicy.OVERWRITE
         )
 
@@ -196,7 +197,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
                 null,
                 ocUpload,
                 NameCollisionPolicy.DEFAULT,
-                FileUploader.LOCAL_BEHAVIOUR_COPY,
+                FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
                 targetContext,
                 false,
                 false,
@@ -224,7 +225,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
                 null,
                 ocUpload2,
                 NameCollisionPolicy.RENAME,
-                FileUploader.LOCAL_BEHAVIOUR_COPY,
+                FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
                 targetContext,
                 false,
                 false,
@@ -260,7 +261,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             user,
             arrayOf(file.absolutePath),
             arrayOf("/testFile.txt"),
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             true,
             UploadFileOperation.CREATED_BY_USER,
             false,
@@ -282,7 +283,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             targetContext,
             user,
             ocFile2,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             NameCollisionPolicy.RENAME
         )
 
@@ -316,7 +317,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
                 null,
                 ocUpload,
                 NameCollisionPolicy.DEFAULT,
-                FileUploader.LOCAL_BEHAVIOUR_COPY,
+                FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
                 targetContext,
                 false,
                 false,
@@ -343,7 +344,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
                 null,
                 ocUpload2,
                 NameCollisionPolicy.CANCEL,
-                FileUploader.LOCAL_BEHAVIOUR_COPY,
+                FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
                 targetContext,
                 false,
                 false,
@@ -369,7 +370,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             user,
             arrayOf(file.absolutePath),
             arrayOf("/testFile.txt"),
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             true,
             UploadFileOperation.CREATED_BY_USER,
             false,
@@ -391,7 +392,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             targetContext,
             user,
             ocFile2,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             NameCollisionPolicy.CANCEL
         )
 
@@ -420,7 +421,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
                 null,
                 ocUpload,
                 NameCollisionPolicy.CANCEL,
-                FileUploader.LOCAL_BEHAVIOUR_COPY,
+                FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
                 targetContext,
                 false,
                 false,
@@ -446,7 +447,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             null,
             ocUpload2,
             NameCollisionPolicy.CANCEL,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             targetContext,
             false,
             false,
@@ -474,7 +475,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             user,
             arrayOf(file.absolutePath),
             arrayOf("/testFile.txt"),
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             true,
             UploadFileOperation.CREATED_BY_USER,
             false,
@@ -496,7 +497,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() {
             targetContext,
             user,
             ocFile2,
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             NameCollisionPolicy.CANCEL
         )
 

+ 2 - 2
app/src/androidTest/java/com/owncloud/android/ui/helpers/UriUploaderIT.kt

@@ -2,9 +2,9 @@ package com.owncloud.android.ui.helpers
 
 import android.net.Uri
 import androidx.test.core.app.launchActivity
+import com.nextcloud.client.jobs.FilesUploadWorker
 import com.nextcloud.test.TestActivity
 import com.owncloud.android.AbstractIT
-import com.owncloud.android.files.services.FileUploader
 import org.junit.Assert
 import org.junit.Test
 
@@ -38,7 +38,7 @@ class UriUploaderIT : AbstractIT() {
             listOf(Uri.parse(path)),
             "",
             activity.user.orElseThrow(::RuntimeException),
-            FileUploader.LOCAL_BEHAVIOUR_MOVE,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE,
             false,
             null
         )

+ 1 - 1
app/src/main/java/com/nextcloud/client/di/ComponentsModule.java

@@ -63,6 +63,7 @@ import com.owncloud.android.ui.activity.CopyToClipboardActivity;
 import com.owncloud.android.ui.activity.DrawerActivity;
 import com.owncloud.android.ui.activity.ErrorsWhileCopyingHandlerActivity;
 import com.owncloud.android.ui.activity.ExternalSiteWebView;
+import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.FilePickerActivity;
 import com.owncloud.android.ui.activity.FolderPickerActivity;
@@ -133,7 +134,6 @@ import com.owncloud.android.ui.preview.PreviewTextStringFragment;
 import com.owncloud.android.ui.preview.pdf.PreviewPdfFragment;
 import com.owncloud.android.ui.trashbin.TrashbinActivity;
 import com.owncloud.android.utils.FilesUploadHelper;
-import com.owncloud.android.ui.activity.FileActivity;
 
 import dagger.Module;
 import dagger.android.ContributesAndroidInjector;

+ 2 - 2
app/src/main/java/com/nextcloud/client/documentscan/DocumentScanViewModel.kt

@@ -30,9 +30,9 @@ import androidx.lifecycle.viewModelScope
 import com.nextcloud.client.account.CurrentAccountProvider
 import com.nextcloud.client.di.IoDispatcher
 import com.nextcloud.client.jobs.BackgroundJobManager
+import com.nextcloud.client.jobs.FilesUploadWorker
 import com.nextcloud.client.logger.Logger
 import com.owncloud.android.datamodel.OCFile
-import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.files.services.NameCollisionPolicy
 import com.owncloud.android.operations.UploadFileOperation
 import com.owncloud.android.ui.helpers.FileOperationsHelper
@@ -188,7 +188,7 @@ class DocumentScanViewModel @Inject constructor(
             currentAccountProvider.user,
             pageList.toTypedArray(),
             uploadPaths,
-            FileUploader.LOCAL_BEHAVIOUR_DELETE,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE,
             true,
             UploadFileOperation.CREATED_BY_USER,
             false,

+ 2 - 2
app/src/main/java/com/nextcloud/client/documentscan/GeneratePdfFromImagesWork.kt

@@ -32,10 +32,10 @@ import androidx.work.WorkerParameters
 import com.nextcloud.client.account.AnonymousUser
 import com.nextcloud.client.account.User
 import com.nextcloud.client.account.UserAccountManager
+import com.nextcloud.client.jobs.FilesUploadWorker
 import com.nextcloud.client.logger.Logger
 import com.owncloud.android.R
 import com.owncloud.android.datamodel.OCFile
-import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.files.services.NameCollisionPolicy
 import com.owncloud.android.operations.UploadFileOperation
 import com.owncloud.android.ui.notifications.NotificationUtils
@@ -127,7 +127,7 @@ class GeneratePdfFromImagesWork(
             user,
             arrayOf(pdfPath),
             arrayOf(uploadPath),
-            FileUploader.LOCAL_BEHAVIOUR_DELETE, // MIME type will be detected from file name
+            FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE, // MIME type will be detected from file name
             true,
             UploadFileOperation.CREATED_BY_USER,
             false,

+ 2 - 2
app/src/main/java/com/nextcloud/client/editimage/EditImageActivity.kt

@@ -34,11 +34,11 @@ import androidx.core.view.WindowCompat
 import androidx.core.view.WindowInsetsCompat
 import com.canhub.cropper.CropImageView
 import com.nextcloud.client.di.Injectable
+import com.nextcloud.client.jobs.FilesUploadWorker
 import com.nextcloud.utils.extensions.getParcelableArgument
 import com.owncloud.android.R
 import com.owncloud.android.databinding.ActivityEditImageBinding
 import com.owncloud.android.datamodel.OCFile
-import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.files.services.NameCollisionPolicy
 import com.owncloud.android.lib.common.operations.OnRemoteOperationListener
 import com.owncloud.android.operations.UploadFileOperation
@@ -121,7 +121,7 @@ class EditImageActivity :
                 requiresWifi = false,
                 requiresCharging = false,
                 nameCollisionPolicy = NameCollisionPolicy.RENAME,
-                localBehavior = FileUploader.LOCAL_BEHAVIOUR_DELETE
+                localBehavior = FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE
             )
         }
     }

+ 5 - 5
app/src/main/java/com/nextcloud/client/files/upload/PostUploadAction.kt

@@ -19,11 +19,11 @@
  */
 package com.nextcloud.client.files.upload
 
-import com.owncloud.android.files.services.FileUploader
+import com.nextcloud.client.jobs.FilesUploadWorker
 
 enum class PostUploadAction(val value: Int) {
-    NONE(FileUploader.LOCAL_BEHAVIOUR_FORGET),
-    COPY_TO_APP(FileUploader.LOCAL_BEHAVIOUR_COPY),
-    MOVE_TO_APP(FileUploader.LOCAL_BEHAVIOUR_MOVE),
-    DELETE_SOURCE(FileUploader.LOCAL_BEHAVIOUR_DELETE)
+    NONE(FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET),
+    COPY_TO_APP(FilesUploadWorker.LOCAL_BEHAVIOUR_COPY),
+    MOVE_TO_APP(FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE),
+    DELETE_SOURCE(FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE)
 }

+ 4 - 4
app/src/main/java/com/nextcloud/client/files/uploader/FileUploaderIntents.kt

@@ -25,8 +25,8 @@ import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
 import android.os.Build
+import com.nextcloud.client.jobs.FilesUploadWorker
 import com.owncloud.android.authentication.AuthenticatorActivity
-import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.files.services.FileUploader.UploadNotificationActionReceiver
 import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode
 import com.owncloud.android.operations.UploadFileOperation
@@ -43,9 +43,9 @@ class FileUploaderIntents(private val context: Context) {
             context,
             UploadNotificationActionReceiver::class.java
         ).apply {
-            putExtra(FileUploader.EXTRA_ACCOUNT_NAME, operation.user.accountName)
-            putExtra(FileUploader.EXTRA_REMOTE_PATH, operation.remotePath)
-            action = FileUploader.ACTION_CANCEL_BROADCAST
+            putExtra(FilesUploadWorker.EXTRA_ACCOUNT_NAME, operation.user.accountName)
+            putExtra(FilesUploadWorker.EXTRA_REMOTE_PATH, operation.remotePath)
+            action = FilesUploadWorker.ACTION_CANCEL_BROADCAST
         }
 
         return PendingIntent.getBroadcast(

+ 4 - 5
app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt

@@ -45,7 +45,6 @@ import com.owncloud.android.datamodel.MediaFolderType
 import com.owncloud.android.datamodel.SyncedFolder
 import com.owncloud.android.datamodel.SyncedFolderProvider
 import com.owncloud.android.datamodel.UploadsStorageManager
-import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.lib.common.utils.Log_OC
 import com.owncloud.android.operations.UploadFileOperation
 import com.owncloud.android.ui.activity.SettingsActivity
@@ -293,10 +292,10 @@ class FilesSyncWork(
 
     private fun getUploadAction(action: String): Int? {
         return when (action) {
-            "LOCAL_BEHAVIOUR_FORGET" -> FileUploader.LOCAL_BEHAVIOUR_FORGET
-            "LOCAL_BEHAVIOUR_MOVE" -> FileUploader.LOCAL_BEHAVIOUR_MOVE
-            "LOCAL_BEHAVIOUR_DELETE" -> FileUploader.LOCAL_BEHAVIOUR_DELETE
-            else -> FileUploader.LOCAL_BEHAVIOUR_FORGET
+            "LOCAL_BEHAVIOUR_FORGET" -> FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET
+            "LOCAL_BEHAVIOUR_MOVE" -> FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE
+            "LOCAL_BEHAVIOUR_DELETE" -> FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE
+            else -> FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET
         }
     }
 }

+ 32 - 0
app/src/main/java/com/nextcloud/client/jobs/FilesUploadWorker.kt

@@ -284,5 +284,37 @@ class FilesUploadWorker(
         private const val MAX_PROGRESS: Int = 100
         const val ACCOUNT = "data_account"
         var currentUploadFileOperation: UploadFileOperation? = null
+
+        const val UPLOADS_ADDED_MESSAGE = "UPLOADS_ADDED"
+        const val UPLOAD_START_MESSAGE = "UPLOAD_START"
+        const val UPLOAD_FINISH_MESSAGE = "UPLOAD_FINISH"
+        const val EXTRA_UPLOAD_RESULT = "RESULT"
+        const val EXTRA_REMOTE_PATH = "REMOTE_PATH"
+        const val EXTRA_OLD_REMOTE_PATH = "OLD_REMOTE_PATH"
+        const val EXTRA_OLD_FILE_PATH = "OLD_FILE_PATH"
+        const val EXTRA_LINKED_TO_PATH = "LINKED_TO"
+        const val ACCOUNT_NAME = "ACCOUNT_NAME"
+        const val EXTRA_ACCOUNT_NAME = "ACCOUNT_NAME"
+        const val ACTION_CANCEL_BROADCAST = "CANCEL"
+        const val ACTION_PAUSE_BROADCAST = "PAUSE"
+        const val KEY_FILE = "FILE"
+        const val KEY_LOCAL_FILE = "LOCAL_FILE"
+        const val KEY_REMOTE_FILE = "REMOTE_FILE"
+        const val KEY_MIME_TYPE = "MIME_TYPE"
+        const val KEY_RETRY = "KEY_RETRY"
+        const val KEY_RETRY_UPLOAD = "KEY_RETRY_UPLOAD"
+        const val KEY_ACCOUNT = "ACCOUNT"
+        const val KEY_USER = "USER"
+        const val KEY_NAME_COLLISION_POLICY = "KEY_NAME_COLLISION_POLICY"
+        const val KEY_CREATE_REMOTE_FOLDER = "CREATE_REMOTE_FOLDER"
+        const val KEY_CREATED_BY = "CREATED_BY"
+        const val KEY_WHILE_ON_WIFI_ONLY = "KEY_ON_WIFI_ONLY"
+        const val KEY_WHILE_CHARGING_ONLY = "KEY_WHILE_CHARGING_ONLY"
+        const val KEY_LOCAL_BEHAVIOUR = "BEHAVIOUR"
+        const val KEY_DISABLE_RETRIES = "DISABLE_RETRIES"
+        const val LOCAL_BEHAVIOUR_COPY = 0
+        const val LOCAL_BEHAVIOUR_MOVE = 1
+        const val LOCAL_BEHAVIOUR_FORGET = 2
+        const val LOCAL_BEHAVIOUR_DELETE = 3
     }
 }

+ 10 - 9
app/src/main/java/com/nextcloud/client/utils/FileUploaderDelegate.kt

@@ -25,6 +25,7 @@ package com.nextcloud.client.utils
 import android.content.Context
 import android.content.Intent
 import androidx.localbroadcastmanager.content.LocalBroadcastManager
+import com.nextcloud.client.jobs.FilesUploadWorker
 import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.lib.common.operations.RemoteOperationResult
 import com.owncloud.android.operations.UploadFileOperation
@@ -55,9 +56,9 @@ class FileUploaderDelegate {
         localBroadcastManager: LocalBroadcastManager
     ) {
         val start = Intent(FileUploader.getUploadStartMessage())
-        start.putExtra(FileUploader.EXTRA_REMOTE_PATH, upload.remotePath) // real remote
-        start.putExtra(FileUploader.EXTRA_OLD_FILE_PATH, upload.originalStoragePath)
-        start.putExtra(FileUploader.ACCOUNT_NAME, upload.user.accountName)
+        start.putExtra(FilesUploadWorker.EXTRA_REMOTE_PATH, upload.remotePath) // real remote
+        start.putExtra(FilesUploadWorker.EXTRA_OLD_FILE_PATH, upload.originalStoragePath)
+        start.putExtra(FilesUploadWorker.ACCOUNT_NAME, upload.user.accountName)
         start.setPackage(context.packageName)
         localBroadcastManager.sendBroadcast(start)
     }
@@ -80,15 +81,15 @@ class FileUploaderDelegate {
     ) {
         val end = Intent(FileUploader.getUploadFinishMessage())
         // real remote path, after possible automatic renaming
-        end.putExtra(FileUploader.EXTRA_REMOTE_PATH, upload.remotePath)
+        end.putExtra(FilesUploadWorker.EXTRA_REMOTE_PATH, upload.remotePath)
         if (upload.wasRenamed()) {
-            end.putExtra(FileUploader.EXTRA_OLD_REMOTE_PATH, upload.oldFile!!.remotePath)
+            end.putExtra(FilesUploadWorker.EXTRA_OLD_REMOTE_PATH, upload.oldFile!!.remotePath)
         }
-        end.putExtra(FileUploader.EXTRA_OLD_FILE_PATH, upload.originalStoragePath)
-        end.putExtra(FileUploader.ACCOUNT_NAME, upload.user.accountName)
-        end.putExtra(FileUploader.EXTRA_UPLOAD_RESULT, uploadResult.isSuccess)
+        end.putExtra(FilesUploadWorker.EXTRA_OLD_FILE_PATH, upload.originalStoragePath)
+        end.putExtra(FilesUploadWorker.ACCOUNT_NAME, upload.user.accountName)
+        end.putExtra(FilesUploadWorker.EXTRA_UPLOAD_RESULT, uploadResult.isSuccess)
         if (unlinkedFromRemotePath != null) {
-            end.putExtra(FileUploader.EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath)
+            end.putExtra(FilesUploadWorker.EXTRA_LINKED_TO_PATH, unlinkedFromRemotePath)
         }
         end.setPackage(context.packageName)
         localBroadcastManager.sendBroadcast(end)

+ 3 - 3
app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java

@@ -34,11 +34,11 @@ import android.os.RemoteException;
 
 import com.nextcloud.client.account.CurrentAccountProvider;
 import com.nextcloud.client.account.User;
+import com.nextcloud.client.jobs.upload.FileUploadWorker;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.db.OCUpload;
 import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
 import com.owncloud.android.db.UploadResult;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
@@ -726,7 +726,7 @@ public class UploadsStorageManager extends Observable {
                 upload.getRemotePath()
                         );
         } else {
-            String localPath = (FileUploader.LOCAL_BEHAVIOUR_MOVE == upload.getLocalBehaviour())
+            String localPath = (FileUploadWorker.LOCAL_BEHAVIOUR_MOVE == upload.getLocalBehaviour())
                 ? upload.getStoragePath() : null;
 
             if (uploadResult.isSuccess()) {
@@ -753,7 +753,7 @@ public class UploadsStorageManager extends Observable {
      * Updates the persistent upload database with an upload now in progress.
      */
     public void updateDatabaseUploadStart(UploadFileOperation upload) {
-        String localPath = (FileUploader.LOCAL_BEHAVIOUR_MOVE == upload.getLocalBehaviour())
+        String localPath = (FileUploadWorker.LOCAL_BEHAVIOUR_MOVE == upload.getLocalBehaviour())
             ? upload.getStoragePath() : null;
 
         updateUploadStatus(

+ 2 - 1
app/src/main/java/com/owncloud/android/db/OCUpload.java

@@ -27,6 +27,7 @@ import android.os.Parcel;
 import android.os.Parcelable;
 
 import com.nextcloud.client.account.User;
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.datamodel.UploadsStorageManager.UploadStatus;
@@ -171,7 +172,7 @@ public class OCUpload implements Parcelable {
         accountName = "";
         fileSize = -1;
         uploadId = -1;
-        localAction = FileUploader.LOCAL_BEHAVIOUR_COPY;
+        localAction = FilesUploadWorker.LOCAL_BEHAVIOUR_COPY;
         nameCollisionPolicy = NameCollisionPolicy.DEFAULT;
         createRemoteFolder = false;
         uploadStatus = UploadStatus.UPLOAD_IN_PROGRESS;

+ 37 - 110
app/src/main/java/com/owncloud/android/files/services/FileUploader.java

@@ -111,82 +111,9 @@ public class FileUploader extends Service
 
     private static final String TAG = FileUploader.class.getSimpleName();
 
-    private static final String UPLOADS_ADDED_MESSAGE = "UPLOADS_ADDED";
-    private static final String UPLOAD_START_MESSAGE = "UPLOAD_START";
-    private static final String UPLOAD_FINISH_MESSAGE = "UPLOAD_FINISH";
-    public static final String EXTRA_UPLOAD_RESULT = "RESULT";
-    public static final String EXTRA_REMOTE_PATH = "REMOTE_PATH";
-    public static final String EXTRA_OLD_REMOTE_PATH = "OLD_REMOTE_PATH";
-    public static final String EXTRA_OLD_FILE_PATH = "OLD_FILE_PATH";
-    public static final String EXTRA_LINKED_TO_PATH = "LINKED_TO";
-    public static final String ACCOUNT_NAME = "ACCOUNT_NAME";
-
-    public static final String EXTRA_ACCOUNT_NAME = "ACCOUNT_NAME";
-    public static final String ACTION_CANCEL_BROADCAST = "CANCEL";
-    public static final String ACTION_PAUSE_BROADCAST = "PAUSE";
-
-    public static final String KEY_FILE = "FILE";
-    public static final String KEY_LOCAL_FILE = "LOCAL_FILE";
-    public static final String KEY_REMOTE_FILE = "REMOTE_FILE";
-    public static final String KEY_MIME_TYPE = "MIME_TYPE";
 
-    /**
-     * Call this Service with only this Intent key if all pending uploads are to be retried.
-     */
-    private static final String KEY_RETRY = "KEY_RETRY";
-//    /**
-//     * Call this Service with KEY_RETRY and KEY_RETRY_REMOTE_PATH to retry
-//     * upload of file identified by KEY_RETRY_REMOTE_PATH.
-//     */
-//    private static final String KEY_RETRY_REMOTE_PATH = "KEY_RETRY_REMOTE_PATH";
-    /**
-     * Call this Service with KEY_RETRY and KEY_RETRY_UPLOAD to retry upload of file identified by KEY_RETRY_UPLOAD.
-     */
-    private static final String KEY_RETRY_UPLOAD = "KEY_RETRY_UPLOAD";
-
-    /**
-     * {@link Account} to which file is to be uploaded.
-     */
-    public static final String KEY_ACCOUNT = "ACCOUNT";
-
-    /**
-     * {@link User} for which file is to be uploaded.
-     */
-    public static final String KEY_USER = "USER";
-
-
-    /**
-     * What {@link NameCollisionPolicy} to do when the file already exists on the remote.
-     */
-    public static final String KEY_NAME_COLLISION_POLICY = "KEY_NAME_COLLISION_POLICY";
-
-    /**
-     * Set to true if remote folder is to be created if it does not exist.
-     */
-    public static final String KEY_CREATE_REMOTE_FOLDER = "CREATE_REMOTE_FOLDER";
-    /**
-     * Key to signal what is the origin of the upload request
-     */
-    public static final String KEY_CREATED_BY = "CREATED_BY";
-
-    public static final String KEY_WHILE_ON_WIFI_ONLY = "KEY_ON_WIFI_ONLY";
 
-    /**
-     * Set to true if upload is to performed only when phone is being charged.
-     */
-    public static final String KEY_WHILE_CHARGING_ONLY = "KEY_WHILE_CHARGING_ONLY";
-
-    public static final String KEY_LOCAL_BEHAVIOUR = "BEHAVIOUR";
-
-    /**
-     * Set to true if the HTTP library should disable automatic retries of uploads.
-     */
-    public static final String KEY_DISABLE_RETRIES = "DISABLE_RETRIES";
 
-    public static final int LOCAL_BEHAVIOUR_COPY = 0;
-    public static final int LOCAL_BEHAVIOUR_MOVE = 1;
-    public static final int LOCAL_BEHAVIOUR_FORGET = 2;
-    public static final int LOCAL_BEHAVIOUR_DELETE = 3;
 
     private static boolean forceNewUploadWorker = false;
 
@@ -293,12 +220,12 @@ public class FileUploader extends Service
             return Service.START_NOT_STICKY;
         }
 
-        if (!intent.hasExtra(KEY_ACCOUNT)) {
+        if (!intent.hasExtra(FilesUploadWorker.KEY_ACCOUNT)) {
             Log_OC.e(TAG, "Not enough information provided in intent");
             return Service.START_NOT_STICKY;
         }
 
-        final Account account = IntentExtensionsKt.getParcelableArgument(intent, KEY_ACCOUNT, Account.class);
+        final Account account = IntentExtensionsKt.getParcelableArgument(intent, FilesUploadWorker.KEY_ACCOUNT, Account.class);
         if (account == null) {
             return Service.START_NOT_STICKY;
         }
@@ -308,22 +235,22 @@ public class FileUploader extends Service
         }
         final User user = optionalUser.get();
 
-        boolean retry = intent.getBooleanExtra(KEY_RETRY, false);
+        boolean retry = intent.getBooleanExtra(FilesUploadWorker.KEY_RETRY, false);
         List<String> requestedUploads = new ArrayList<>();
 
-        boolean onWifiOnly = intent.getBooleanExtra(KEY_WHILE_ON_WIFI_ONLY, false);
-        boolean whileChargingOnly = intent.getBooleanExtra(KEY_WHILE_CHARGING_ONLY, false);
+        boolean onWifiOnly = intent.getBooleanExtra(FilesUploadWorker.KEY_WHILE_ON_WIFI_ONLY, false);
+        boolean whileChargingOnly = intent.getBooleanExtra(FilesUploadWorker.KEY_WHILE_CHARGING_ONLY, false);
 
         if (retry) {
             // Retry uploads
-            if (!intent.hasExtra(KEY_ACCOUNT) || !intent.hasExtra(KEY_RETRY_UPLOAD)) {
+            if (!intent.hasExtra(FilesUploadWorker.KEY_ACCOUNT) || !intent.hasExtra(FilesUploadWorker.KEY_RETRY_UPLOAD)) {
                 Log_OC.e(TAG, "Not enough information provided in intent: no KEY_RETRY_UPLOAD_KEY");
                 return START_NOT_STICKY;
             }
             retryUploads(intent, user, requestedUploads);
         } else {
             // Start new uploads
-            if (!(intent.hasExtra(KEY_LOCAL_FILE) || intent.hasExtra(KEY_FILE))) {
+            if (!(intent.hasExtra(FilesUploadWorker.KEY_LOCAL_FILE) || intent.hasExtra(FilesUploadWorker.KEY_FILE))) {
                 Log_OC.e(TAG, "Not enough information provided in intent");
                 return Service.START_NOT_STICKY;
             }
@@ -361,20 +288,20 @@ public class FileUploader extends Service
         String[] mimeTypes = null;
         OCFile[] files = null;
 
-        if (intent.hasExtra(KEY_FILE)) {
-            Parcelable[] files_temp = intent.getParcelableArrayExtra(KEY_FILE);
+        if (intent.hasExtra(FilesUploadWorker.KEY_FILE)) {
+            Parcelable[] files_temp = intent.getParcelableArrayExtra(FilesUploadWorker.KEY_FILE);
             files = new OCFile[files_temp.length];
             System.arraycopy(files_temp, 0, files, 0, files_temp.length);
         } else {
-            localPaths = intent.getStringArrayExtra(KEY_LOCAL_FILE);
-            remotePaths = intent.getStringArrayExtra(KEY_REMOTE_FILE);
-            mimeTypes = intent.getStringArrayExtra(KEY_MIME_TYPE);
+            localPaths = intent.getStringArrayExtra(FilesUploadWorker.KEY_LOCAL_FILE);
+            remotePaths = intent.getStringArrayExtra(FilesUploadWorker.KEY_REMOTE_FILE);
+            mimeTypes = intent.getStringArrayExtra(FilesUploadWorker.KEY_MIME_TYPE);
         }
 
-        if (intent.hasExtra(KEY_FILE) && files == null) {
+        if (intent.hasExtra(FilesUploadWorker.KEY_FILE) && files == null) {
             Log_OC.e(TAG, "Incorrect array for OCFiles provided in upload intent");
             return Service.START_NOT_STICKY;
-        } else if (!intent.hasExtra(KEY_FILE)) {
+        } else if (!intent.hasExtra(FilesUploadWorker.KEY_FILE)) {
             if (localPaths == null) {
                 Log_OC.e(TAG, "Incorrect array for local paths provided in upload intent");
                 return Service.START_NOT_STICKY;
@@ -404,14 +331,14 @@ public class FileUploader extends Service
         }
         // at this point variable "OCFile[] files" is loaded correctly.
 
-        NameCollisionPolicy nameCollisionPolicy = IntentExtensionsKt.getSerializableArgument(intent, KEY_NAME_COLLISION_POLICY, NameCollisionPolicy.class);
+        NameCollisionPolicy nameCollisionPolicy = IntentExtensionsKt.getSerializableArgument(intent, FilesUploadWorker.KEY_NAME_COLLISION_POLICY, NameCollisionPolicy.class);
         if (nameCollisionPolicy == null) {
             nameCollisionPolicy = NameCollisionPolicy.DEFAULT;
         }
-        int localAction = intent.getIntExtra(KEY_LOCAL_BEHAVIOUR, LOCAL_BEHAVIOUR_FORGET);
-        boolean isCreateRemoteFolder = intent.getBooleanExtra(KEY_CREATE_REMOTE_FOLDER, false);
-        int createdBy = intent.getIntExtra(KEY_CREATED_BY, UploadFileOperation.CREATED_BY_USER);
-        boolean disableRetries = intent.getBooleanExtra(KEY_DISABLE_RETRIES, true);
+        int localAction = intent.getIntExtra(FilesUploadWorker.KEY_LOCAL_BEHAVIOUR, FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET);
+        boolean isCreateRemoteFolder = intent.getBooleanExtra(FilesUploadWorker.KEY_CREATE_REMOTE_FOLDER, false);
+        int createdBy = intent.getIntExtra(FilesUploadWorker.KEY_CREATED_BY, UploadFileOperation.CREATED_BY_USER);
+        boolean disableRetries = intent.getBooleanExtra(FilesUploadWorker.KEY_DISABLE_RETRIES, true);
         try {
             for (OCFile file : files) {
                 startNewUpload(
@@ -512,7 +439,7 @@ public class FileUploader extends Service
         boolean onWifiOnly;
         boolean whileChargingOnly;
 
-        OCUpload upload = IntentExtensionsKt.getParcelableArgument(intent, KEY_RETRY_UPLOAD, OCUpload.class);
+        OCUpload upload = IntentExtensionsKt.getParcelableArgument(intent, FilesUploadWorker.KEY_RETRY_UPLOAD, OCUpload.class);
 
         onWifiOnly = upload.isUseWifiOnly();
         whileChargingOnly = upload.isWhileChargingOnly();
@@ -814,12 +741,12 @@ public class FileUploader extends Service
         boolean disableRetries) {
         Intent intent = new Intent(context, FileUploader.class);
 
-        intent.putExtra(FileUploader.KEY_USER, user);
-        intent.putExtra(FileUploader.KEY_ACCOUNT, user.toPlatformAccount());
-        intent.putExtra(FileUploader.KEY_FILE, existingFiles);
-        intent.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, behaviour);
-        intent.putExtra(FileUploader.KEY_NAME_COLLISION_POLICY, nameCollisionPolicy);
-        intent.putExtra(FileUploader.KEY_DISABLE_RETRIES, disableRetries);
+        intent.putExtra(FilesUploadWorker.KEY_USER, user);
+        intent.putExtra(FilesUploadWorker.KEY_ACCOUNT, user.toPlatformAccount());
+        intent.putExtra(FilesUploadWorker.KEY_FILE, existingFiles);
+        intent.putExtra(FilesUploadWorker.KEY_LOCAL_BEHAVIOUR, behaviour);
+        intent.putExtra(FilesUploadWorker.KEY_NAME_COLLISION_POLICY, nameCollisionPolicy);
+        intent.putExtra(FilesUploadWorker.KEY_DISABLE_RETRIES, disableRetries);
 
         new FilesUploadHelper().uploadUpdatedFile(user, existingFiles, behaviour, nameCollisionPolicy);
     }
@@ -831,10 +758,10 @@ public class FileUploader extends Service
                                    @NonNull User user,
                                    @NonNull OCUpload upload) {
         Intent i = new Intent(context, FileUploader.class);
-        i.putExtra(FileUploader.KEY_RETRY, true);
-        i.putExtra(FileUploader.KEY_USER, user);
-        i.putExtra(FileUploader.KEY_ACCOUNT, user.toPlatformAccount());
-        i.putExtra(FileUploader.KEY_RETRY_UPLOAD, upload);
+        i.putExtra(FilesUploadWorker.KEY_RETRY, true);
+        i.putExtra(FilesUploadWorker.KEY_USER, user);
+        i.putExtra(FilesUploadWorker.KEY_ACCOUNT, user.toPlatformAccount());
+        i.putExtra(FilesUploadWorker.KEY_RETRY_UPLOAD, upload);
 
         new FilesUploadHelper().retryUpload(upload, user);
     }
@@ -890,15 +817,15 @@ public class FileUploader extends Service
     }
 
     public static String getUploadsAddedMessage() {
-        return FileUploader.class.getName() + UPLOADS_ADDED_MESSAGE;
+        return FileUploader.class.getName() + FilesUploadWorker.UPLOADS_ADDED_MESSAGE;
     }
 
     public static String getUploadStartMessage() {
-        return FileUploader.class.getName() + UPLOAD_START_MESSAGE;
+        return FileUploader.class.getName() + FilesUploadWorker.UPLOAD_START_MESSAGE;
     }
 
     public static String getUploadFinishMessage() {
-        return FileUploader.class.getName() + UPLOAD_FINISH_MESSAGE;
+        return FileUploader.class.getName() + FilesUploadWorker.UPLOAD_FINISH_MESSAGE;
     }
 
     @VisibleForTesting
@@ -1179,11 +1106,11 @@ public class FileUploader extends Service
         @Override
         public void onReceive(Context context, Intent intent) {
 
-            String accountName = intent.getStringExtra(EXTRA_ACCOUNT_NAME);
-            String remotePath = intent.getStringExtra(EXTRA_REMOTE_PATH);
+            String accountName = intent.getStringExtra(FilesUploadWorker.EXTRA_ACCOUNT_NAME);
+            String remotePath = intent.getStringExtra(FilesUploadWorker.EXTRA_REMOTE_PATH);
             String action = intent.getAction();
 
-            if (ACTION_CANCEL_BROADCAST.equals(action)) {
+            if (FilesUploadWorker.ACTION_CANCEL_BROADCAST.equals(action)) {
                 Log_OC.d(TAG, "Cancel broadcast received for file " + remotePath + " at " + System.currentTimeMillis());
 
                 if (accountName == null || remotePath == null) {
@@ -1192,7 +1119,7 @@ public class FileUploader extends Service
 
                 FileUploaderBinder uploadBinder = (FileUploaderBinder) mBinder;
                 uploadBinder.cancel(accountName, remotePath, null);
-            } else if (ACTION_PAUSE_BROADCAST.equals(action)) {
+            } else if (FilesUploadWorker.ACTION_PAUSE_BROADCAST.equals(action)) {
 
             } else {
                 Log_OC.d(TAG, "Unknown action to perform as UploadNotificationActionReceiver.");

+ 39 - 46
app/src/main/java/com/owncloud/android/operations/SynchronizeFileOperation.java

@@ -25,10 +25,11 @@ import android.content.Context;
 import android.text.TextUtils;
 
 import com.nextcloud.client.account.User;
-import com.nextcloud.client.files.downloader.FileDownloadHelper;
+import com.nextcloud.client.jobs.download.FileDownloadHelper;
+import com.nextcloud.client.jobs.upload.FileUploadHelper;
+import com.nextcloud.client.jobs.upload.FileUploadWorker;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -55,8 +56,8 @@ public class SynchronizeFileOperation extends SyncOperation {
     private boolean mTransferWasRequested;
 
     /**
-     * When 'false', uploads to the server are not done; only downloads or conflict detection.
-     * This is a temporal field.
+     * When 'false', uploads to the server are not done; only downloads or conflict detection. This is a temporal
+     * field.
      * TODO Remove when 'folder synchronization' replaces 'folder download'.
      */
     private boolean mAllowUploads;
@@ -65,15 +66,15 @@ public class SynchronizeFileOperation extends SyncOperation {
     /**
      * Constructor for "full synchronization mode".
      * <p/>
-     * Uses remotePath to retrieve all the data both in local cache and in the remote OC server
-     * when the operation is executed, instead of reusing {@link OCFile} instances.
+     * Uses remotePath to retrieve all the data both in local cache and in the remote OC server when the operation is
+     * executed, instead of reusing {@link OCFile} instances.
      * <p/>
      * Useful for direct synchronization of a single file.
      *
      * @param remotePath       remote path of the file
      * @param user             Nextcloud user owning the file.
-     * @param syncFileContents When 'true', transference of data will be started by the
-     *                         operation if needed and no conflict is detected.
+     * @param syncFileContents When 'true', transference of data will be started by the operation if needed and no
+     *                         conflict is detected.
      * @param context          Android context; needed to start transfers.
      */
     public SynchronizeFileOperation(
@@ -95,22 +96,20 @@ public class SynchronizeFileOperation extends SyncOperation {
 
 
     /**
-     * Constructor allowing to reuse {@link OCFile} instances just queried from local cache or
-     * from remote OC server.
-     *
-     * Useful to include this operation as part of the synchronization of a folder
-     * (or a full account), avoiding the repetition of fetch operations (both in local database
-     * or remote server).
-     *
-     * At least one of localFile or serverFile MUST NOT BE NULL. If you don't have none of them,
-     * use the other constructor.
+     * Constructor allowing to reuse {@link OCFile} instances just queried from local cache or from remote OC server.
+     * <p>
+     * Useful to include this operation as part of the synchronization of a folder (or a full account), avoiding the
+     * repetition of fetch operations (both in local database or remote server).
+     * <p>
+     * At least one of localFile or serverFile MUST NOT BE NULL. If you don't have none of them, use the other
+     * constructor.
      *
      * @param localFile        Data of file (just) retrieved from local cache/database.
-     * @param serverFile       Data of file (just) retrieved from a remote server. If null,
-     *                         will be retrieved from network by the operation when executed.
+     * @param serverFile       Data of file (just) retrieved from a remote server. If null, will be retrieved from
+     *                         network by the operation when executed.
      * @param user             Nextcloud user owning the file.
-     * @param syncFileContents When 'true', transference of data will be started by the
-     *                         operation if needed and no conflict is detected.
+     * @param syncFileContents When 'true', transference of data will be started by the operation if needed and no
+     *                         conflict is detected.
      * @param context          Android context; needed to start transfers.
      */
     public SynchronizeFileOperation(
@@ -144,25 +143,21 @@ public class SynchronizeFileOperation extends SyncOperation {
 
     /**
      * Temporal constructor.
-     *
-     * Extends the previous one to allow constrained synchronizations where uploads are never
-     * performed - only downloads or conflict detection.
-     *
-     * Do not use unless you are involved in 'folder synchronization' or 'folder download' work
-     * in progress.
-     *
+     * <p>
+     * Extends the previous one to allow constrained synchronizations where uploads are never performed - only downloads
+     * or conflict detection.
+     * <p>
+     * Do not use unless you are involved in 'folder synchronization' or 'folder download' work in progress.
+     * <p>
      * TODO Remove when 'folder synchronization' replaces 'folder download'.
      *
-     * @param localFile        Data of file (just) retrieved from local cache/database.
-     *                         MUSTN't be null.
-     * @param serverFile       Data of file (just) retrieved from a remote server.
-     *                         If null, will be retrieved from network by the operation
-     *                         when executed.
+     * @param localFile        Data of file (just) retrieved from local cache/database. MUSTN't be null.
+     * @param serverFile       Data of file (just) retrieved from a remote server. If null, will be retrieved from
+     *                         network by the operation when executed.
      * @param user             Nextcloud user owning the file.
-     * @param syncFileContents When 'true', transference of data will be started by the
-     *                         operation if needed and no conflict is detected.
-     * @param allowUploads     When 'false', uploads to the server are not done;
-     *                         only downloads or conflict detection.
+     * @param syncFileContents When 'true', transference of data will be started by the operation if needed and no
+     *                         conflict is detected.
+     * @param allowUploads     When 'false', uploads to the server are not done; only downloads or conflict detection.
      * @param context          Android context; needed to start transfers.
      */
     public SynchronizeFileOperation(
@@ -214,12 +209,12 @@ public class SynchronizeFileOperation extends SyncOperation {
                 if (TextUtils.isEmpty(mLocalFile.getEtag())) {
                     // file uploaded (null) or downloaded ("") before upgrade to version 1.8.0; check the old condition
                     serverChanged = mServerFile.getModificationTimestamp() !=
-                            mLocalFile.getModificationTimestampAtLastSyncForData();
+                        mLocalFile.getModificationTimestampAtLastSyncForData();
                 } else {
                     serverChanged = !mServerFile.getEtag().equals(mLocalFile.getEtag());
                 }
                 boolean localChanged =
-                        mLocalFile.getLocalModificationTimestamp() > mLocalFile.getLastSyncDateForData();
+                    mLocalFile.getLocalModificationTimestamp() > mLocalFile.getLastSyncDateForData();
 
                 /// decide action to perform depending upon changes
                 //if (!mLocalFile.getEtag().isEmpty() && localChanged && serverChanged) {
@@ -286,7 +281,7 @@ public class SynchronizeFileOperation extends SyncOperation {
         }
 
         Log_OC.i(TAG, "Synchronizing " + mUser.getAccountName() + ", file " + mLocalFile.getRemotePath() +
-                ": " + result.getLogMessage());
+            ": " + result.getLogMessage());
 
         return result;
     }
@@ -298,13 +293,11 @@ public class SynchronizeFileOperation extends SyncOperation {
      * @param file OCFile object representing the file to upload
      */
     private void requestForUpload(OCFile file) {
-        FileUploader.uploadUpdateFile(
-            mContext,
+        FileUploadHelper.Companion.instance().uploadUpdatedFile(
             mUser,
-            file,
-            FileUploader.LOCAL_BEHAVIOUR_MOVE,
-            NameCollisionPolicy.OVERWRITE
-                                     );
+            new OCFile[]{ file },
+            FileUploadWorker.LOCAL_BEHAVIOUR_MOVE,
+            NameCollisionPolicy.OVERWRITE);
 
         mTransferWasRequested = true;
     }

+ 36 - 36
app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java

@@ -29,6 +29,7 @@ import android.text.TextUtils;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.device.BatteryStatus;
 import com.nextcloud.client.device.PowerManagementService;
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.network.Connectivity;
 import com.nextcloud.client.network.ConnectivityService;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
@@ -45,7 +46,6 @@ import com.owncloud.android.datamodel.e2e.v1.encrypted.EncryptedFile;
 import com.owncloud.android.datamodel.e2e.v1.encrypted.EncryptedFolderMetadataFileV1;
 import com.owncloud.android.datamodel.e2e.v2.decrypted.DecryptedFolderMetadataFile;
 import com.owncloud.android.db.OCUpload;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
@@ -1019,7 +1019,7 @@ public class UploadFileOperation extends SyncOperation {
 
     private RemoteOperationResult copyFile(File originalFile, String expectedPath) throws OperationCancelledException,
         IOException {
-        if (mLocalBehaviour == FileUploader.LOCAL_BEHAVIOUR_COPY && !mOriginalStoragePath.equals(expectedPath)) {
+        if (mLocalBehaviour == FilesUploadWorker.LOCAL_BEHAVIOUR_COPY && !mOriginalStoragePath.equals(expectedPath)) {
             String temporalPath = FileStorageUtils.getInternalTemporalPath(user.getAccountName(), mContext) +
                 mFile.getRemotePath();
             mFile.setStoragePath(temporalPath);
@@ -1037,18 +1037,18 @@ public class UploadFileOperation extends SyncOperation {
 
     @CheckResult
     private RemoteOperationResult checkNameCollision(OwnCloudClient client,
-                                                     List<String> fileNames,
+                                                     DecryptedFolderMetadata metadata,
                                                      boolean encrypted)
         throws OperationCancelledException {
         Log_OC.d(TAG, "Checking name collision in server");
 
-        if (existsFile(client, mRemotePath, fileNames, encrypted)) {
+        if (existsFile(client, mRemotePath, metadata, encrypted)) {
             switch (mNameCollisionPolicy) {
                 case CANCEL:
                     Log_OC.d(TAG, "File exists; canceling");
                     throw new OperationCancelledException();
                 case RENAME:
-                    mRemotePath = getNewAvailableRemotePath(client, mRemotePath, fileNames, encrypted);
+                    mRemotePath = getNewAvailableRemotePath(client, mRemotePath, metadata, encrypted);
                     mWasRenamed = true;
                     createNewOCFile(mRemotePath);
                     Log_OC.d(TAG, "File renamed as " + mRemotePath);
@@ -1077,20 +1077,20 @@ public class UploadFileOperation extends SyncOperation {
                                         File originalFile,
                                         OwnCloudClient client) {
         switch (mLocalBehaviour) {
-            case FileUploader.LOCAL_BEHAVIOUR_FORGET:
+            case FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET:
             default:
                 mFile.setStoragePath("");
                 saveUploadedFile(client);
                 break;
 
-            case FileUploader.LOCAL_BEHAVIOUR_DELETE:
+            case FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE:
                 originalFile.delete();
                 mFile.setStoragePath("");
                 getStorageManager().deleteFileInMediaScan(originalFile.getAbsolutePath());
                 saveUploadedFile(client);
                 break;
 
-            case FileUploader.LOCAL_BEHAVIOUR_COPY:
+            case FilesUploadWorker.LOCAL_BEHAVIOUR_COPY:
                 if (temporalFile != null) {
                     try {
                         move(temporalFile, expectedFile);
@@ -1111,7 +1111,7 @@ public class UploadFileOperation extends SyncOperation {
                 }
                 break;
 
-            case FileUploader.LOCAL_BEHAVIOUR_MOVE:
+            case FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE:
                 String expectedPath = FileStorageUtils.getDefaultSavePathFor(user.getAccountName(), mFile);
                 File newFile = new File(expectedPath);
 
@@ -1131,14 +1131,15 @@ public class UploadFileOperation extends SyncOperation {
     }
 
     /**
-     * Checks the existence of the folder where the current file will be uploaded both in the remote server and in the
-     * local database.
+     * Checks the existence of the folder where the current file will be uploaded both
+     * in the remote server and in the local database.
      * <p/>
-     * If the upload is set to enforce the creation of the folder, the method tries to create it both remote and
-     * locally.
+     * If the upload is set to enforce the creation of the folder, the method tries to
+     * create it both remote and locally.
      *
      * @param pathToGrant Full remote path whose existence will be granted.
-     * @return An {@link OCFile} instance corresponding to the folder where the file will be uploaded.
+     * @return An {@link OCFile} instance corresponding to the folder where the file
+     * will be uploaded.
      */
     private RemoteOperationResult grantFolderExistence(String pathToGrant, OwnCloudClient client) {
         RemoteOperation operation = new ExistenceCheckRemoteOperation(pathToGrant, false);
@@ -1164,7 +1165,7 @@ public class UploadFileOperation extends SyncOperation {
     private OCFile createLocalFolder(String remotePath) {
         String parentPath = new File(remotePath).getParent();
         parentPath = parentPath.endsWith(OCFile.PATH_SEPARATOR) ?
-            parentPath : parentPath + OCFile.PATH_SEPARATOR;
+                parentPath : parentPath + OCFile.PATH_SEPARATOR;
         OCFile parent = getStorageManager().getFileByPath(parentPath);
         if (parent == null) {
             parent = createLocalFolder(parentPath);
@@ -1194,8 +1195,8 @@ public class UploadFileOperation extends SyncOperation {
         newFile.setMimeType(mFile.getMimeType());
         newFile.setModificationTimestamp(mFile.getModificationTimestamp());
         newFile.setModificationTimestampAtLastSyncForData(
-            mFile.getModificationTimestampAtLastSyncForData()
-                                                         );
+                mFile.getModificationTimestampAtLastSyncForData()
+        );
         newFile.setEtag(mFile.getEtag());
         newFile.setLastSyncDateForProperties(mFile.getLastSyncDateForProperties());
         newFile.setLastSyncDateForData(mFile.getLastSyncDateForData());
@@ -1206,16 +1207,15 @@ public class UploadFileOperation extends SyncOperation {
     }
 
     /**
-     * Returns a new and available (does not exists on the server) remotePath. This adds an incremental suffix.
+     * Returns a new and available (does not exists on the server) remotePath.
+     * This adds an incremental suffix.
      *
      * @param client     OwnCloud client
      * @param remotePath remote path of the file
-     * @param fileNames  list of decrypted file names
+     * @param metadata   metadata of encrypted folder
      * @return new remote path
      */
-    private String getNewAvailableRemotePath(OwnCloudClient client,
-                                             String remotePath,
-                                             List<String> fileNames,
+    private String getNewAvailableRemotePath(OwnCloudClient client, String remotePath, DecryptedFolderMetadata metadata,
                                              boolean encrypted) {
         int extPos = remotePath.lastIndexOf('.');
         String suffix;
@@ -1232,22 +1232,20 @@ public class UploadFileOperation extends SyncOperation {
         do {
             suffix = " (" + count + ")";
             newPath = extPos >= 0 ? remotePathWithoutExtension + suffix + "." + extension : remotePath + suffix;
-            exists = existsFile(client, newPath, fileNames, encrypted);
+            exists = existsFile(client, newPath, metadata, encrypted);
             count++;
         } while (exists);
 
         return newPath;
     }
 
-    private boolean existsFile(OwnCloudClient client,
-                               String remotePath,
-                               List<String> fileNames,
+    private boolean existsFile(OwnCloudClient client, String remotePath, DecryptedFolderMetadata metadata,
                                boolean encrypted) {
         if (encrypted) {
             String fileName = new File(remotePath).getName();
 
-            for (String name : fileNames) {
-                if (name.equalsIgnoreCase(fileName)) {
+            for (DecryptedFolderMetadata.DecryptedFile file : metadata.getFiles().values()) {
+                if (file.getEncrypted().getFilename().equalsIgnoreCase(fileName)) {
                     return true;
                 }
             }
@@ -1261,8 +1259,9 @@ public class UploadFileOperation extends SyncOperation {
     }
 
     /**
-     * Allows to cancel the actual upload operation. If actual upload operating is in progress it is cancelled, if
-     * upload preparation is being performed upload will not take place.
+     * Allows to cancel the actual upload operation. If actual upload operating
+     * is in progress it is cancelled, if upload preparation is being performed
+     * upload will not take place.
      */
     public void cancel(ResultCode cancellationReason) {
         if (mUploadOperation == null) {
@@ -1331,7 +1330,7 @@ public class UploadFileOperation extends SyncOperation {
                     int nRead;
                     byte[] buf = new byte[4096];
                     while (!mCancellationRequested.get() &&
-                        (nRead = in.read(buf)) > -1) {
+                            (nRead = in.read(buf)) > -1) {
                         out.write(buf, 0, nRead);
                     }
                     out.flush();
@@ -1350,7 +1349,7 @@ public class UploadFileOperation extends SyncOperation {
                     }
                 } catch (Exception e) {
                     Log_OC.d(TAG, "Weird exception while closing input stream for " +
-                        mOriginalStoragePath + " (ignoring)", e);
+                            mOriginalStoragePath + " (ignoring)", e);
                 }
                 try {
                     if (out != null) {
@@ -1358,7 +1357,7 @@ public class UploadFileOperation extends SyncOperation {
                     }
                 } catch (Exception e) {
                     Log_OC.d(TAG, "Weird exception while closing output stream for " +
-                        targetFile.getAbsolutePath() + " (ignoring)", e);
+                            targetFile.getAbsolutePath() + " (ignoring)", e);
                 }
             }
         }
@@ -1413,8 +1412,9 @@ public class UploadFileOperation extends SyncOperation {
     /**
      * Saves a OC File after a successful upload.
      * <p>
-     * A PROPFIND is necessary to keep the props in the local database synchronized with the server, specially the
-     * modification time and Etag (where available)
+     * A PROPFIND is necessary to keep the props in the local database
+     * synchronized with the server, specially the modification time and Etag
+     * (where available)
      */
     private void saveUploadedFile(OwnCloudClient client) {
         OCFile file = mFile;
@@ -1469,7 +1469,7 @@ public class UploadFileOperation extends SyncOperation {
 
         // generate new Thumbnail
         final ThumbnailsCacheManager.ThumbnailGenerationTask task =
-            new ThumbnailsCacheManager.ThumbnailGenerationTask(getStorageManager(), user);
+                new ThumbnailsCacheManager.ThumbnailGenerationTask(getStorageManager(), user);
         task.execute(new ThumbnailsCacheManager.ThumbnailGenerationTaskObject(file, file.getRemoteId()));
     }
 

+ 2 - 2
app/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java

@@ -44,6 +44,7 @@ import android.widget.Toast;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.files.downloader.DownloadTask;
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.nextcloud.client.utils.HashUtil;
@@ -100,7 +101,6 @@ import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
 import static android.os.ParcelFileDescriptor.MODE_WRITE_ONLY;
 import static com.owncloud.android.datamodel.OCFile.PATH_SEPARATOR;
 import static com.owncloud.android.datamodel.OCFile.ROOT_PATH;
-import static com.owncloud.android.files.services.FileUploader.LOCAL_BEHAVIOUR_DELETE;
 
 public class DocumentsStorageProvider extends DocumentsProvider {
 
@@ -271,7 +271,7 @@ public class DocumentsStorageProvider extends DocumentsProvider {
                             context,
                             user,
                             ocFile,
-                            LOCAL_BEHAVIOUR_DELETE,
+                            FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE,
                             NameCollisionPolicy.OVERWRITE,
                             false);
                     } else {

+ 12 - 13
app/src/main/java/com/owncloud/android/ui/activity/ConflictsResolveActivity.kt

@@ -21,14 +21,15 @@ import android.content.Intent
 import android.os.Bundle
 import android.widget.Toast
 import com.nextcloud.client.account.User
-import com.nextcloud.client.files.downloader.FileDownloadHelper
+import com.nextcloud.client.jobs.download.FileDownloadHelper
+import com.nextcloud.client.jobs.upload.FileUploadHelper
+import com.nextcloud.client.jobs.upload.FileUploadWorker
 import com.nextcloud.model.HTTPStatusCodes
 import com.nextcloud.utils.extensions.getParcelableArgument
 import com.owncloud.android.R
 import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.datamodel.UploadsStorageManager
 import com.owncloud.android.db.OCUpload
-import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.files.services.NameCollisionPolicy
 import com.owncloud.android.lib.common.utils.Log_OC
 import com.owncloud.android.lib.resources.files.ReadFileRemoteOperation
@@ -51,7 +52,7 @@ class ConflictsResolveActivity : FileActivity(), OnConflictDecisionMadeListener
     private var conflictUploadId: Long = 0
     private var existingFile: OCFile? = null
     private var newFile: OCFile? = null
-    private var localBehaviour = FileUploader.LOCAL_BEHAVIOUR_FORGET
+    private var localBehaviour = FileUploadWorker.LOCAL_BEHAVIOUR_FORGET
 
     @JvmField
     var listener: OnConflictDecisionMadeListener? = null
@@ -91,25 +92,23 @@ class ConflictsResolveActivity : FileActivity(), OnConflictDecisionMadeListener
             when (decision) {
                 Decision.CANCEL -> {}
                 Decision.KEEP_LOCAL -> {
-                    FileUploader.uploadUpdateFile(
-                        baseContext,
+                    FileUploadHelper.instance().uploadUpdatedFile(
                         user,
-                        file,
+                        arrayOf(file),
                         localBehaviour,
                         NameCollisionPolicy.OVERWRITE
                     )
-                    uploadsStorageManager!!.removeUpload(upload)
+                    uploadsStorageManager?.removeUpload(upload)
                 }
 
                 Decision.KEEP_BOTH -> {
-                    FileUploader.uploadUpdateFile(
-                        baseContext,
+                    FileUploadHelper.instance().uploadUpdatedFile(
                         user,
-                        file,
+                        arrayOf(file),
                         localBehaviour,
                         NameCollisionPolicy.RENAME
                     )
-                    uploadsStorageManager!!.removeUpload(upload)
+                    uploadsStorageManager?.removeUpload(upload)
                 }
 
                 Decision.KEEP_SERVER -> if (!shouldDeleteLocal()) {
@@ -122,7 +121,7 @@ class ConflictsResolveActivity : FileActivity(), OnConflictDecisionMadeListener
                         )
                     }
                 } else {
-                    uploadsStorageManager!!.removeUpload(upload)
+                    uploadsStorageManager?.removeUpload(upload)
                 }
 
                 else -> {}
@@ -226,7 +225,7 @@ class ConflictsResolveActivity : FileActivity(), OnConflictDecisionMadeListener
      * @return whether the local version of the files is to be deleted.
      */
     private fun shouldDeleteLocal(): Boolean {
-        return localBehaviour == FileUploader.LOCAL_BEHAVIOUR_DELETE
+        return localBehaviour == FileUploadWorker.LOCAL_BEHAVIOUR_DELETE
     }
 
     companion object {

+ 26 - 35
app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -65,8 +65,10 @@ import com.nextcloud.client.core.AsyncRunner;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.editimage.EditImageActivity;
 import com.nextcloud.client.files.DeepLinkHandler;
-import com.nextcloud.client.files.downloader.FileDownloadHelper;
-import com.nextcloud.client.files.downloader.FileDownloadWorker;
+import com.nextcloud.client.jobs.download.FileDownloadHelper;
+import com.nextcloud.client.jobs.download.FileDownloadWorker;
+import com.nextcloud.client.jobs.upload.FileUploadHelper;
+import com.nextcloud.client.jobs.upload.FileUploadWorker;
 import com.nextcloud.client.media.PlayerServiceConnection;
 import com.nextcloud.client.network.ClientFactory;
 import com.nextcloud.client.network.ConnectivityService;
@@ -84,8 +86,6 @@ import com.owncloud.android.databinding.FilesBinding;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.VirtualFolderType;
-import com.owncloud.android.files.services.FileUploader;
-import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
@@ -136,7 +136,6 @@ import com.owncloud.android.utils.DataHolderUtil;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.FileSortOrder;
-import com.owncloud.android.utils.FilesUploadHelper;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.PermissionUtil;
 import com.owncloud.android.utils.PushUtils;
@@ -870,7 +869,7 @@ public class FileDisplayActivity extends FileActivity
                             return;
                         }
 
-                        requestUploadOfFilesFromFileSystem(renamedFile.getParentFile().getAbsolutePath(), new String[]{renamedFile.getAbsolutePath()}, FileUploader.LOCAL_BEHAVIOUR_DELETE);
+                        requestUploadOfFilesFromFileSystem(renamedFile.getParentFile().getAbsolutePath(), new String[]{renamedFile.getAbsolutePath()}, FileUploadWorker.LOCAL_BEHAVIOUR_DELETE);
                     }
                 }
             }, new String[]{FileOperationsHelper.createImageFile(getActivity()).getAbsolutePath()}).execute();
@@ -910,20 +909,20 @@ public class FileDisplayActivity extends FileActivity
             }
 
             int behaviour = switch (resultCode) {
-                case UploadFilesActivity.RESULT_OK_AND_MOVE -> FileUploader.LOCAL_BEHAVIOUR_MOVE;
-                case UploadFilesActivity.RESULT_OK_AND_DELETE -> FileUploader.LOCAL_BEHAVIOUR_DELETE;
-                default -> FileUploader.LOCAL_BEHAVIOUR_FORGET;
+                case UploadFilesActivity.RESULT_OK_AND_MOVE -> FileUploadWorker.LOCAL_BEHAVIOUR_MOVE;
+                case UploadFilesActivity.RESULT_OK_AND_DELETE -> FileUploadWorker.LOCAL_BEHAVIOUR_DELETE;
+                default -> FileUploadWorker.LOCAL_BEHAVIOUR_FORGET;
             };
 
-            new FilesUploadHelper().uploadNewFiles(getUser().orElseThrow(RuntimeException::new),
-                                                   filePaths,
-                                                   remotePaths,
-                                                   behaviour,
-                                                   true,
-                                                   UploadFileOperation.CREATED_BY_USER,
-                                                   false,
-                                                   false,
-                                                   NameCollisionPolicy.ASK_USER);
+            FileUploadHelper.Companion.instance().uploadNewFiles(getUser().orElseThrow(RuntimeException::new),
+                                                                 filePaths,
+                                                                 remotePaths,
+                                                                 behaviour,
+                                                                 true,
+                                                                 UploadFileOperation.CREATED_BY_USER,
+                                                                 false,
+                                                                 false,
+                                                                 NameCollisionPolicy.ASK_USER);
 
         } else {
             Log_OC.d(TAG, "User clicked on 'Update' with no selection");
@@ -945,7 +944,7 @@ public class FileDisplayActivity extends FileActivity
             streamsToUpload.add(contentIntent.getData());
         }
 
-        int behaviour = (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE) ? FileUploader.LOCAL_BEHAVIOUR_MOVE : FileUploader.LOCAL_BEHAVIOUR_COPY;
+        int behaviour = (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE) ? FileUploadWorker.LOCAL_BEHAVIOUR_MOVE : FileUploadWorker.LOCAL_BEHAVIOUR_COPY;
 
         OCFile currentDir = getCurrentDir();
         String remotePath = (currentDir != null) ? currentDir.getRemotePath() : OCFile.ROOT_PATH;
@@ -1115,7 +1114,7 @@ public class FileDisplayActivity extends FileActivity
         }
 
         // Listen for upload messages
-        IntentFilter uploadIntentFilter = new IntentFilter(FileUploader.getUploadFinishMessage());
+        IntentFilter uploadIntentFilter = new IntentFilter(FileUploadWorker.Companion.getUploadFinishMessage());
         mUploadFinishReceiver = new UploadFinishReceiver();
         localBroadcastManager.registerReceiver(mUploadFinishReceiver, uploadIntentFilter);
 
@@ -1360,21 +1359,21 @@ public class FileDisplayActivity extends FileActivity
          */
         @Override
         public void onReceive(Context context, Intent intent) {
-            String uploadedRemotePath = intent.getStringExtra(FileUploader.EXTRA_REMOTE_PATH);
-            String accountName = intent.getStringExtra(FileUploader.ACCOUNT_NAME);
+            String uploadedRemotePath = intent.getStringExtra(FileUploadWorker.EXTRA_REMOTE_PATH);
+            String accountName = intent.getStringExtra(FileUploadWorker.ACCOUNT_NAME);
             boolean sameAccount = getAccount() != null && accountName.equals(getAccount().name);
             OCFile currentDir = getCurrentDir();
             boolean isDescendant = currentDir != null && uploadedRemotePath != null && uploadedRemotePath.startsWith(currentDir.getRemotePath());
 
             if (sameAccount && isDescendant) {
-                String linkedToRemotePath = intent.getStringExtra(FileUploader.EXTRA_LINKED_TO_PATH);
+                String linkedToRemotePath = intent.getStringExtra(FileUploadWorker.EXTRA_LINKED_TO_PATH);
                 if (linkedToRemotePath == null || isAscendant(linkedToRemotePath)) {
                     updateListOfFilesFragment(false);
                 }
             }
 
-            boolean uploadWasFine = intent.getBooleanExtra(FileUploader.EXTRA_UPLOAD_RESULT, false);
-            boolean renamedInUpload = getFile().getRemotePath().equals(intent.getStringExtra(FileUploader.EXTRA_OLD_REMOTE_PATH));
+            boolean uploadWasFine = intent.getBooleanExtra(FileUploadWorker.EXTRA_UPLOAD_RESULT, false);
+            boolean renamedInUpload = getFile().getRemotePath().equals(intent.getStringExtra(FileUploadWorker.EXTRA_OLD_REMOTE_PATH));
 
             boolean sameFile = getFile().getRemotePath().equals(uploadedRemotePath) || renamedInUpload;
             Fragment details = getLeftFragment();
@@ -1568,6 +1567,8 @@ public class FileDisplayActivity extends FileActivity
             if (state instanceof WorkerState.Download) {
                 Log_OC.d(TAG, "Download worker started");
                 handleDownloadWorkerState();
+            } else if (state instanceof WorkerState.Idle) {
+                fileDownloadProgressListener = null;
             }
         });
     }
@@ -1593,13 +1594,6 @@ public class FileDisplayActivity extends FileActivity
 
         @Override
         public void onServiceConnected(ComponentName component, IBinder service) {
-            if (component.equals(new ComponentName(FileDisplayActivity.this, FileUploader.class))) {
-                Log_OC.d(TAG, "Upload service connected");
-                mUploaderBinder = (FileUploaderBinder) service;
-            } else {
-                return;
-            }
-
             // a new chance to get the mDownloadBinder through
             // getFileDownloadBinder() - THIS IS A MESS
             OCFileListFragment listOfFiles = getListOfFilesFragment();
@@ -1620,9 +1614,6 @@ public class FileDisplayActivity extends FileActivity
             if (component.equals(new ComponentName(FileDisplayActivity.this, FileDownloadWorker.class))) {
                 Log_OC.d(TAG, "Download service disconnected");
                 fileDownloadProgressListener = null;
-            } else if (component.equals(new ComponentName(FileDisplayActivity.this, FileUploader.class))) {
-                Log_OC.d(TAG, "Upload service disconnected");
-                mUploaderBinder = null;
             }
         }
     }

+ 3 - 3
app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -59,6 +59,7 @@ import android.widget.Toast;
 import com.google.android.material.button.MaterialButton;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.di.Injectable;
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.utils.extensions.BundleExtensionsKt;
 import com.nextcloud.utils.extensions.IntentExtensionsKt;
@@ -68,7 +69,6 @@ import com.owncloud.android.databinding.ReceiveExternalFilesBinding;
 import com.owncloud.android.databinding.UploadFileDialogBinding;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.SyncedFolderProvider;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -889,7 +889,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
             getUser().orElseThrow(RuntimeException::new),
             new String[]{ tmpName },
             new String[]{ mFile.getRemotePath() + filename},
-            FileUploader.LOCAL_BEHAVIOUR_COPY,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_COPY,
             true,
             UploadFileOperation.CREATED_BY_USER,
             false,
@@ -906,7 +906,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
             mStreamsToUpload,
             mUploadPath,
             getUser().orElseThrow(RuntimeException::new),
-            FileUploader.LOCAL_BEHAVIOUR_DELETE,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE,
             true, // Show waiting dialog while file is being copied from private storage
             this  // Copy temp task listener
         );

+ 3 - 3
app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt

@@ -41,6 +41,7 @@ import com.nextcloud.client.core.Clock
 import com.nextcloud.client.device.PowerManagementService
 import com.nextcloud.client.di.Injectable
 import com.nextcloud.client.jobs.BackgroundJobManager
+import com.nextcloud.client.jobs.FilesUploadWorker
 import com.nextcloud.client.jobs.MediaFoldersDetectionWork
 import com.nextcloud.client.jobs.NotificationWork
 import com.nextcloud.client.preferences.AppPreferences
@@ -58,7 +59,6 @@ import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.datamodel.SyncedFolder
 import com.owncloud.android.datamodel.SyncedFolderDisplayItem
 import com.owncloud.android.datamodel.SyncedFolderProvider
-import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.files.services.NameCollisionPolicy
 import com.owncloud.android.lib.common.utils.Log_OC
 import com.owncloud.android.ui.adapter.SyncedFolderAdapter
@@ -453,7 +453,7 @@ class SyncedFoldersActivity :
             true,
             false,
             account.name,
-            FileUploader.LOCAL_BEHAVIOUR_FORGET,
+            FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET,
             NameCollisionPolicy.ASK_USER.serialize(),
             false,
             clock.currentTime,
@@ -547,7 +547,7 @@ class SyncedFoldersActivity :
                         true,
                         false,
                         account.name,
-                        FileUploader.LOCAL_BEHAVIOUR_FORGET,
+                        FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET,
                         NameCollisionPolicy.ASK_USER.serialize(),
                         false,
                         clock.currentTime,

+ 2 - 2
app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java

@@ -37,10 +37,10 @@ import android.widget.TextView;
 
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.di.Injectable;
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.UploadFilesLayoutBinding;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.adapter.StoragePathAdapter;
 import com.owncloud.android.ui.asynctasks.CheckAvailableSpaceTask;
@@ -499,7 +499,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
                 data.putExtra(EXTRA_CHOSEN_FILES, new String[]{filesToUpload[0]});
                 setResult(RESULT_OK_AND_DELETE, data);
 
-                preferences.setUploaderBehaviour(FileUploader.LOCAL_BEHAVIOUR_DELETE);
+                preferences.setUploaderBehaviour(FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE);
             } else {
                 data.putExtra(EXTRA_CHOSEN_FILES, mFileListFragment.getCheckedFilePaths());
                 data.putExtra(LOCAL_BASE_PATH, mCurrentDir.getAbsolutePath());

+ 0 - 1
app/src/main/java/com/owncloud/android/ui/asynctasks/CopyAndUploadContentUrisTask.java

@@ -31,7 +31,6 @@ import android.widget.Toast;
 
 import com.nextcloud.client.account.User;
 import com.owncloud.android.R;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.lib.common.utils.Log_OC;

+ 7 - 7
app/src/main/java/com/owncloud/android/ui/dialog/parcel/SyncedFolderParcelable.java

@@ -23,10 +23,10 @@ package com.owncloud.android.ui.dialog.parcel;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.preferences.SubFolderRule;
 import com.owncloud.android.datamodel.MediaFolderType;
 import com.owncloud.android.datamodel.SyncedFolderDisplayItem;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 
 /**
@@ -134,11 +134,11 @@ public class SyncedFolderParcelable implements Parcelable {
 
     public Integer getUploadActionInteger() {
         switch (uploadAction) {
-            case FileUploader.LOCAL_BEHAVIOUR_FORGET:
+            case FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET:
                 return 0;
-            case FileUploader.LOCAL_BEHAVIOUR_MOVE:
+            case FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE:
                 return 1;
-            case FileUploader.LOCAL_BEHAVIOUR_DELETE:
+            case FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE:
                 return 2;
         }
         return 0;
@@ -147,13 +147,13 @@ public class SyncedFolderParcelable implements Parcelable {
     public void setUploadAction(String uploadAction) {
         switch (uploadAction) {
             case "LOCAL_BEHAVIOUR_FORGET":
-                this.uploadAction = FileUploader.LOCAL_BEHAVIOUR_FORGET;
+                this.uploadAction = FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET;
                 break;
             case "LOCAL_BEHAVIOUR_MOVE":
-                this.uploadAction = FileUploader.LOCAL_BEHAVIOUR_MOVE;
+                this.uploadAction = FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE;
                 break;
             case "LOCAL_BEHAVIOUR_DELETE":
-                this.uploadAction = FileUploader.LOCAL_BEHAVIOUR_DELETE;
+                this.uploadAction = FilesUploadWorker.LOCAL_BEHAVIOUR_DELETE;
                 break;
             default:
                 // do nothing

+ 0 - 3
app/src/main/java/com/owncloud/android/utils/FilesUploadHelper.kt

@@ -22,15 +22,12 @@
 
 package com.owncloud.android.utils
 
-import android.content.Context
-import android.content.Intent
 import com.nextcloud.client.account.User
 import com.nextcloud.client.jobs.BackgroundJobManager
 import com.owncloud.android.MainApp
 import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.datamodel.UploadsStorageManager
 import com.owncloud.android.db.OCUpload
-import com.owncloud.android.files.services.FileUploader
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder
 import com.owncloud.android.files.services.NameCollisionPolicy
 import com.owncloud.android.lib.common.network.OnDatatransferProgressListener

+ 1 - 1
app/src/main/res/values/setup.xml

@@ -89,7 +89,7 @@
     <string name="syncedFolder_remote_folder">@string/auto_upload_path</string>
     <bool name="syncedFolder_light_on_charging">false</bool>
     <bool name="syncedFolder_light_use_subfolders">false</bool>
-    <string name="syncedFolder_light_upload_behaviour">FileUploader.LOCAL_BEHAVIOUR_FORGET</string>
+    <string name="syncedFolder_light_upload_behaviour">FilesUploadWorker.LOCAL_BEHAVIOUR_FORGET</string>
 
     <!--Destination mail for sending log files -->
     <string name="mail_logger"></string>

+ 2 - 2
app/src/test/java/com/owncloud/android/ui/activity/SyncedFoldersActivityTest.java

@@ -22,10 +22,10 @@
 
 package com.owncloud.android.ui.activity;
 
+import com.nextcloud.client.jobs.FilesUploadWorker;
 import com.nextcloud.client.preferences.SubFolderRule;
 import com.owncloud.android.datamodel.MediaFolderType;
 import com.owncloud.android.datamodel.SyncedFolderDisplayItem;
-import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.NameCollisionPolicy;
 
 import org.junit.Test;
@@ -169,7 +169,7 @@ public class SyncedFoldersActivityTest {
                                            true,
                                            true,
                                            "test@nextcloud.com",
-                                           FileUploader.LOCAL_BEHAVIOUR_MOVE,
+                                           FilesUploadWorker.LOCAL_BEHAVIOUR_MOVE,
                                            NameCollisionPolicy.ASK_USER.serialize(),
                                            enabled,
                                            System.currentTimeMillis(),