Skip to content

Commit 54592b2

Browse files
Merge pull request #13884 from nextcloud/improve-two-way-sync-behaviour
Improve Two Way Sync Behaviour
2 parents d36fa32 + 81e5de6 commit 54592b2

File tree

14 files changed

+277
-70
lines changed

14 files changed

+277
-70
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ class BackgroundJobFactory @Inject constructor(
297297
params,
298298
accountManager,
299299
powerManagementService,
300-
connectivityService
300+
connectivityService,
301+
preferences
301302
)
302303
}
303304
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,5 +172,6 @@ interface BackgroundJobManager {
172172
fun bothFilesSyncJobsRunning(syncedFolderID: Long): Boolean
173173
fun startOfflineOperations()
174174
fun startPeriodicallyOfflineOperation()
175-
fun scheduleInternal2WaySync()
175+
fun scheduleInternal2WaySync(intervalMinutes: Long)
176+
fun cancelInternal2WaySyncJob()
176177
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -702,12 +702,17 @@ internal class BackgroundJobManagerImpl(
702702
)
703703
}
704704

705-
override fun scheduleInternal2WaySync() {
705+
override fun scheduleInternal2WaySync(intervalMinutes: Long) {
706706
val request = periodicRequestBuilder(
707707
jobClass = InternalTwoWaySyncWork::class,
708-
jobName = JOB_INTERNAL_TWO_WAY_SYNC
708+
jobName = JOB_INTERNAL_TWO_WAY_SYNC,
709+
intervalMins = intervalMinutes
709710
).build()
710711

711-
workManager.enqueueUniquePeriodicWork(JOB_INTERNAL_TWO_WAY_SYNC, ExistingPeriodicWorkPolicy.KEEP, request)
712+
workManager.enqueueUniquePeriodicWork(JOB_INTERNAL_TWO_WAY_SYNC, ExistingPeriodicWorkPolicy.UPDATE, request)
713+
}
714+
715+
override fun cancelInternal2WaySyncJob() {
716+
workManager.cancelJob(JOB_INTERNAL_TWO_WAY_SYNC)
712717
}
713718
}

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import androidx.work.WorkerParameters
1313
import com.nextcloud.client.account.UserAccountManager
1414
import com.nextcloud.client.device.PowerManagementService
1515
import com.nextcloud.client.network.ConnectivityService
16+
import com.nextcloud.client.preferences.AppPreferences
1617
import com.owncloud.android.MainApp
1718
import com.owncloud.android.datamodel.FileDataStorageManager
1819
import com.owncloud.android.datamodel.OCFile
@@ -21,13 +22,14 @@ import com.owncloud.android.operations.SynchronizeFolderOperation
2122
import com.owncloud.android.utils.FileStorageUtils
2223
import java.io.File
2324

