Skip to content

Commit e3948ca

Browse files
committed
auto upload worker already inserts entries no need to use content observer work
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 11f4710 commit e3948ca

9 files changed

Lines changed: 34 additions & 76 deletions

File tree

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

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,8 @@ 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.
4138
*/
42-
fun scheduleContentObserverJob(overridePowerSaving: Boolean = false)
43-
44-
fun isContentObserverRunning(): Boolean
39+
fun scheduleContentObserverJob()
4540

4641
/**
4742
* Schedule periodic contacts backups job. Operating system will

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

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ 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.isUniqueWorkRunning
4140
import com.nextcloud.utils.extensions.isWorkScheduled
4241
import com.owncloud.android.datamodel.OCFile
4342
import com.owncloud.android.datamodel.SyncedFolder
@@ -467,11 +466,7 @@ internal class BackgroundJobManagerImpl(
467466
}
468467

469468
@Suppress("MagicNumber")
470-
override fun scheduleContentObserverJob(overridePowerSaving: Boolean) {
471-
val arguments = Data.Builder()
472-
.putBoolean(ContentObserverWork.OVERRIDE_POWER_SAVING, overridePowerSaving)
473-
.build()
474-
469+
override fun scheduleContentObserverJob() {
475470
val constrains = Constraints.Builder()
476471
.addContentUriTrigger(MediaStore.Images.Media.INTERNAL_CONTENT_URI, true)
477472
.addContentUriTrigger(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true)
@@ -484,14 +479,11 @@ internal class BackgroundJobManagerImpl(
484479

485480
val request = oneTimeRequestBuilder(ContentObserverWork::class, JOB_CONTENT_OBSERVER)
486481
.setConstraints(constrains)
487-
.setInputData(arguments)
488482
.build()
489483

490484
workManager.enqueueUniqueWork(JOB_CONTENT_OBSERVER, ExistingWorkPolicy.REPLACE, request)
491485
}
492486

493-
override fun isContentObserverRunning(): Boolean = workManager.isUniqueWorkRunning(JOB_CONTENT_OBSERVER)
494-
495487
private fun autoUploadWorkName(syncedFolderID: Long): String = JOB_IMMEDIATE_FILES_SYNC + "_" + syncedFolderID
496488

497489
private fun autoUploadIgnorePowerSavingTag(syncedFolderID: Long): String =
@@ -503,6 +495,13 @@ internal class BackgroundJobManagerImpl(
503495
override fun startAutoUpload(syncedFolder: SyncedFolder, overridePowerSaving: Boolean) {
504496
val syncedFolderID = syncedFolder.id
505497

498+
// the sync now button starts this folder and also lets the content observer request it, replacing the
499+
// running one would cancel it mid upload
500+
if (overridePowerSaving && isAutoUploadIgnoringPowerSavingScheduled(syncedFolderID)) {
501+
Log_OC.d(TAG, "auto upload ignoring power saving already running for folder $syncedFolderID")
502+
return
503+
}
504+
506505
val arguments = Data.Builder()
507506
.putBoolean(AutoUploadWorker.OVERRIDE_POWER_SAVING, overridePowerSaving)
508507
.putLong(AutoUploadWorker.SYNCED_FOLDER_ID, syncedFolderID)

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ 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
1615
import com.owncloud.android.datamodel.SyncedFolderProvider
1716
import com.owncloud.android.lib.common.utils.Log_OC
1817
import com.owncloud.android.utils.FilesSyncHelper
@@ -37,16 +36,12 @@ class ContentObserverWork(
3736

3837
companion object {
3938
private const val TAG = "🔍" + "ContentObserverWork"
40-
const val OVERRIDE_POWER_SAVING = "overridePowerSaving"
4139
}
4240

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

5146
try {
5247
if (params.triggeredContentUris.isNotEmpty()) {
@@ -77,7 +72,7 @@ class ContentObserverWork(
7772
}
7873

7974
private suspend fun checkAndTriggerAutoUpload() = withContext(Dispatchers.IO) {
80-
if (powerManagementService.isPowerSavingEnabled && !overridePowerSaving) {
75+
if (powerManagementService.isPowerSavingEnabled) {
8176
Log_OC.w(TAG, "⚡ Power saving mode active — skipping file sync.")
8277
return@withContext
8378
}
@@ -121,7 +116,7 @@ class ContentObserverWork(
121116
FilesSyncHelper.startAutoUploadForEnabledSyncedFolders(
122117
syncedFolderProvider,
123118
backgroundJobManager,
124-
overridePowerSaving
119+
false
125120
)
126121
Log_OC.d(TAG, "✅ auto upload triggered successfully for ${contentUris.size} file(s).")
127122
} catch (e: Exception) {

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,17 @@
77

88
package com.nextcloud.client.jobs.autoUpload
99

10+
import com.owncloud.android.R
11+
1012
enum class AutoUploadRequestResult {
1113
STARTED,
1214
ALREADY_RUNNING,
13-
NO_ENABLED_FOLDER
15+
NO_ENABLED_FOLDER;
16+
17+
val messageId: Int
18+
get() = when (this) {
19+
STARTED -> R.string.auto_upload_sync_now_started
20+
ALREADY_RUNNING -> R.string.auto_upload_sync_now_running
21+
NO_ENABLED_FOLDER -> R.string.auto_upload_sync_now_no_folder
22+
}
1423
}

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

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,10 @@ import android.content.IntentFilter
1515
import android.os.PowerManager
1616
import android.provider.Settings
1717
import android.view.View
18-
import androidx.annotation.StringRes
1918
import androidx.core.net.toUri
2019
import com.nextcloud.client.device.PowerManagementService
2120
import com.nextcloud.client.jobs.BackgroundJobManager
22-
import com.nextcloud.client.jobs.autoUpload.AutoUploadRequestResult
2321
import com.nextcloud.utils.extensions.setVisibleIf
24-
import com.owncloud.android.R
2522
import com.owncloud.android.databinding.UploadWarningCardBinding
2623
import com.owncloud.android.datamodel.SyncedFolderProvider
2724
import com.owncloud.android.utils.DisplayUtils
@@ -120,21 +117,10 @@ class UploadWarningCard(
120117
private fun startAutoUploadIgnoringBatterySaver(view: View) {
121118
scope.launch {
122119
val result = withContext(Dispatchers.IO) {
123-
if (!backgroundJobManager.isContentObserverRunning()) {
124-
backgroundJobManager.scheduleContentObserverJob(overridePowerSaving = true)
125-
}
126-
127120
FilesSyncHelper.startAutoUploadIgnoringPowerSaving(syncedFolderProvider, backgroundJobManager)
128121
}
129122

130-
DisplayUtils.showSnackMessage(view, result.messageId())
123+
DisplayUtils.showSnackMessage(view, result.messageId)
131124
}
132125
}
133-
134-
@StringRes
135-
private fun AutoUploadRequestResult.messageId(): Int = when (this) {
136-
AutoUploadRequestResult.STARTED -> R.string.auto_upload_sync_now_started
137-
AutoUploadRequestResult.ALREADY_RUNNING -> R.string.auto_upload_sync_now_running
138-
AutoUploadRequestResult.NO_ENABLED_FOLDER -> R.string.auto_upload_sync_now_no_folder
139-
}
140126
}

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

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,28 +15,21 @@ import java.util.concurrent.ExecutionException
1515

1616
private const val TAG = "WorkManager"
1717

18-
private val RUNNING_STATES = listOf(WorkInfo.State.RUNNING)
19-
private val PENDING_STATES = listOf(WorkInfo.State.RUNNING, WorkInfo.State.ENQUEUED)
18+
fun WorkManager.isWorkRunning(tag: String): Boolean = checkWork(tag, listOf(WorkInfo.State.RUNNING))
2019

21-
fun WorkManager.isWorkRunning(tag: String): Boolean = getWorkInfosByTag(tag).hasWorkIn(RUNNING_STATES)
20+
fun WorkManager.isWorkScheduled(tag: String): Boolean =
21+
checkWork(tag, listOf(WorkInfo.State.RUNNING, WorkInfo.State.ENQUEUED))
2222

23-
fun WorkManager.isWorkScheduled(tag: String): Boolean = getWorkInfosByTag(tag).hasWorkIn(PENDING_STATES)
24-
25-
/**
26-
* Unique work names are not tags, [getWorkInfosByTag] never matches them.
27-
*/
28-
fun WorkManager.isUniqueWorkRunning(uniqueWorkName: String): Boolean =
29-
getWorkInfosForUniqueWork(uniqueWorkName).hasWorkIn(RUNNING_STATES)
30-
31-
private fun ListenableFuture<List<WorkInfo>>.hasWorkIn(stateConditions: List<WorkInfo.State>): Boolean {
23+
private fun WorkManager.checkWork(tag: String, stateConditions: List<WorkInfo.State>): Boolean {
24+
val statuses: ListenableFuture<List<WorkInfo>> = getWorkInfosByTag(tag)
3225
var workInfoList: List<WorkInfo> = emptyList()
3326

3427
try {
35-
workInfoList = get()
28+
workInfoList = statuses.get()
3629
} catch (e: ExecutionException) {
37-
Log_OC.d(TAG, "ExecutionException in hasWorkIn: $e")
30+
Log_OC.d(TAG, "ExecutionException in checkWork: $e")
3831
} catch (e: InterruptedException) {
39-
Log_OC.d(TAG, "InterruptedException in hasWorkIn: $e")
32+
Log_OC.d(TAG, "InterruptedException in checkWork: $e")
4033
}
4134

4235
return workInfoList.any { workInfo -> stateConditions.contains(workInfo.state) }

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(false);
338+
backgroundJobManager.scheduleContentObserverJob();
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(false);
74+
backgroundJobManager.scheduleContentObserverJob();
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: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ package com.nextcloud.client.jobs
1010

1111
import android.content.Context
1212
import android.net.Uri
13-
import androidx.work.Data
1413
import androidx.work.WorkerParameters
1514
import com.nextcloud.client.database.dao.FileSystemDao
1615
import com.nextcloud.client.device.PowerManagementService
@@ -72,7 +71,6 @@ class ContentObserverWorkTest {
7271
)
7372
val uri: Uri = Mockito.mock(Uri::class.java)
7473
whenever(params.triggeredContentUris).thenReturn(listOf(uri))
75-
whenever(params.inputData).thenReturn(Data.EMPTY)
7674
}
7775

7876
@After
@@ -98,7 +96,7 @@ class ContentObserverWorkTest {
9896
}
9997

10098
@Test
101-
fun power_saving_stops_a_regular_run_before_folders_are_read() {
99+
fun power_saving_stops_a_run_before_folders_are_read() {
102100
runBlocking {
103101
whenever(powerManagementService.isPowerSavingEnabled).thenReturn(true)
104102

@@ -108,23 +106,6 @@ class ContentObserverWorkTest {
108106
}
109107
}
110108

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-
128109
@Test
129110
@Ignore("TODO: needs further refactoring")
130111
fun sync_is_triggered() {

0 commit comments

Comments
 (0)