Skip to content

Commit b4a68cf

Browse files
Merge pull request #13918 from nextcloud/backport/13884/stable-3.30
[stable-3.30] Improve Two Way Sync Behaviour
2 parents bf0a150 + 6ed5be9 commit b4a68cf

16 files changed

+280
-70
lines changed

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

+2-1
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,8 @@ class BackgroundJobFactory @Inject constructor(
285285
params,
286286
accountManager,
287287
powerManagementService,
288-
connectivityService
288+
connectivityService,
289+
preferences
289290
)
290291
}
291292
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,5 +170,5 @@ interface BackgroundJobManager {
170170
fun schedulePeriodicHealthStatus()
171171
fun startHealthStatus()
172172
fun bothFilesSyncJobsRunning(syncedFolderID: Long): Boolean
173-
fun scheduleInternal2WaySync()
173+
fun scheduleInternal2WaySync(intervalMinutes: Long)
174174
}

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

+4-3
Original file line numberDiff line numberDiff line change
@@ -654,12 +654,13 @@ internal class BackgroundJobManagerImpl(
654654
)
655655
}
656656

657-
override fun scheduleInternal2WaySync() {
657+
override fun scheduleInternal2WaySync(intervalMinutes: Long) {
658658
val request = periodicRequestBuilder(
659659
jobClass = InternalTwoWaySyncWork::class,
660-
jobName = JOB_INTERNAL_TWO_WAY_SYNC
660+
jobName = JOB_INTERNAL_TWO_WAY_SYNC,
661+
intervalMins = intervalMinutes
661662
).build()
662663

663-
workManager.enqueueUniquePeriodicWork(JOB_INTERNAL_TWO_WAY_SYNC, ExistingPeriodicWorkPolicy.KEEP, request)
664+
workManager.enqueueUniquePeriodicWork(JOB_INTERNAL_TWO_WAY_SYNC, ExistingPeriodicWorkPolicy.UPDATE, request)
664665
}
665666
}

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

+7-10
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)

Diff for: app/src/main/java/com/nextcloud/client/preferences/AppPreferences.java

+6
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
}

Diff for: app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java

+23
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
}

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

+5
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) {

Diff for: app/src/main/java/com/nextcloud/utils/extensions/ViewExtensions.kt

+5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ import android.util.TypedValue
1313
import android.view.View
1414
import android.view.ViewOutlineProvider
1515

16+
fun View?.setVisibleIf(condition: Boolean) {
17+
if (this == null) return
18+
visibility = if (condition) View.VISIBLE else View.GONE
19+
}
20+
1621
fun createRoundedOutline(context: Context, cornerRadiusValue: Float): ViewOutlineProvider {
1722
return object : ViewOutlineProvider() {
1823
override fun getOutline(view: View, outline: Outline) {

Diff for: app/src/main/java/com/owncloud/android/MainApp.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,10 @@ public void onCreate() {
371371
backgroundJobManager.scheduleMediaFoldersDetectionJob();
372372
backgroundJobManager.startMediaFoldersDetectionJob();
373373
backgroundJobManager.schedulePeriodicHealthStatus();
374-
backgroundJobManager.scheduleInternal2WaySync();
374+
375+
if (preferences.isTwoWaySyncEnabled()) {
376+
backgroundJobManager.scheduleInternal2WaySync(preferences.getTwoWaySyncInterval());
377+
}
375378
}
376379

377380
registerGlobalPassCodeProtection();

Diff for: app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java

+4-1
Original file line numberDiff line numberDiff line change
@@ -2493,7 +2493,10 @@ public List<OCFile> getInternalTwoWaySyncFolders(User user) {
24932493
List<OCFile> files = new ArrayList<>(fileEntities.size());
24942494

24952495
for (FileEntity fileEntity : fileEntities) {
2496-
files.add(createFileInstance(fileEntity));
2496+
OCFile file = createFileInstance(fileEntity);
2497+
if (file.isFolder() && !file.isRootDirectory()) {
2498+
files.add(file);
2499+
}
24972500
}
24982501

24992502
return files;

Diff for: app/src/main/java/com/owncloud/android/datamodel/OCFile.java

+4
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,10 @@ public boolean isSharedWithSharee() {
784784
return this.sharedWithSharee;
785785
}
786786

787+
public boolean isRootDirectory() {
788+
return ROOT_PATH.equals(decryptedRemotePath);
789+
}
790+
787791
public boolean isFavorite() {
788792
return this.favorite;
789793
}

0 commit comments

Comments
 (0)