From 8631bc1bc798bad0924c9ff91f31cd4e310a9d6c Mon Sep 17 00:00:00 2001 From: Paulsams <47255112+Paulsams@users.noreply.github.com> Date: Fri, 27 Feb 2026 15:45:48 +0300 Subject: [PATCH] Fixed the creation of files/folders in a subfolder, as well as its deletion on android (#20578) (#20750) * fix creation of files/folders in subfolder (instead of the root folder) * fix delete subfolder (instead of the root folder) Co-authored-by: Julien Lebosquain Co-authored-by: Emmanuel Hansen --- .../Platform/Storage/AndroidStorageItem.cs | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs index d8cd173183..31c4d0c60c 100644 --- a/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs +++ b/src/Android/Avalonia.Android/Platform/Storage/AndroidStorageItem.cs @@ -159,7 +159,7 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder public Task CreateFileAsync(string name) { var mimeType = MimeTypeMap.Singleton?.GetMimeTypeFromExtension(MimeTypeMap.GetFileExtensionFromUrl(name)) ?? "application/octet-stream"; - var treeUri = DocumentsContract.BuildDocumentUriUsingTree(Uri, DocumentsContract.GetTreeDocumentId(Uri)); + var treeUri = GetTreeUri().treeUri; var newFile = DocumentsContract.CreateDocument(Activity.ContentResolver!, treeUri!, mimeType, name); if(newFile == null) { @@ -171,7 +171,7 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder public Task CreateFolderAsync(string name) { - var treeUri = DocumentsContract.BuildDocumentUriUsingTree(Uri, DocumentsContract.GetTreeDocumentId(Uri)); + var treeUri = GetTreeUri().treeUri; var newFolder = DocumentsContract.CreateDocument(Activity.ContentResolver!, treeUri!, DocumentsContract.Document.MimeTypeDir, name); if (newFolder == null) { @@ -207,7 +207,7 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder } } - var treeUri = DocumentsContract.BuildDocumentUriUsingTree(storageFolder.Uri, DocumentsContract.GetTreeDocumentId(storageFolder.Uri)); + var treeUri = GetTreeUri().treeUri; DocumentsContract.DeleteDocument(Activity.ContentResolver!, treeUri!); } } @@ -230,9 +230,7 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder yield break; } - var root = PermissionRoot ?? Uri; - var folderId = root != Uri ? DocumentsContract.GetDocumentId(Uri) : DocumentsContract.GetTreeDocumentId(Uri); - var childrenUri = DocumentsContract.BuildChildDocumentsUriUsingTree(root, folderId); + var (root, childrenUri) = GetTreeUri(); var projection = new[] { @@ -311,9 +309,7 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder return null; } - var root = PermissionRoot ?? Uri; - var folderId = root != Uri ? DocumentsContract.GetDocumentId(Uri) : DocumentsContract.GetTreeDocumentId(Uri); - var childrenUri = DocumentsContract.BuildChildDocumentsUriUsingTree(root, folderId); + var (root, childrenUri) = GetTreeUri(); var projection = new[] { @@ -370,6 +366,13 @@ internal class AndroidStorageFolder : AndroidStorageItem, IStorageBookmarkFolder var file = await GetItemAsync(name, false); return (IStorageFile?)file; } + + private (AndroidUri root, AndroidUri? treeUri) GetTreeUri() + { + var root = PermissionRoot ?? Uri; + var folderId = root != Uri ? DocumentsContract.GetDocumentId(Uri) : DocumentsContract.GetTreeDocumentId(Uri); + return (root, DocumentsContract.BuildChildDocumentsUriUsingTree(root, folderId)); + } } internal sealed class WellKnownAndroidStorageFolder : AndroidStorageFolder