From 820c381b53b0e1d2d53840dda05b198a70a6a0d2 Mon Sep 17 00:00:00 2001 From: daniele-verducci Date: Fri, 11 Sep 2026 19:00:28 +0200 Subject: [PATCH 1/3] feature/create-folder-during-upload: use new auto folder creation feature Signed-off-by: daniele-verducci --- .../android/operations/UploadFileOperation.java | 14 +++++++++----- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 8 ++++++++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java index d525f37de441..51948546e394 100644 --- a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java @@ -55,6 +55,7 @@ import com.owncloud.android.lib.resources.files.ReadFileRemoteOperation; import com.owncloud.android.lib.resources.files.UploadFileRemoteOperation; import com.owncloud.android.lib.resources.files.model.RemoteFile; +import com.owncloud.android.lib.resources.status.NextcloudVersion; import com.owncloud.android.lib.resources.status.OCCapability; import com.owncloud.android.operations.common.SyncOperation; import com.owncloud.android.operations.e2e.E2EClientData; @@ -475,12 +476,15 @@ protected RemoteOperationResult run(OwnCloudClient client) { final boolean isResumingEncryptedUpload = (mFolderUnlockToken != null && !mFolderUnlockToken.isEmpty()); if (!isResumingEncryptedUpload && (parent == null || mRemoteFolderToBeCreated)) { Log_OC.d(TAG, "verifying remote parent folder exists: " + remoteParentPath); - final var result = grantFolderExistence(remoteParentPath, client); - if (!result.isSuccess()) { - Log_OC.e(TAG, "grantFolderExistence failed for: " + remoteParentPath + ", code: " + - result.getCode() + ", message: " + result.getMessage()); - return result; + if (!getCapabilities().getVersion().isNewerOrEqual(NextcloudVersion.nextcloud_32)) { + // No automatic folder creation before Nextcloud 32, create them + final var result = grantFolderExistence(remoteParentPath, client); + if (!result.isSuccess()) { + Log_OC.e(TAG, "grantFolderExistence failed for: " + remoteParentPath + ", code: " + + result.getCode() + ", message: " + result.getMessage()); + return result; + } } parent = getStorageManager().getFileByPath(remoteParentPath); diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d4ef11def1f4..f4e2f3c7a196 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ androidCommonLibraryVersion = "f46fb3b6789dee1f476269903da61e9b48c99587" androidGifDrawableVersion = "1.2.32" androidImageCropperVersion = "4.7.0" -androidLibraryVersion ="d22a01f4b8327b6593d6af75f6be3aa7fbc2c854" +androidLibraryVersion ="23b7bc1dbc7be64caf3bb00f06c9fa8b618ad144" androidOpensslVersion = "3.5.6" androidPluginVersion = "9.4.0" androidsvgVersion = "1.4" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index bed32c794130..050ef31ee51c 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -21169,6 +21169,14 @@ + + + + + + + + From 4b14e755433c45a1ca354844600ba914cce6b5e3 Mon Sep 17 00:00:00 2001 From: daniele-verducci Date: Mon, 14 Sep 2026 15:55:05 +0200 Subject: [PATCH 2/3] Updated android-library Signed-off-by: daniele-verducci --- gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f4e2f3c7a196..5ad435586df3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ androidCommonLibraryVersion = "f46fb3b6789dee1f476269903da61e9b48c99587" androidGifDrawableVersion = "1.2.32" androidImageCropperVersion = "4.7.0" -androidLibraryVersion ="23b7bc1dbc7be64caf3bb00f06c9fa8b618ad144" +androidLibraryVersion ="8cbaa7e8a834f5c2fa6d1f24bd3b9923aa079f28" androidOpensslVersion = "3.5.6" androidPluginVersion = "9.4.0" androidsvgVersion = "1.4" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 050ef31ee51c..9240d265e498 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -21865,6 +21865,14 @@ + + + + + + + + From 5ad728691fd7659a9e23ef655d47d0e1ceeda22f Mon Sep 17 00:00:00 2001 From: daniele-verducci Date: Mon, 14 Sep 2026 17:49:39 +0200 Subject: [PATCH 3/3] Working new auto folder creation feature on uploads Signed-off-by: daniele-verducci --- .../operations/UploadFileOperation.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java index 51948546e394..451d5e1ef705 100644 --- a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java @@ -473,40 +473,42 @@ protected RemoteOperationResult run(OwnCloudClient client) { Log_OC.d(TAG, "parent lookup for path: " + remoteParentPath + " → " + (parent == null ? "not found in DB" : "found, id=" + parent.getFileId())); - final boolean isResumingEncryptedUpload = (mFolderUnlockToken != null && !mFolderUnlockToken.isEmpty()); - if (!isResumingEncryptedUpload && (parent == null || mRemoteFolderToBeCreated)) { - Log_OC.d(TAG, "verifying remote parent folder exists: " + remoteParentPath); - if (!getCapabilities().getVersion().isNewerOrEqual(NextcloudVersion.nextcloud_32)) { - // No automatic folder creation before Nextcloud 32, create them + // No automatic folder creation before Nextcloud 32 + if (!getCapabilities().getVersion().isNewerOrEqual(NextcloudVersion.nextcloud_32)) { + final boolean isResumingEncryptedUpload = (mFolderUnlockToken != null && !mFolderUnlockToken.isEmpty()); + if (!isResumingEncryptedUpload && (parent == null || mRemoteFolderToBeCreated)) { + Log_OC.d(TAG, "verifying remote parent folder exists: " + remoteParentPath); final var result = grantFolderExistence(remoteParentPath, client); + if (!result.isSuccess()) { Log_OC.e(TAG, "grantFolderExistence failed for: " + remoteParentPath + ", code: " + result.getCode() + ", message: " + result.getMessage()); return result; } + + parent = getStorageManager().getFileByPath(remoteParentPath); + if (parent == null) { + Log_OC.e(TAG, "parent still null after grantFolderExistence: " + remoteParentPath); + return new RemoteOperationResult<>(ResultCode.UNKNOWN_ERROR); + } + + Log_OC.d(TAG, "remote parent folder confirmed: " + remoteParentPath + ", id=" + parent.getFileId()); } - parent = getStorageManager().getFileByPath(remoteParentPath); if (parent == null) { - Log_OC.e(TAG, "parent still null after grantFolderExistence: " + remoteParentPath); - return new RemoteOperationResult<>(ResultCode.UNKNOWN_ERROR); + Log_OC.e(TAG, "parent is null, cannot proceed: " + remoteParentPath + "," + " unlock token: " + mFolderUnlockToken); + return new RemoteOperationResult<>(false, "Parent folder not found", HttpStatus.SC_NOT_FOUND); } - - Log_OC.d(TAG, "remote parent folder confirmed: " + remoteParentPath + ", id=" + parent.getFileId()); } - if (parent == null) { - Log_OC.e(TAG, "parent is null, cannot proceed: " + remoteParentPath + "," + " unlock token: " + mFolderUnlockToken); - return new RemoteOperationResult<>(false, "Parent folder not found", HttpStatus.SC_NOT_FOUND); - } - - // - resume of encrypted upload, then parent file exists already as unlock is only for direct parent - mFile.setParentId(parent.getFileId()); - // check if any parent is encrypted encryptedAncestor = FileStorageUtils.checkEncryptionStatus(parent, getStorageManager()); mFile.setEncrypted(encryptedAncestor); + if (encryptedAncestor && parent != null) { + // - resume of encrypted upload, then parent file exists already as unlock is only for direct parent + mFile.setParentId(parent.getFileId()); + } if (encryptedAncestor) { Log_OC.d(TAG, "⬆️🔗" + "encrypted upload");