24-
@Suppress("Detekt.NestedBlockDepth", "ReturnCount")
25+
@Suppress("Detekt.NestedBlockDepth", "ReturnCount", "LongParameterList")
2526
class InternalTwoWaySyncWork(
2627
private val context: Context,
2728
params: WorkerParameters,
2829
private val userAccountManager: UserAccountManager,
2930
private val powerManagementService: PowerManagementService,
30-
private val connectivityService: ConnectivityService
31+
private val connectivityService: ConnectivityService,
32+
private val appPreferences: AppPreferences
3133
) : Worker(context, params) {
3234
private var shouldRun = true
3335

@@ -36,7 +38,9 @@ class InternalTwoWaySyncWork(
3638

3739
var result = true
3840

39-
if (powerManagementService.isPowerSavingEnabled ||
41+
@Suppress("ComplexCondition")
42+
if (!appPreferences.isTwoWaySyncEnabled ||
43+
powerManagementService.isPowerSavingEnabled ||
4044
!connectivityService.isConnected ||
4145
connectivityService.isInternetWalled ||
4246
!connectivityService.connectivity.isWifi
@@ -61,13 +65,6 @@ class InternalTwoWaySyncWork(
6165
return checkFreeSpaceResult
6266
}
6367

64-
// do not attempt to sync root folder
65-
if (folder.remotePath == OCFile.ROOT_PATH) {
66-
folder.internalFolderSyncTimestamp = -1L
67-
fileDataStorageManager.saveFile(folder)
68-
continue
69-
}
70-
7168
Log_OC.d(TAG, "Folder ${folder.remotePath}: started!")
7269
val operation = SynchronizeFolderOperation(context, folder.remotePath, user, fileDataStorageManager)
7370
.execute(context)

app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,4 +391,10 @@ default void onDarkThemeModeChanged(DarkMode mode) {
391391

392392
@NonNull
393393
String getLastSelectedMediaFolder();
394+
395+
void setTwoWaySyncStatus(boolean value);
396+
boolean isTwoWaySyncEnabled();
397+
398+
void setTwoWaySyncInterval(Long value);
399+
Long getTwoWaySyncInterval();
394400
}

app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ public final class AppPreferencesImpl implements AppPreferences {
102102
private static final String PREF__STORAGE_PERMISSION_REQUESTED = "storage_permission_requested";
103103
private static final String PREF__IN_APP_REVIEW_DATA = "in_app_review_data";
104104

105+
private static final String PREF__TWO_WAY_STATUS = "two_way_sync_status";
106+
private static final String PREF__TWO_WAY_SYNC_INTERVAL = "two_way_sync_interval";
107+
105108
private static final String LOG_ENTRY = "log_entry";
106109

107110
private final Context context;
@@ -789,4 +792,24 @@ public void setLastSelectedMediaFolder(@NonNull String path) {
789792
public String getLastSelectedMediaFolder() {
790793
return preferences.getString(PREF__MEDIA_FOLDER_LAST_PATH, OCFile.ROOT_PATH);
791794
}
795+
796+
@Override
797+
public void setTwoWaySyncStatus(boolean value) {
798+
preferences.edit().putBoolean(PREF__TWO_WAY_STATUS, value).apply();
799+
}
800+
801+
@Override
802+
public boolean isTwoWaySyncEnabled() {
803+
return preferences.getBoolean(PREF__TWO_WAY_STATUS, true);
804+
}
805+
806+
@Override
807+
public void setTwoWaySyncInterval(Long value) {
808+
preferences.edit().putLong(PREF__TWO_WAY_SYNC_INTERVAL, value).apply();
809+
}
810+
811+
@Override
812+
public Long getTwoWaySyncInterval() {
813+
return preferences.getLong(PREF__TWO_WAY_SYNC_INTERVAL, 15L);
814+
}
792815
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,13 @@ import android.os.Handler
1717
import android.os.Looper
1818
import android.widget.Toast
1919
import com.google.common.io.Resources
20+
import com.owncloud.android.R
2021
import com.owncloud.android.datamodel.ReceiverFlag
2122

23+
fun Context.hourPlural(hour: Int): String = resources.getQuantityString(R.plurals.hours, hour, hour)
24+
25+
fun Context.minPlural(min: Int): String = resources.getQuantityString(R.plurals.minutes, min, min)
26+
2227
@SuppressLint("UnspecifiedRegisterReceiverFlag")
2328
fun Context.registerBroadcastReceiver(receiver: BroadcastReceiver?, filter: IntentFilter, flag: ReceiverFlag): Intent? {
2429
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,7 +375,11 @@ public void onCreate() {
375375
backgroundJobManager.scheduleMediaFoldersDetectionJob();
376376
backgroundJobManager.startMediaFoldersDetectionJob();
377377
backgroundJobManager.schedulePeriodicHealthStatus();
378-
backgroundJobManager.scheduleInternal2WaySync();
378+
379+
if (preferences.isTwoWaySyncEnabled()) {
380+
backgroundJobManager.scheduleInternal2WaySync(preferences.getTwoWaySyncInterval());
381+
}
382+
379383
backgroundJobManager.startPeriodicallyOfflineOperation();
380384
}
381385

app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2643,7 +2643,10 @@ public List<OCFile> getInternalTwoWaySyncFolders(User user) {
26432643
List<OCFile> files = new ArrayList<>(fileEntities.size());
26442644

26452645
for (FileEntity fileEntity : fileEntities) {
2646-
files.add(createFileInstance(fileEntity));
2646+
OCFile file = createFileInstance(fileEntity);
2647+
if (file.isFolder() && !file.isRootDirectory()) {
2648+
files.add(file);
2649+
}
26472650
}
26482651

26492652
return files;

0 commit comments

Comments
 (0)