Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BugFix - Get Files For Auto Upload #14161

Merged
merged 2 commits into from
Dec 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 29 additions & 15 deletions app/src/main/java/com/nextcloud/client/jobs/FilesSyncWork.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ 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
Expand All @@ -37,6 +36,8 @@ 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
Expand Down Expand Up @@ -217,6 +218,20 @@ class FilesSyncWork(
syncedFolderProvider.updateSyncFolder(syncedFolder)
}

private fun getAllFiles(path: String): Set<File> {
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,
Expand All @@ -230,52 +245,52 @@ 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: ArbitraryDataProvider? = if (lightVersion) {
val arbitraryDataProvider = if (lightVersion) {
ArbitraryDataProviderImpl(context)
} else {
null
}
val paths = filesystemDataProvider.getFilesForUpload(
syncedFolder.localPath,
syncedFolder.id.toString()
)

if (paths.size == 0) {
val files = getAllFiles(syncedFolder.localPath)
if (files.isEmpty()) {
return
}

val pathsAndMimes = paths.map { path ->
file = File(path)
val pathsAndMimes = files.map { file ->
val localPath = file.absolutePath
Triple(
localPath,
getRemotePath(file, syncedFolder, sFormatter, lightVersion, resources, currentLocale),
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 {
needsCharging = syncedFolder.isChargingOnly
needsWifi = syncedFolder.isWifiOnly
uploadAction = syncedFolder.uploadAction
}

FileUploadHelper.instance().uploadNewFiles(
user,
localPaths,
Expand All @@ -289,10 +304,9 @@ class FilesSyncWork(
syncedFolder.nameCollisionPolicy
)

for (path in paths) {
// TODO batch update
for (file in files) {
filesystemDataProvider.updateFilesystemFileAsSentForUpload(
path,
file.path,
syncedFolder.id.toString()
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,11 @@

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;

/**
Expand Down Expand Up @@ -63,49 +58,6 @@ public void updateFilesystemFileAsSentForUpload(String path, String syncedFolder
);
}

public Set<String> getFilesForUpload(String localPath, String syncedFolderId) {
Set<String> 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)
Expand Down
Loading