From 4db38dcb80139ecd1e48d7b31176919b893a10bf Mon Sep 17 00:00:00 2001 From: Tobias Kaminsky Date: Tue, 17 Dec 2024 15:34:30 +0100 Subject: [PATCH] Revert "BugFix - Get Files For Auto Upload" --- .../nextcloud/client/jobs/FilesSyncWork.kt | 44 ++++++----------- .../datamodel/FilesystemDataProvider.java | 48 +++++++++++++++++++ 2 files changed, 63 insertions(+), 29 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 40464964d3..b1d3fe8002 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt @@ -23,6 +23,7 @@ import com.nextcloud.client.jobs.upload.FileUploadWorker import com.nextcloud.client.network.ConnectivityService import com.nextcloud.client.preferences.SubFolderRule import com.owncloud.android.R +import com.owncloud.android.datamodel.ArbitraryDataProvider import com.owncloud.android.datamodel.ArbitraryDataProviderImpl import com.owncloud.android.datamodel.FilesystemDataProvider import com.owncloud.android.datamodel.MediaFolderType @@ -36,8 +37,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 +217,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, @@ -245,26 +230,29 @@ class FilesSyncWork( val uploadAction: Int? val needsCharging: Boolean val needsWifi: Boolean + var file: File val accountName = syncedFolder.account - val optionalUser = userAccountManager.getUser(accountName) if (!optionalUser.isPresent) { return } - val user = optionalUser.get() - val arbitraryDataProvider = if (lightVersion) { + val arbitraryDataProvider: ArbitraryDataProvider? = if (lightVersion) { ArbitraryDataProviderImpl(context) } else { null } + val paths = filesystemDataProvider.getFilesForUpload( + syncedFolder.localPath, + syncedFolder.id.toString() + ) - val files = getAllFiles(syncedFolder.localPath) - if (files.isEmpty()) { + if (paths.size == 0) { return } - val pathsAndMimes = files.map { file -> + val pathsAndMimes = paths.map { path -> + file = File(path) val localPath = file.absolutePath Triple( localPath, @@ -272,17 +260,15 @@ class FilesSyncWork( MimeTypeUtil.getBestMimeTypeByFilename(localPath) ) } - val localPaths = pathsAndMimes.map { it.first }.toTypedArray() val remotePaths = pathsAndMimes.map { it.second }.toTypedArray() if (lightVersion) { needsCharging = resources.getBoolean(R.bool.syncedFolder_light_on_charging) - needsWifi = arbitraryDataProvider?.getBooleanValue( + needsWifi = arbitraryDataProvider!!.getBooleanValue( accountName, SettingsActivity.SYNCED_FOLDER_LIGHT_UPLOAD_ON_WIFI - ) ?: true - + ) val uploadActionString = resources.getString(R.string.syncedFolder_light_upload_behaviour) uploadAction = getUploadAction(uploadActionString) } else { @@ -290,7 +276,6 @@ class FilesSyncWork( needsWifi = syncedFolder.isWifiOnly uploadAction = syncedFolder.uploadAction } - FileUploadHelper.instance().uploadNewFiles( user, localPaths, @@ -304,9 +289,10 @@ class FilesSyncWork( syncedFolder.nameCollisionPolicy ) - for (file in files) { + for (path in paths) { + // TODO batch update 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 ed22265325..f4b6a03ef2 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,16 @@ import android.net.Uri; 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.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.util.HashSet; +import java.util.Set; import java.util.zip.CRC32; /** @@ -58,6 +63,49 @@ public class FilesystemDataProvider { ); } + 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; + } + public void storeOrUpdateFileValue(String localPath, long modifiedAt, boolean isFolder, SyncedFolder syncedFolder) { // takes multiple milliseconds to query data from database (around 75% of execution time) (6ms)