Skip to content

Commit 11f4710

Browse files
committed
instead of using random minutes to prevent sync now use worker
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 433c91c commit 11f4710

9 files changed

Lines changed: 48 additions & 16 deletions

File tree

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,13 @@ interface BackgroundJobManager {
3535
*
3636
* This call is idempotent - there will be only one scheduled job
3737
* regardless of number of calls.
38+
*
39+
* @param overridePowerSaving lets the triggered sync run even while the device is in power saving mode.
40+
* The worker reschedules itself without the override afterwards, so it applies to a single run.
3841
*/
39-
fun scheduleContentObserverJob()
42+
fun scheduleContentObserverJob(overridePowerSaving: Boolean = false)
4043

41-
fun isContentObserverJobScheduled(): Boolean
44+
fun isContentObserverRunning(): Boolean
4245

4346
/**
4447
* Schedule periodic contacts backups job. Operating system will

app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import com.nextcloud.client.jobs.upload.FileUploadHelper
3737
import com.nextcloud.client.jobs.upload.FileUploadWorker
3838
import com.nextcloud.client.jobs.worker.WorkerFilesPayload
3939
import com.nextcloud.client.preferences.AppPreferences
40-
import com.nextcloud.utils.extensions.isUniqueWorkScheduled
40+
import com.nextcloud.utils.extensions.isUniqueWorkRunning
4141
import com.nextcloud.utils.extensions.isWorkScheduled
4242
import com.owncloud.android.datamodel.OCFile
4343
import com.owncloud.android.datamodel.SyncedFolder
@@ -467,7 +467,11 @@ internal class BackgroundJobManagerImpl(
467467
}
468468

469469
@Suppress("MagicNumber")
470-
override fun scheduleContentObserverJob() {
470+
override fun scheduleContentObserverJob(overridePowerSaving: Boolean) {
471+
val arguments = Data.Builder()
472+
.putBoolean(ContentObserverWork.OVERRIDE_POWER_SAVING, overridePowerSaving)
473+
.build()
474+
471475
val constrains = Constraints.Builder()
472476
.addContentUriTrigger(MediaStore.Images.Media.INTERNAL_CONTENT_URI, true)
473477
.addContentUriTrigger(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true)
@@ -480,12 +484,13 @@ internal class BackgroundJobManagerImpl(
480484

481485
val request = oneTimeRequestBuilder(ContentObserverWork::class, JOB_CONTENT_OBSERVER)
482486
.setConstraints(constrains)
487+
.setInputData(arguments)
483488
.build()
484489

485490
workManager.enqueueUniqueWork(JOB_CONTENT_OBSERVER, ExistingWorkPolicy.REPLACE, request)
486491
}
487492

488-
override fun isContentObserverJobScheduled(): Boolean = workManager.isUniqueWorkScheduled(JOB_CONTENT_OBSERVER)
493+
override fun isContentObserverRunning(): Boolean = workManager.isUniqueWorkRunning(JOB_CONTENT_OBSERVER)
489494

490495
private fun autoUploadWorkName(syncedFolderID: Long): String = JOB_IMMEDIATE_FILES_SYNC + "_" + syncedFolderID
491496

app/src/main/java/com/nextcloud/client/jobs/ContentObserverWork.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import androidx.work.CoroutineWorker
1212
import androidx.work.WorkerParameters
1313
import com.nextcloud.client.device.PowerManagementService
1414
import com.nextcloud.client.jobs.autoUpload.AutoUploadHelper
15+
import com.nextcloud.client.jobs.autoUpload.AutoUploadWorker
1516
import com.owncloud.android.datamodel.SyncedFolderProvider
1617
import com.owncloud.android.lib.common.utils.Log_OC
1718
import com.owncloud.android.utils.FilesSyncHelper
@@ -36,12 +37,16 @@ class ContentObserverWork(
3637

3738
companion object {
3839
private const val TAG = "🔍" + "ContentObserverWork"
40+
const val OVERRIDE_POWER_SAVING = "overridePowerSaving"
3941
}
4042

43+
private val overridePowerSaving: Boolean
44+
get() = inputData.getBoolean(OVERRIDE_POWER_SAVING, false)
45+
4146
override suspend fun doWork(): Result = withContext(Dispatchers.IO) {
4247
val workerName = BackgroundJobManagerImpl.formatClassTag(this@ContentObserverWork::class)
4348
backgroundJobManager.logStartOfWorker(workerName)
44-
Log_OC.d(TAG, "started")
49+
Log_OC.d(TAG, "started - override power saving: $overridePowerSaving")
4550

4651
try {
4752
if (params.triggeredContentUris.isNotEmpty()) {
@@ -72,7 +77,7 @@ class ContentObserverWork(
7277
}
7378

7479
private suspend fun checkAndTriggerAutoUpload() = withContext(Dispatchers.IO) {
75-
if (powerManagementService.isPowerSavingEnabled) {
80+
if (powerManagementService.isPowerSavingEnabled && !overridePowerSaving) {
7681
Log_OC.w(TAG, "⚡ Power saving mode active — skipping file sync.")
7782
return@withContext
7883
}
@@ -116,7 +121,7 @@ class ContentObserverWork(
116121
FilesSyncHelper.startAutoUploadForEnabledSyncedFolders(
117122
syncedFolderProvider,
118123
backgroundJobManager,
119-
false
124+
overridePowerSaving
120125
)
121126
Log_OC.d(TAG, "✅ auto upload triggered successfully for ${contentUris.size} file(s).")
122127
} catch (e: Exception) {

app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadWorker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class AutoUploadWorker(
103103
}
104104

105105
if (powerManagementService.isPowerSavingEnabled) {
106-
Log_OC.w(TAG, "power saving mode enabled")
106+
Log_OC.w(TAG, "power saving mode enabled - override power saving: $overridePowerSaving")
107107
}
108108

109109
// insert entries based on selected local storage path

app/src/main/java/com/nextcloud/ui/component/UploadWarningCard.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ class UploadWarningCard(
120120
private fun startAutoUploadIgnoringBatterySaver(view: View) {
121121
scope.launch {
122122
val result = withContext(Dispatchers.IO) {
123-
if (!backgroundJobManager.isContentObserverJobScheduled()) {
124-
backgroundJobManager.scheduleContentObserverJob()
123+
if (!backgroundJobManager.isContentObserverRunning()) {
124+
backgroundJobManager.scheduleContentObserverJob(overridePowerSaving = true)
125125
}
126126

127127
FilesSyncHelper.startAutoUploadIgnoringPowerSaving(syncedFolderProvider, backgroundJobManager)

app/src/main/java/com/nextcloud/utils/extensions/WorkManagerExtensions.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ fun WorkManager.isWorkScheduled(tag: String): Boolean = getWorkInfosByTag(tag).h
2525
/**
2626
* Unique work names are not tags, [getWorkInfosByTag] never matches them.
2727
*/
28-
fun WorkManager.isUniqueWorkScheduled(uniqueWorkName: String): Boolean =
29-
getWorkInfosForUniqueWork(uniqueWorkName).hasWorkIn(PENDING_STATES)
28+
fun WorkManager.isUniqueWorkRunning(uniqueWorkName: String): Boolean =
29+
getWorkInfosForUniqueWork(uniqueWorkName).hasWorkIn(RUNNING_STATES)
3030

3131
private fun ListenableFuture<List<WorkInfo>>.hasWorkIn(stateConditions: List<WorkInfo.State>): Boolean {
3232
var workInfoList: List<WorkInfo> = emptyList()

app/src/main/java/com/owncloud/android/MainApp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ public void onCreate() {
335335
}
336336

337337
Log_OC.d(TAG, "scheduleContentObserverJob, called");
338-
backgroundJobManager.scheduleContentObserverJob();
338+
backgroundJobManager.scheduleContentObserverJob(false);
339339

340340
initSyncOperations(this,
341341
preferences,

app/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public void onReceive(Context context, Intent intent) {
7171
viewThemeUtils,
7272
walledCheckCache);
7373
Log_OC.d(TAG, "scheduleContentObserverJob, called");
74-
backgroundJobManager.scheduleContentObserverJob();
74+
backgroundJobManager.scheduleContentObserverJob(false);
7575
MainApp.initContactsBackup(accountManager, backgroundJobManager);
7676
} else {
7777
Log_OC.d(TAG, "Getting wrong intent: " + intent.getAction());

app/src/test/java/com/nextcloud/client/jobs/ContentObserverWorkTest.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package com.nextcloud.client.jobs
1010

1111
import android.content.Context
1212
import android.net.Uri
13+
import androidx.work.Data
1314
import androidx.work.WorkerParameters
1415
import com.nextcloud.client.database.dao.FileSystemDao
1516
import com.nextcloud.client.device.PowerManagementService
@@ -71,6 +72,7 @@ class ContentObserverWorkTest {
7172
)
7273
val uri: Uri = Mockito.mock(Uri::class.java)
7374
whenever(params.triggeredContentUris).thenReturn(listOf(uri))
75+
whenever(params.inputData).thenReturn(Data.EMPTY)
7476
}
7577

7678
@After
@@ -96,7 +98,7 @@ class ContentObserverWorkTest {
9698
}
9799

98100
@Test
99-
fun power_saving_stops_a_run_before_folders_are_read() {
101+
fun power_saving_stops_a_regular_run_before_folders_are_read() {
100102
runBlocking {
101103
whenever(powerManagementService.isPowerSavingEnabled).thenReturn(true)
102104

@@ -106,6 +108,23 @@ class ContentObserverWorkTest {
106108
}
107109
}
108110

111+
@Test
112+
fun power_saving_does_not_stop_a_run_the_user_asked_for() {
113+
runBlocking {
114+
whenever(powerManagementService.isPowerSavingEnabled).thenReturn(true)
115+
whenever(params.inputData).thenReturn(
116+
Data.Builder()
117+
.putBoolean(ContentObserverWork.OVERRIDE_POWER_SAVING, true)
118+
.build()
119+
)
120+
whenever(folderProvider.countEnabledSyncedFolders()).thenReturn(0)
121+
122+
worker.doWork()
123+
124+
verify(folderProvider).countEnabledSyncedFolders()
125+
}
126+
}
127+
109128
@Test
110129
@Ignore("TODO: needs further refactoring")
111130
fun sync_is_triggered() {

0 commit comments

Comments
 (0)