Эх сурвалжийг харах

Use unique tag for all download type to fix sync problems

Signed-off-by: alperozturk <alper_ozturk@proton.me>
alperozturk 1 жил өмнө
parent
commit
4a5d75a325

+ 12 - 12
app/src/main/java/com/nextcloud/client/files/downloader/FileDownloadHelper.kt

@@ -62,23 +62,15 @@ class FileDownloadHelper {
             return false
         }
 
-        return FileDownloadWorker.isFileInQueue(user, file) ||
-            (file.isFolder && backgroundJobManager.isStartFileDownloadJobScheduled(user, file))
+        return backgroundJobManager.isStartFileDownloadJobScheduled(user, file.fileId) ||
+            backgroundJobManager.isStartFileDownloadJobScheduled(user, file.parentId)
     }
 
     fun cancelPendingOrCurrentDownloads(user: User?, file: OCFile?) {
         if (user == null || file == null) return
 
         sendCancelEvent(user, file)
-        backgroundJobManager.cancelFilesDownloadJob(user, file)
-    }
-
-    private fun sendCancelEvent(user: User, file: OCFile) {
-        val intent = Intent(FileDownloadWorker.CANCEL_EVENT).apply {
-            putExtra(FileDownloadWorker.EVENT_ACCOUNT_NAME, user.accountName)
-            putExtra(FileDownloadWorker.EVENT_FILE_ID, file.fileId)
-        }
-        LocalBroadcastManager.getInstance(MainApp.getAppContext()).sendBroadcast(intent)
+        backgroundJobManager.cancelFilesDownloadJob(user, file.fileId)
     }
 
     fun cancelAllDownloadsForAccount(accountName: String?, currentDownload: DownloadFileOperation?) {
@@ -93,7 +85,15 @@ class FileDownloadHelper {
 
         currentDownload.cancel()
         sendCancelEvent(currentUser, currentFile)
-        backgroundJobManager.cancelFilesDownloadJob(currentUser, currentFile)
+        backgroundJobManager.cancelFilesDownloadJob(currentUser, currentFile.fileId)
+    }
+
+    private fun sendCancelEvent(user: User, file: OCFile) {
+        val intent = Intent(FileDownloadWorker.CANCEL_EVENT).apply {
+            putExtra(FileDownloadWorker.EVENT_ACCOUNT_NAME, user.accountName)
+            putExtra(FileDownloadWorker.EVENT_FILE_ID, file.fileId)
+        }
+        LocalBroadcastManager.getInstance(MainApp.getAppContext()).sendBroadcast(intent)
     }
 
     fun saveFile(

+ 3 - 14
app/src/main/java/com/nextcloud/client/files/downloader/FileDownloadWorker.kt

@@ -68,10 +68,6 @@ class FileDownloadWorker(
     companion object {
         private val TAG = FileDownloadWorker::class.java.simpleName
 
-        private var currentDownload: DownloadFileOperation? = null
-        private var pendingDownloadFileIds: ArrayList<Pair<String?, Long>> = arrayListOf()
-        private val lock = Any()
-
         const val CANCEL_EVENT = "CANCEL_EVENT"
         const val EVENT_ACCOUNT_NAME = "EVENT_ACCOUNT_NAME"
         const val EVENT_FILE_ID = "EVENT_FILE_ID"
@@ -92,12 +88,6 @@ class FileDownloadWorker(
         const val EXTRA_LINKED_TO_PATH = "EXTRA_LINKED_TO_PATH"
         const val EXTRA_ACCOUNT_NAME = "EXTRA_ACCOUNT_NAME"
 
-        fun isFileInQueue(user: User, file: OCFile): Boolean {
-            synchronized(lock) {
-                return pendingDownloadFileIds.contains(Pair(user.accountName, file.fileId))
-            }
-        }
-
         fun getDownloadAddedMessage(): String {
             return FileDownloadWorker::class.java.name + "DOWNLOAD_ADDED"
         }
@@ -107,6 +97,7 @@ class FileDownloadWorker(
         }
     }
 
+    private var currentDownload: DownloadFileOperation? = null
     private val pendingDownloads = IndexedForest<DownloadFileOperation>()
 
     private var conflictUploadId: Long? = null
@@ -192,7 +183,7 @@ class FileDownloadWorker(
             val (accountName, fileId) = getEventPair(intent) ?: return
 
             pendingDownloads.all.forEach {
-                it.value.payload?.cancel(accountName, fileId)
+                it.value.payload?.cancelMatchingOperation(accountName, fileId)
             }
         }
     }
@@ -200,7 +191,6 @@ class FileDownloadWorker(
     private fun cancelAllDownloads() {
         pendingDownloads.all.forEach {
             it.value.payload?.cancel()
-            pendingDownloadFileIds.remove(Pair(it.value.payload?.user?.accountName, it.value.payload?.file?.fileId))
         }
     }
 
@@ -254,7 +244,6 @@ class FileDownloadWorker(
                     file.remotePath,
                     operation
                 )
-                pendingDownloadFileIds.add(Pair(user?.accountName, file.fileId))
 
                 if (downloadKey != null) {
                     requestedDownloads.add(downloadKey)
@@ -290,6 +279,7 @@ class FileDownloadWorker(
 
         if (filesPathList != null) {
             filesPathList.forEach {
+                // FIXME Check if folder content not exist, DownloadFileOperation will not download via content
                 fileDataStorageManager?.getFileByEncryptedRemotePath(it)?.let { file ->
                     result.add(file)
                 }
@@ -403,7 +393,6 @@ class FileDownloadWorker(
             currentDownload?.user?.accountName,
             currentDownload?.remotePath
         )
-        pendingDownloadFileIds.remove(Pair(currentDownload?.user?.accountName, currentDownload?.file?.fileId))
 
         val downloadResult = result ?: RemoteOperationResult<Any?>(RuntimeException("Error downloading…"))
 

+ 2 - 2
app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt

@@ -145,9 +145,9 @@ interface BackgroundJobManager {
     fun getFileUploads(user: User): LiveData<List<JobInfo>>
     fun cancelFilesUploadJob(user: User)
 
-    fun cancelFilesDownloadJob(user: User, ocFile: OCFile)
+    fun cancelFilesDownloadJob(user: User, fileId: Long)
 
-    fun isStartFileDownloadJobScheduled(user: User, ocFile: OCFile): Boolean
+    fun isStartFileDownloadJobScheduled(user: User, fileId: Long): Boolean
 
     @Suppress("LongParameterList")
     fun startFileDownloadJob(

+ 9 - 13
app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt

@@ -509,16 +509,12 @@ internal class BackgroundJobManagerImpl(
         workManager.enqueueUniqueWork(JOB_FILES_UPLOAD + user.accountName, ExistingWorkPolicy.KEEP, request)
     }
 
-    private fun startFileDownloadJobTag(user: User, ocFile: OCFile): String {
-        return if (ocFile.isFolder) {
-            JOB_FOLDER_DOWNLOAD + user.accountName + ocFile.fileId
-        } else {
-            JOB_FILES_DOWNLOAD + user.accountName
-        }
+    private fun startFileDownloadJobTag(user: User, fileId: Long): String {
+        return JOB_FOLDER_DOWNLOAD + user.accountName + fileId
     }
 
-    override fun isStartFileDownloadJobScheduled(user: User, ocFile: OCFile): Boolean {
-        return workManager.isWorkScheduled(startFileDownloadJobTag(user, ocFile))
+    override fun isStartFileDownloadJobScheduled(user: User, fileId: Long): Boolean {
+        return workManager.isWorkScheduled(startFileDownloadJobTag(user, fileId))
     }
 
     override fun startFolderDownloadJob(folder: OCFile, user: User, filesPath: List<String>) {
@@ -529,7 +525,7 @@ internal class BackgroundJobManagerImpl(
             FileDownloadWorker.DOWNLOAD_TYPE to DownloadType.DOWNLOAD.toString()
         )
 
-        val tag = startFileDownloadJobTag(user, folder)
+        val tag = startFileDownloadJobTag(user, folder.fileId)
 
         val request = oneTimeRequestBuilder(FileDownloadWorker::class, JOB_FILES_DOWNLOAD, user)
             .addTag(tag)
@@ -549,7 +545,7 @@ internal class BackgroundJobManagerImpl(
         packageName: String,
         conflictUploadId: Long?
     ) {
-        val tag = startFileDownloadJobTag(user, file)
+        val tag = startFileDownloadJobTag(user, file.fileId)
 
         val data = workDataOf(
             FileDownloadWorker.ACCOUNT_NAME to user.accountName,
@@ -566,7 +562,7 @@ internal class BackgroundJobManagerImpl(
             .setInputData(data)
             .build()
 
-        workManager.enqueueUniqueWork(tag, ExistingWorkPolicy.APPEND, request)
+        workManager.enqueueUniqueWork(tag, ExistingWorkPolicy.REPLACE, request)
     }
 
     override fun getFileUploads(user: User): LiveData<List<JobInfo>> {
@@ -578,8 +574,8 @@ internal class BackgroundJobManagerImpl(
         workManager.cancelJob(JOB_FILES_UPLOAD, user)
     }
 
-    override fun cancelFilesDownloadJob(user: User, ocFile: OCFile) {
-        workManager.cancelAllWorkByTag(startFileDownloadJobTag(user, ocFile))
+    override fun cancelFilesDownloadJob(user: User, fileId: Long) {
+        workManager.cancelAllWorkByTag(startFileDownloadJobTag(user, fileId))
     }
 
     override fun startPdfGenerateAndUploadWork(

+ 1 - 1
app/src/main/java/com/owncloud/android/operations/DownloadFileOperation.java

@@ -99,7 +99,7 @@ public class DownloadFileOperation extends RemoteOperation {
         this(user, file, null, null, null, context, DownloadType.DOWNLOAD);
     }
 
-    public void cancel(String accountName, long fileId) {
+    public void cancelMatchingOperation(String accountName, long fileId) {
         if (getFile().getFileId() == fileId && getUser().getAccountName().equals(accountName)) {
             cancel();
         }

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

@@ -287,7 +287,7 @@ public class FileDisplayActivity extends FileActivity
         checkStoragePath();
 
         initSyncBroadcastReceiver();
-        observeDownloadWorkerState();
+        observeWorkerState();
     }
 
     @SuppressWarnings("unchecked")
@@ -1562,7 +1562,7 @@ public class FileDisplayActivity extends FileActivity
         return isRoot(getCurrentDir());
     }
 
-    private void observeDownloadWorkerState() {
+    private void observeWorkerState() {
         WorkerStateLiveData.Companion.instance().observe(this, state -> {
             if (state instanceof WorkerState.Download) {
                 Log_OC.d(TAG, "Download worker started");