Răsfoiți Sursa

Stop background job when cancelling two-way sync

Signed-off-by: ZetaTom <70907959+ZetaTom@users.noreply.github.com>
ZetaTom 7 luni în urmă
părinte
comite
b3845560a0

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

@@ -130,6 +130,11 @@ interface BackgroundJobManager {
         changedFiles: Array<String> = arrayOf<String>()
     )
 
+    /**
+     * Cancel two-way sync. Existing tasks might finish, but no new invocations will occur.
+     */
+    fun cancelTwoWaySyncJob(user: User)
+
     fun scheduleOfflineSync()
 
     fun scheduleMediaFoldersDetectionJob()

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

@@ -503,6 +503,10 @@ internal class BackgroundJobManagerImpl(
         )
     }
 
+    override fun cancelTwoWaySyncJob(user: User) {
+        workManager.cancelJob(JOB_INTERNAL_TWO_WAY_SYNC, user)
+    }
+
     override fun scheduleOfflineSync() {
         val constrains = Constraints.Builder()
             .setRequiredNetworkType(NetworkType.UNMETERED)

+ 13 - 0
app/src/main/java/com/nextcloud/client/jobs/InternalTwoWaySyncWork.kt

@@ -29,6 +29,8 @@ class InternalTwoWaySyncWork(
     private val powerManagementService: PowerManagementService,
     private val connectivityService: ConnectivityService
 ) : Worker(context, params) {
+    private var shouldRun = true
+
     override fun doWork(): Result {
         Log_OC.d(TAG, "Worker started!")
 
@@ -50,6 +52,11 @@ class InternalTwoWaySyncWork(
             val folders = fileDataStorageManager.getInternalTwoWaySyncFolders(user)
 
             for (folder in folders) {
+                if (!shouldRun) {
+                    Log_OC.d(TAG, "Worker was stopped!")
+                    return Result.failure()
+                }
+
                 checkFreeSpace(folder)?.let { checkFreeSpaceResult ->
                     return checkFreeSpaceResult
                 }
@@ -90,6 +97,12 @@ class InternalTwoWaySyncWork(
         }
     }
 
+    override fun onStopped() {
+        Log_OC.d(TAG, "OnStopped of worker called!")
+        shouldRun = false
+        super.onStopped()
+    }
+
     @Suppress("TooGenericExceptionCaught")
     private fun checkFreeSpace(folder: OCFile): Result? {
         val storagePath = folder.storagePath ?: MainApp.getStoragePath()

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

@@ -96,6 +96,9 @@ class InternalTwoWaySyncActivity : DrawerActivity(), Injectable {
      */
     private fun removeAllFolders() {
         CoroutineScope(Dispatchers.Main).launch {
+            // cancel main worker
+            backgroundJobManager.cancelTwoWaySyncJob(user.get())
+
             val folders = fileDataStorageManager.getInternalTwoWaySyncFolders(user.get())
             folders.forEach { folder ->
                 // update database to ignore folder