Bladeren bron

FilesUploadWorker: correctly handle account for uploads

Previous logic would only use the current account, disregarding and/or removing uploads started by other accounts

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
Álvaro Brey 2 jaren geleden
bovenliggende
commit
ef0537c52c

+ 4 - 0
app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt

@@ -35,6 +35,7 @@ import androidx.work.Operation
 import androidx.work.PeriodicWorkRequest
 import androidx.work.WorkInfo
 import androidx.work.WorkManager
+import androidx.work.workDataOf
 import com.nextcloud.client.account.User
 import com.nextcloud.client.core.Clock
 import com.owncloud.android.datamodel.OCFile
@@ -448,7 +449,10 @@ internal class BackgroundJobManagerImpl(
     }
 
     override fun startFilesUploadJob(user: User) {
+        val data = workDataOf(FilesUploadWorker.ACCOUNT to user.accountName)
+
         val request = oneTimeRequestBuilder(FilesUploadWorker::class, JOB_FILES_UPLOAD, user)
+            .setInputData(data)
             .build()
 
         workManager.enqueue(request)

+ 21 - 12
app/src/main/java/com/nextcloud/client/jobs/FilesUploadWorker.kt

@@ -27,6 +27,7 @@ import android.app.PendingIntent
 import android.content.Context
 import android.content.Intent
 import android.os.Build
+import android.text.TextUtils
 import androidx.core.app.NotificationCompat
 import androidx.localbroadcastmanager.content.LocalBroadcastManager
 import androidx.work.Worker
@@ -64,18 +65,24 @@ class FilesUploadWorker(
     val context: Context,
     params: WorkerParameters
 ) : Worker(context, params), OnDatatransferProgressListener {
-    var lastPercent = 0
-    val notificationBuilder: NotificationCompat.Builder =
+    private var lastPercent = 0
+    private val notificationBuilder: NotificationCompat.Builder =
         NotificationUtils.newNotificationBuilder(context, viewThemeUtils)
-    val notificationManager: NotificationManager =
+    private val notificationManager: NotificationManager =
         context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
-    val fileUploaderDelegate = FileUploaderDelegate()
+    private val fileUploaderDelegate = FileUploaderDelegate()
 
     override fun doWork(): Result {
+        val accountName = inputData.getString(ACCOUNT)
+        if (TextUtils.isEmpty(accountName)) {
+            return Result.failure() // user account is needed
+        }
+
+        val user = userAccountManager.getUser(accountName)
+
         // get all pending uploads
-        for (upload in uploadsStorageManager.currentAndPendingUploadsForCurrentAccount) {
+        for (upload in uploadsStorageManager.getCurrentAndPendingUploadsForAccount(accountName!!)) {
             // create upload file operation
-            val user = userAccountManager.getUser(upload.accountName)
             if (user.isPresent) {
                 val uploadFileOperation = createUploadFileOperation(upload, user.get())
 
@@ -89,6 +96,7 @@ class FilesUploadWorker(
                     localBroadcastManager
                 )
             } else {
+                // user not present anymore, remove upload
                 uploadsStorageManager.removeUpload(upload.uploadId)
             }
         }
@@ -197,12 +205,6 @@ class FilesUploadWorker(
         // TODO generalize for automated uploads
     }
 
-    companion object {
-        val TAG: String = FilesUploadWorker::class.java.simpleName
-        const val FOREGROUND_SERVICE_ID: Int = 412
-        const val MAX_PROGRESS: Int = 100
-    }
-
     /**
      * see [com.owncloud.android.files.services.FileUploader.onTransferProgress]
      */
@@ -223,4 +225,11 @@ class FilesUploadWorker(
         }
         lastPercent = percent
     }
+
+    companion object {
+        val TAG: String = FilesUploadWorker::class.java.simpleName
+        const val FOREGROUND_SERVICE_ID: Int = 412
+        const val MAX_PROGRESS: Int = 100
+        const val ACCOUNT = "data_account"
+    }
 }

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

@@ -45,6 +45,7 @@ import java.util.Calendar;
 import java.util.Locale;
 import java.util.Observable;
 
+import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 
@@ -428,17 +429,21 @@ public class UploadsStorageManager extends Observable {
     public OCUpload[] getCurrentAndPendingUploadsForCurrentAccount() {
         User user = currentAccountProvider.getUser();
 
+        return getCurrentAndPendingUploadsForAccount(user.getAccountName());
+    }
+
+    public OCUpload[] getCurrentAndPendingUploadsForAccount(final @NonNull String accountName) {
         return getUploads(ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_IN_PROGRESS.value +
-                        " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
-                        "==" + UploadResult.DELAYED_FOR_WIFI.getValue() +
-                        " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
-                        "==" + UploadResult.LOCK_FAILED.getValue() +
-                        " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
-                        "==" + UploadResult.DELAYED_FOR_CHARGING.getValue() +
-                        " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
-                        "==" + UploadResult.DELAYED_IN_POWER_SAVE_MODE.getValue() +
-                        " AND " + ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?",
-                        user.getAccountName());
+                              " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
+                              "==" + UploadResult.DELAYED_FOR_WIFI.getValue() +
+                              " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
+                              "==" + UploadResult.LOCK_FAILED.getValue() +
+                              " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
+                              "==" + UploadResult.DELAYED_FOR_CHARGING.getValue() +
+                              " OR " + ProviderTableMeta.UPLOADS_LAST_RESULT +
+                              "==" + UploadResult.DELAYED_IN_POWER_SAVE_MODE.getValue() +
+                              " AND " + ProviderTableMeta.UPLOADS_ACCOUNT_NAME + "== ?",
+                          accountName);
     }
 
     /**