From 03f138b2ca247737225792057bd3880d84468fb0 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 16 Sep 2026 14:57:17 +0200 Subject: [PATCH 1/2] remove deduplicated root folder refresh operation Signed-off-by: alperozturk96 --- .../java/com/nextcloud/client/jobs/BackgroundJobManager.kt | 2 +- .../com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt | 3 ++- .../com/nextcloud/client/jobs/metadata/MetadataWorker.kt | 4 +++- .../owncloud/android/ui/activity/FileDisplayActivity.kt | 7 +++++-- 4 files changed, 11 insertions(+), 5 deletions(-) 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..1ba69414b879 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManager.kt @@ -175,7 +175,7 @@ interface BackgroundJobManager { fun startPeriodicallyOfflineOperation() fun scheduleInternal2WaySync(intervalMinutes: Long) fun cancelAllFilesDownloadJobs() - fun startMetadataSyncJob(currentDirPath: String) + fun startMetadataSyncJob(currentDirPath: String, folderAlreadySynced: Boolean = false) fun downloadFolder(folder: OCFile, accountName: String) fun cancelFolderDownload() fun locallyDeleteAutoUploadedFiles(syncedFolders: List) 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..ac8b4d5fa65e 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt @@ -560,9 +560,10 @@ internal class BackgroundJobManagerImpl( workManager.cancelAllWorkByTag(formatClassTag(FileDownloadWorker::class)) } - override fun startMetadataSyncJob(currentDirPath: String) { + override fun startMetadataSyncJob(currentDirPath: String, folderAlreadySynced: Boolean) { val inputData = Data.Builder() .putString(MetadataWorker.FILE_PATH, currentDirPath) + .putBoolean(MetadataWorker.FOLDER_ALREADY_SYNCED, folderAlreadySynced) .build() val constrains = Constraints.Builder() diff --git a/app/src/main/java/com/nextcloud/client/jobs/metadata/MetadataWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/metadata/MetadataWorker.kt index b563c0ba2031..be64cef7c9c5 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/metadata/MetadataWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/metadata/MetadataWorker.kt @@ -26,6 +26,7 @@ class MetadataWorker(private val context: Context, params: WorkerParameters, pri companion object { private const val TAG = "MetadataWorker" const val FILE_PATH = "file_path" + const val FOLDER_ALREADY_SYNCED = "folder_already_synced" } override suspend fun doWork(): Result { @@ -49,7 +50,8 @@ class MetadataWorker(private val context: Context, params: WorkerParameters, pri Log_OC.d(TAG, "Starting metadata sync for folder: $filePath, id: ${currentDir.fileId}") - if (!refreshFolder(currentDir, storageManager)) return Result.failure() + val folderAlreadySynced = inputData.getBoolean(FOLDER_ALREADY_SYNCED, false) + if (!folderAlreadySynced && !refreshFolder(currentDir, storageManager)) return Result.failure() val refreshedDir = storageManager.getFileByPath(filePath) ?: run { Log_OC.e(TAG, "File not found after refresh: $filePath") diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index e48cdc9f8912..1598147119c6 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -316,7 +316,6 @@ class FileDisplayActivity : checkStoragePath() observeWorkerState() - startMetadataSyncForRoot() handleBackPress() setupDrawer(menuItemId) } @@ -1612,6 +1611,10 @@ class FileDisplayActivity : file = currentFile } + if (isSyncFolderRemotePathRoot) { + startMetadataSyncForRoot() + } + handleSyncResult(event, syncResult) DataHolderUtil.getInstance().delete(id) handleScrollBehaviour(fileListFragment) @@ -3289,7 +3292,7 @@ class FileDisplayActivity : // region MetadataSyncJob private fun startMetadataSyncForRoot() { - backgroundJobManager.startMetadataSyncJob(OCFile.ROOT_PATH) + backgroundJobManager.startMetadataSyncJob(OCFile.ROOT_PATH, folderAlreadySynced = true) } private fun startMetadataSyncForCurrentDir() { From f5ca54fde9a12661dac13c1713e5a667e95ea129 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 16 Sep 2026 15:14:11 +0200 Subject: [PATCH 2/2] fail fast for ignore eTag thus no need read file operation Signed-off-by: alperozturk96 --- .../operations/RefreshFolderOperation.java | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java b/app/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java index 85af19137bc7..0eb9c00f83e0 100644 --- a/app/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java @@ -407,6 +407,11 @@ private void updatePredefinedStatus(ArbitraryDataProvider arbitraryDataProvider) private RemoteOperationResult checkForChanges(OwnCloudClient client) { mRemoteFolderChanged = true; + + if (mIgnoreETag) { + return new RemoteOperationResult<>(ResultCode.OK); + } + RemoteOperationResult result; String remotePath = mLocalFolder.getRemotePath(); @@ -418,25 +423,21 @@ private RemoteOperationResult checkForChanges(OwnCloudClient client) { if (result.isSuccess()) { OCFile remoteFolder = FileStorageUtils.fillOCFile((RemoteFile) result.getData().get(0)); - if (!mIgnoreETag) { - // check if remote and local folder are different - String remoteFolderETag = remoteFolder.getEtag(); - if (remoteFolderETag != null) { - String localFolderEtag = mLocalFolder.getEtag(); - mRemoteFolderChanged = StringExtensionsKt.eTagChanged(remoteFolderETag, localFolderEtag); - Log_OC.d( - TAG, - "📂 eTag check\n" + - " Path: " + remoteFolder.getRemotePath() + "\n" + - " Local eTag: " + localFolderEtag + "\n" + - " Remote eTag: " + remoteFolderETag + "\n" + - " Changed: " + mRemoteFolderChanged - ); - } else { - Log_OC.e(TAG, "Checked " + user.getAccountName() + remotePath + ": No ETag received from server"); - } + // check if remote and local folder are different + String remoteFolderETag = remoteFolder.getEtag(); + if (remoteFolderETag != null) { + String localFolderEtag = mLocalFolder.getEtag(); + mRemoteFolderChanged = StringExtensionsKt.eTagChanged(remoteFolderETag, localFolderEtag); + Log_OC.d( + TAG, + "📂 eTag check\n" + + " Path: " + remoteFolder.getRemotePath() + "\n" + + " Local eTag: " + localFolderEtag + "\n" + + " Remote eTag: " + remoteFolderETag + "\n" + + " Changed: " + mRemoteFolderChanged + ); } else { - Log_OC.d(TAG, "Ignoring eTag. mRemoteFolderChanged is true."); + Log_OC.e(TAG, "Checked " + user.getAccountName() + remotePath + ": No ETag received from server"); } result = new RemoteOperationResult<>(ResultCode.OK);