From 0b38126fa6c250b18059603d1639d031cdcc5993 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 21 Jan 2025 10:34:11 +0100 Subject: [PATCH 1/2] revert Signed-off-by: alperozturk --- .../nextcloud/client/jobs/FilesSyncWork.kt | 30 ++++-------- .../datamodel/FilesystemDataProvider.java | 47 +++++++++++++++++++ 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt b/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt index 40464964d310..9bd31463736f 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt @@ -36,8 +36,6 @@ import com.owncloud.android.utils.FileStorageUtils import com.owncloud.android.utils.FilesSyncHelper import com.owncloud.android.utils.MimeType import com.owncloud.android.utils.MimeTypeUtil -import com.owncloud.android.utils.SyncedFolderUtils.isFileNameQualifiedForAutoUpload -import com.owncloud.android.utils.SyncedFolderUtils.isQualifiedFolder import java.io.File import java.text.ParsePosition import java.text.SimpleDateFormat @@ -218,20 +216,6 @@ class FilesSyncWork( syncedFolderProvider.updateSyncFolder(syncedFolder) } - private fun getAllFiles(path: String): Set { - return File(path).takeIf { it.exists() } - ?.walkTopDown() - ?.asSequence() - ?.filter { file -> - file.isFile && - file.exists() && - isQualifiedFolder(file.parentFile?.path) && - isFileNameQualifiedForAutoUpload(file.name) - } - ?.toSet() - ?: emptySet() - } - @Suppress("LongMethod") // legacy code private fun uploadFilesFromFolder( context: Context, @@ -259,12 +243,16 @@ class FilesSyncWork( null } - val files = getAllFiles(syncedFolder.localPath) - if (files.isEmpty()) { + val paths = filesystemDataProvider.getFilesForUpload( + syncedFolder.localPath, + syncedFolder.id.toString() + ) + if (paths.isEmpty()) { return } - val pathsAndMimes = files.map { file -> + val pathsAndMimes = paths.map { path -> + val file = File(path) val localPath = file.absolutePath Triple( localPath, @@ -304,9 +292,9 @@ class FilesSyncWork( syncedFolder.nameCollisionPolicy ) - for (file in files) { + for (path in paths) { filesystemDataProvider.updateFilesystemFileAsSentForUpload( - file.path, + path, syncedFolder.id.toString() ) } diff --git a/app/src/main/java/com/owncloud/android/datamodel/FilesystemDataProvider.java b/app/src/main/java/com/owncloud/android/datamodel/FilesystemDataProvider.java index ed22265325f4..cbc4b3cc239b 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/FilesystemDataProvider.java +++ b/app/src/main/java/com/owncloud/android/datamodel/FilesystemDataProvider.java @@ -14,11 +14,15 @@ import com.owncloud.android.db.ProviderMeta; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.utils.SyncedFolderUtils; import java.io.BufferedInputStream; +import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.HashSet; +import java.util.Set; import java.util.zip.CRC32; /** @@ -113,6 +117,49 @@ public void storeOrUpdateFileValue(String localPath, long modifiedAt, boolean is } } + public Set getFilesForUpload(String localPath, String syncedFolderId) { + Set localPathsToUpload = new HashSet<>(); + + String likeParam = localPath + "%"; + + Cursor cursor = contentResolver.query( + ProviderMeta.ProviderTableMeta.CONTENT_URI_FILESYSTEM, + null, + ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_LOCAL_PATH + " LIKE ? and " + + ProviderMeta.ProviderTableMeta.FILESYSTEM_SYNCED_FOLDER_ID + " = ? and " + + ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_SENT_FOR_UPLOAD + " = ? and " + + ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_IS_FOLDER + " = ?", + new String[]{likeParam, syncedFolderId, "0", "0"}, + null); + + if (cursor != null) { + if (cursor.moveToFirst()) { + do { + String value = cursor.getString(cursor.getColumnIndexOrThrow( + ProviderMeta.ProviderTableMeta.FILESYSTEM_FILE_LOCAL_PATH)); + if (value == null) { + Log_OC.e(TAG, "Cannot get local path"); + } else { + File file = new File(value); + if (!file.exists()) { + Log_OC.d(TAG, "Ignoring file for upload (doesn't exist): " + value); + } else if (!SyncedFolderUtils.isQualifiedFolder(file.getParent())) { + Log_OC.d(TAG, "Ignoring file for upload (unqualified folder): " + value); + } else if (!SyncedFolderUtils.isFileNameQualifiedForAutoUpload(file.getName())) { + Log_OC.d(TAG, "Ignoring file for upload (unqualified file): " + value); + } else { + localPathsToUpload.add(value); + } + } + } while (cursor.moveToNext()); + } + + cursor.close(); + } + + return localPathsToUpload; + } + private FileSystemDataSet getFilesystemDataSet(String localPathParam, SyncedFolder syncedFolder) { Cursor cursor = contentResolver.query( From dc0de747cbc2b4f0f6e194f5f0444e77a3f2bf5d Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 21 Jan 2025 10:48:26 +0100 Subject: [PATCH 2/2] add comment Signed-off-by: alperozturk --- app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt b/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt index 9bd31463736f..362c5dbdbe25 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt @@ -243,6 +243,10 @@ class FilesSyncWork( null } + // Ensure only new files are processed for upload. + // Files that have been previously uploaded cannot be re-uploaded, + // even if they have been deleted or moved from the target folder, + // as they are already marked as uploaded in the database. val paths = filesystemDataProvider.getFilesForUpload( syncedFolder.localPath, syncedFolder.id.toString()