diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt index 030359d57e31..eca99280e462 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt @@ -145,9 +145,11 @@ interface BackgroundJobManager { fun startAlbumFilesUploadJob(user: User, uploadIds: LongArray, albumName: String) fun getFileUploads(user: User): LiveData> fun cancelFilesUploadJob(user: User) + fun isAutoUploadScheduled(syncedFolderID: Long): Boolean fun isStartFileUploadJobScheduled(accountName: String): Boolean fun isAutoUploadIgnoringPowerSavingScheduled(syncedFolderID: Long): Boolean fun schedulePeriodicAutoUpload() + fun cancelEnqueuedAutoUploads() fun cancelFilesDownloadJob(accountName: String, fileId: Long) @Suppress("LongParameterList") diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt index 12b6ffc52ced..8058bcc435d3 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt @@ -492,12 +492,24 @@ internal class BackgroundJobManagerImpl( private fun autoUploadWorkName(syncedFolderID: Long): String = JOB_IMMEDIATE_FILES_SYNC + "_" + syncedFolderID + override fun isAutoUploadScheduled(syncedFolderID: Long): Boolean = + workManager.getWorkInfosForUniqueWork(autoUploadWorkName(syncedFolderID)) + .get() + .any { !it.state.isFinished } + private fun autoUploadIgnorePowerSavingTag(syncedFolderID: Long): String = autoUploadWorkName(syncedFolderID) + "_" + TAG_SUFFIX_IGNORE_POWER_SAVING override fun isAutoUploadIgnoringPowerSavingScheduled(syncedFolderID: Long): Boolean = workManager.isWorkScheduled(autoUploadIgnorePowerSavingTag(syncedFolderID)) + override fun cancelEnqueuedAutoUploads() { + workManager.getWorkInfosByTag(formatClassTag(AutoUploadWorker::class)) + .get() + .filter { it.state == WorkInfo.State.ENQUEUED && it.periodicityInfo != null } + .forEach { workManager.cancelWorkById(it.id) } + } + override fun schedulePeriodicAutoUpload() { val request = periodicRequestBuilder( jobClass = AutoUploadRescanWorker::class, diff --git a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadRescanWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadRescanWorker.kt index a512a6102ae2..4ac19f358735 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadRescanWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadRescanWorker.kt @@ -29,10 +29,13 @@ class AutoUploadRescanWorker( } override suspend fun doWork(): Result = withContext(Dispatchers.IO) { - val requestedFolders = FilesSyncHelper.startAutoUploadForEnabledSyncedFolders( + // cancel enqueued ones so that we can re-start. Some workers may stuck + // thus we need to have clean start. + backgroundJobManager.cancelEnqueuedAutoUploads() + + val requestedFolders = FilesSyncHelper.startAutoUploadForEnabledSyncedFoldersIfNotActive( syncedFolderProvider, - backgroundJobManager, - false + backgroundJobManager ) Log_OC.d(TAG, "requested auto upload for $requestedFolders folder(s)") diff --git a/app/src/main/java/com/owncloud/android/utils/FilesSyncHelper.kt b/app/src/main/java/com/owncloud/android/utils/FilesSyncHelper.kt index 673040d0b65b..de00fd8401db 100644 --- a/app/src/main/java/com/owncloud/android/utils/FilesSyncHelper.kt +++ b/app/src/main/java/com/owncloud/android/utils/FilesSyncHelper.kt @@ -41,6 +41,20 @@ object FilesSyncHelper { ) } + fun startAutoUploadForEnabledSyncedFoldersIfNotActive( + provider: SyncedFolderProvider, + manager: BackgroundJobManager + ): Int { + val startedFolders = provider.syncedFolders + .filter { it.isEnabled } + .filterNot { manager.isAutoUploadScheduled(it.id) } + .onEach { manager.startAutoUpload(it) } + + Log_OC.d(TAG, "start auto upload for ${startedFolders.size} not already active folder(s)") + + return startedFolders.size + } + @JvmStatic fun startAutoUploadForEnabledSyncedFolders( provider: SyncedFolderProvider,