From 3f306b48abd1dd35ee892d34d9bb375290c6486a Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Tue, 7 Mar 2023 17:06:40 +0100 Subject: [PATCH 1/3] fix(DrawingContext): CS0618 PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' ```bash Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' Avalonia.Direct2D1.RenderTests, Avalonia.Skia.RenderTests .\tests\Avalonia.RenderTests\Media\ConicGradientBrushTests.cs 203 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' Avalonia.Direct2D1.RenderTests, Avalonia.Skia.RenderTests .\tests\Avalonia.RenderTests\Media\LinearGradientBrushTests.cs 98 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' Avalonia.Direct2D1.RenderTests, Avalonia.Skia.RenderTests .\tests\Avalonia.RenderTests\Media\RadialGradientBrushTests.cs 188 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' Avalonia.Direct2D1.RenderTests, Avalonia.Skia.RenderTests .\tests\Avalonia.RenderTests\Media\TextFormatting\TextLayoutTests.cs 315 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' Avalonia.Skia.UnitTests .\tests\Avalonia.Skia.UnitTests\Media\TextFormatting\TextFormatterTests.cs 795 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' ControlCatalog (netstandard2.0) .\samples\ControlCatalog\Pages\CustomDrawingExampleControl.cs 136 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' ControlCatalog (netstandard2.0) .\samples\ControlCatalog\Pages\CustomDrawingExampleControl.cs 140 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' ControlCatalog (netstandard2.0) .\samples\ControlCatalog\Pages\CustomDrawingExampleControl.cs 144 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' ControlCatalog (netstandard2.0) .\samples\ControlCatalog\Pages\CustomDrawingExampleControl.cs 146 Active Warning CS0618 'DrawingContext.PushPostTransform(Matrix)' is obsolete: 'Use PushTransform' RenderDemo .\samples\RenderDemo\Pages\RenderTargetBitmapPage.cs 32 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' Avalonia.Base (net6.0), Avalonia.Base (netstandard2.0) .\src\Avalonia.Base\Media\DrawingGroup.cs 76 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' Avalonia.Direct2D1.RenderTests, Avalonia.Skia.RenderTests .\tests\Avalonia.RenderTests\Controls\CustomRenderTests.cs 91 Active Warning CS0618 'DrawingContext.PushPreTransform(Matrix)' is obsolete: 'Use PushTransform' Avalonia.Direct2D1.RenderTests, Avalonia.Skia.RenderTests .\tests\Avalonia.RenderTests\Controls\CustomRenderTests.cs 115 Active ``` --- .../ControlCatalog/Pages/CustomDrawingExampleControl.cs | 8 ++++---- samples/RenderDemo/Pages/RenderTargetBitmapPage.cs | 2 +- src/Avalonia.Base/Media/DrawingGroup.cs | 2 +- src/Avalonia.Base/Rendering/ImmediateRenderer.cs | 4 ++-- src/Avalonia.Controls/SelectableTextBlock.cs | 2 +- src/Avalonia.Controls/TopLevel.cs | 1 - tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs | 4 ++-- .../Avalonia.RenderTests/Media/ConicGradientBrushTests.cs | 2 +- .../Media/LinearGradientBrushTests.cs | 2 +- .../Media/RadialGradientBrushTests.cs | 2 +- .../Media/TextFormatting/TextLayoutTests.cs | 2 +- .../Media/TextFormatting/TextFormatterTests.cs | 2 +- 12 files changed, 16 insertions(+), 17 deletions(-) diff --git a/samples/ControlCatalog/Pages/CustomDrawingExampleControl.cs b/samples/ControlCatalog/Pages/CustomDrawingExampleControl.cs index db74be7c08..549cf3d740 100644 --- a/samples/ControlCatalog/Pages/CustomDrawingExampleControl.cs +++ b/samples/ControlCatalog/Pages/CustomDrawingExampleControl.cs @@ -133,17 +133,17 @@ namespace ControlCatalog.Pages // 0,0 refers to the top-left of the control now. It is not prime time to draw gui stuff because it'll be under the world - var translateModifier = context.PushPreTransform(Avalonia.Matrix.CreateTranslation(new Avalonia.Vector(halfWidth, halfHeight))); + var translateModifier = context.PushTransform(Avalonia.Matrix.CreateTranslation(new Avalonia.Vector(halfWidth, halfHeight))); // now 0,0 refers to the ViewportCenter(X,Y). var rotationMatrix = Avalonia.Matrix.CreateRotation(Rotation); - var rotationModifier = context.PushPreTransform(rotationMatrix); + var rotationModifier = context.PushTransform(rotationMatrix); // everything is rotated but not scaled - var scaleModifier = context.PushPreTransform(Avalonia.Matrix.CreateScale(Scale, -Scale)); + var scaleModifier = context.PushTransform(Avalonia.Matrix.CreateScale(Scale, -Scale)); - var mapPositionModifier = context.PushPreTransform(Matrix.CreateTranslation(new Vector(-ViewportCenterX, -ViewportCenterY))); + var mapPositionModifier = context.PushTransform(Matrix.CreateTranslation(new Vector(-ViewportCenterX, -ViewportCenterY))); // now everything is rotated and scaled, and at the right position, now we're drawing strictly in world coordinates diff --git a/samples/RenderDemo/Pages/RenderTargetBitmapPage.cs b/samples/RenderDemo/Pages/RenderTargetBitmapPage.cs index b88dded39b..8d6fb15a32 100644 --- a/samples/RenderDemo/Pages/RenderTargetBitmapPage.cs +++ b/samples/RenderDemo/Pages/RenderTargetBitmapPage.cs @@ -29,7 +29,7 @@ namespace RenderDemo.Pages public override void Render(DrawingContext context) { using (var ctx = _bitmap.CreateDrawingContext()) - using (ctx.PushPostTransform(Matrix.CreateTranslation(-100, -100) + using (ctx.PushTransform(Matrix.CreateTranslation(-100, -100) * Matrix.CreateRotation(_st.Elapsed.TotalSeconds) * Matrix.CreateTranslation(100, 100))) { diff --git a/src/Avalonia.Base/Media/DrawingGroup.cs b/src/Avalonia.Base/Media/DrawingGroup.cs index a41054202e..a0ed29250b 100644 --- a/src/Avalonia.Base/Media/DrawingGroup.cs +++ b/src/Avalonia.Base/Media/DrawingGroup.cs @@ -73,7 +73,7 @@ namespace Avalonia.Media { var bounds = GetBounds(); - using (context.PushPreTransform(Transform?.Value ?? Matrix.Identity)) + using (context.PushTransform(Transform?.Value ?? Matrix.Identity)) using (context.PushOpacity(Opacity, bounds)) using (ClipGeometry != null ? context.PushGeometryClip(ClipGeometry) : default) using (OpacityMask != null ? context.PushOpacityMask(OpacityMask, bounds) : default) diff --git a/src/Avalonia.Base/Rendering/ImmediateRenderer.cs b/src/Avalonia.Base/Rendering/ImmediateRenderer.cs index 4a12e78817..9b7d358b1d 100644 --- a/src/Avalonia.Base/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Base/Rendering/ImmediateRenderer.cs @@ -83,7 +83,7 @@ namespace Avalonia.Rendering } } - using (context.PushPostTransform(m)) + using (context.PushTransform(m)) using (context.PushOpacity(opacity, bounds)) using (clipToBounds #pragma warning disable CS0618 // Type or member is obsolete @@ -95,7 +95,7 @@ namespace Avalonia.Rendering using (visual.Clip != null ? context.PushGeometryClip(visual.Clip) : default) using (visual.OpacityMask != null ? context.PushOpacityMask(visual.OpacityMask, bounds) : default) - using (context.PushTransformContainer()) + using (context.PushTransform(Matrix.Identity)) { visual.Render(context); diff --git a/src/Avalonia.Controls/SelectableTextBlock.cs b/src/Avalonia.Controls/SelectableTextBlock.cs index 6603e20a2a..a737c94719 100644 --- a/src/Avalonia.Controls/SelectableTextBlock.cs +++ b/src/Avalonia.Controls/SelectableTextBlock.cs @@ -204,7 +204,7 @@ namespace Avalonia.Controls var rects = TextLayout.HitTestTextRange(start, length); - using (context.PushPostTransform(Matrix.CreateTranslation(origin))) + using (context.PushTransform(Matrix.CreateTranslation(origin))) { foreach (var rect in rects) { diff --git a/src/Avalonia.Controls/TopLevel.cs b/src/Avalonia.Controls/TopLevel.cs index 5c2a8c8a13..dcf387afab 100644 --- a/src/Avalonia.Controls/TopLevel.cs +++ b/src/Avalonia.Controls/TopLevel.cs @@ -15,7 +15,6 @@ using Avalonia.LogicalTree; using Avalonia.Media; using Avalonia.Platform; using Avalonia.Platform.Storage; -using Avalonia.Reactive; using Avalonia.Rendering; using Avalonia.Styling; using Avalonia.Utilities; diff --git a/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs b/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs index 1199184d14..7a2c60baf4 100644 --- a/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs +++ b/tests/Avalonia.RenderTests/Controls/CustomRenderTests.cs @@ -88,7 +88,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls Height = 200, Child = new CustomRenderer((control, context) => { - using (var transform = context.PushPreTransform(Matrix.CreateTranslation(100, 100))) + using (var transform = context.PushTransform(Matrix.CreateTranslation(100, 100))) using (var clip = context.PushClip(new Rect(0, 0, 100, 100))) { context.FillRectangle(Brushes.Blue, new Rect(0, 0, 200, 200)); @@ -112,7 +112,7 @@ namespace Avalonia.Direct2D1.RenderTests.Controls Height = 200, Child = new CustomRenderer((control, context) => { - using (var transform = context.PushPreTransform(Matrix.CreateTranslation(100, 100))) + using (var transform = context.PushTransform(Matrix.CreateTranslation(100, 100))) using (var clip = context.PushClip(new Rect(0, 0, 100, 100))) { context.FillRectangle(Brushes.Blue, new Rect(0, 0, 200, 200)); diff --git a/tests/Avalonia.RenderTests/Media/ConicGradientBrushTests.cs b/tests/Avalonia.RenderTests/Media/ConicGradientBrushTests.cs index ef400410a4..a6170f9e94 100644 --- a/tests/Avalonia.RenderTests/Media/ConicGradientBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/ConicGradientBrushTests.cs @@ -200,7 +200,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media Child = new DrawnControl(c => { c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100)); - using (c.PushPreTransform(Matrix.CreateTranslation(100, 100))) + using (c.PushTransform(Matrix.CreateTranslation(100, 100))) c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100)); }), }; diff --git a/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs b/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs index dd9d2f9b39..ac49b6d078 100644 --- a/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/LinearGradientBrushTests.cs @@ -95,7 +95,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media { c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100)); - using (c.PushPreTransform(Matrix.CreateTranslation(100, 100))) + using (c.PushTransform(Matrix.CreateTranslation(100, 100))) c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100)); }), }; diff --git a/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs b/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs index e52f844359..78f1b5c23f 100644 --- a/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs +++ b/tests/Avalonia.RenderTests/Media/RadialGradientBrushTests.cs @@ -185,7 +185,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media Child = new DrawnControl(c => { c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100)); - using (c.PushPreTransform(Matrix.CreateTranslation(100, 100))) + using (c.PushTransform(Matrix.CreateTranslation(100, 100))) c.DrawRectangle(brush, null, new Rect(0, 0, 100, 100)); }), }; diff --git a/tests/Avalonia.RenderTests/Media/TextFormatting/TextLayoutTests.cs b/tests/Avalonia.RenderTests/Media/TextFormatting/TextLayoutTests.cs index 7b128076cd..65fd670415 100644 --- a/tests/Avalonia.RenderTests/Media/TextFormatting/TextLayoutTests.cs +++ b/tests/Avalonia.RenderTests/Media/TextFormatting/TextLayoutTests.cs @@ -312,7 +312,7 @@ namespace Avalonia.Direct2D1.RenderTests.Media var rotate = Matrix.CreateTranslation(-100, -100) * Matrix.CreateRotation(MathUtilities.Deg2Rad(90)) * Matrix.CreateTranslation(100, 100); - using var transform = c.PushPreTransform(rotate); + using var transform = c.PushTransform(rotate); c.DrawRectangle(Brushes.Yellow, null, rect); t.Draw(c, rect.Position); }), diff --git a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextFormatterTests.cs b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextFormatterTests.cs index dc8744b292..540c05f0da 100644 --- a/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextFormatterTests.cs +++ b/tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextFormatterTests.cs @@ -792,7 +792,7 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting public override double Baseline => 0; public override void Draw(DrawingContext drawingContext, Point origin) { - using (drawingContext.PushPreTransform(Matrix.CreateTranslation(new Vector(origin.X, 0)))) + using (drawingContext.PushTransform(Matrix.CreateTranslation(new Vector(origin.X, 0)))) { drawingContext.FillRectangle(_fill, _rect); } From ad220a6af67f5498ec312bcf9ce152889fe3c7f1 Mon Sep 17 00:00:00 2001 From: Giuseppe Lippolis Date: Tue, 7 Mar 2023 17:14:38 +0100 Subject: [PATCH 2/3] fix: CS0618 'DataFormats.FileNames' is obsolete: 'Use DataFormats.Files Warning CS0618 'DataFormats.FileNames' is obsolete: 'Use DataFormats.Files, this format is supported only on desktop platforms.' ControlCatalog (net6.0), ControlCatalog (netstandard2.0) .\samples\ControlCatalog\Pages\ClipboardPage.xaml.cs 69 Active Warning CS0618 'DataFormats.FileNames' is obsolete: 'Use DataFormats.Files, this format is supported only on desktop platforms.' ControlCatalog (net6.0), ControlCatalog (netstandard2.0) .\samples\ControlCatalog\Pages\ClipboardPage.xaml.cs 78 Active --- .../Pages/ClipboardPage.xaml.cs | 59 +++++++++++++++---- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/samples/ControlCatalog/Pages/ClipboardPage.xaml.cs b/samples/ControlCatalog/Pages/ClipboardPage.xaml.cs index ef3d2bbafa..f3890aa49a 100644 --- a/samples/ControlCatalog/Pages/ClipboardPage.xaml.cs +++ b/samples/ControlCatalog/Pages/ClipboardPage.xaml.cs @@ -1,16 +1,22 @@ using System; using System.Collections.Generic; - +using System.Linq; using Avalonia; using Avalonia.Controls; +using Avalonia.Controls.Notifications; using Avalonia.Input; using Avalonia.Interactivity; using Avalonia.Markup.Xaml; +using Avalonia.Platform; +using Avalonia.Platform.Storage; namespace ControlCatalog.Pages { public partial class ClipboardPage : UserControl { + private INotificationManager? _notificationManager; + private INotificationManager NotificationManager => _notificationManager + ??= new WindowNotificationManager(TopLevel.GetTopLevel(this)!); public ClipboardPage() { InitializeComponent(); @@ -31,7 +37,7 @@ namespace ControlCatalog.Pages private async void PasteText(object? sender, RoutedEventArgs args) { - if(Application.Current!.Clipboard is { } clipboard) + if (Application.Current!.Clipboard is { } clipboard) { ClipboardContent.Text = await clipboard.GetTextAsync(); } @@ -59,15 +65,45 @@ namespace ControlCatalog.Pages { if (Application.Current!.Clipboard is { } clipboard) { - var files = (ClipboardContent.Text ?? String.Empty) - .Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); - if (files.Length == 0) + var storageProvider = TopLevel.GetTopLevel(this)!.StorageProvider; + var filesPath = (ClipboardContent.Text ?? string.Empty) + .Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + if (filesPath.Length == 0) { return; } - var dataObject = new DataObject(); - dataObject.Set(DataFormats.FileNames, files); - await clipboard.SetDataObjectAsync(dataObject); + List invalidFile = new(filesPath.Length); + List files = new(filesPath.Length); + + for (int i = 0; i < filesPath.Length; i++) + { + var file = await storageProvider.TryGetFileFromPathAsync(filesPath[i]); + if (file is null) + { + invalidFile.Add(filesPath[i]); + } + else + { + files.Add(file); + } + } + + if (invalidFile.Count > 0) + { + NotificationManager.Show(new Notification("Warning", "There is one o more invalid path.", NotificationType.Warning)); + } + + if (files.Count > 0) + { + var dataObject = new DataObject(); + dataObject.Set(DataFormats.Files, files); + await clipboard.SetDataObjectAsync(dataObject); + NotificationManager.Show(new Notification("Success", "Copy completated.", NotificationType.Success)); + } + else + { + NotificationManager.Show(new Notification("Warning", "Any files to copy in Clipboard.", NotificationType.Warning)); + } } } @@ -75,8 +111,9 @@ namespace ControlCatalog.Pages { if (Application.Current!.Clipboard is { } clipboard) { - var fiels = await clipboard.GetDataAsync(DataFormats.FileNames) as IEnumerable; - ClipboardContent.Text = fiels != null ? string.Join(Environment.NewLine, fiels) : string.Empty; + var files = await clipboard.GetDataAsync(DataFormats.Files) as IEnumerable; + + ClipboardContent.Text = files != null ? string.Join(Environment.NewLine, files.Select(f => f.Path)) : string.Empty; } } @@ -95,7 +132,7 @@ namespace ControlCatalog.Pages { await clipboard.ClearAsync(); } - + } } } From 9dba61d56dee86ede8847178705ce1d363710ce4 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Fri, 17 Mar 2023 23:23:10 +0900 Subject: [PATCH 3/3] Minor improvements of clipboard page demo --- .../ControlCatalog/Pages/ClipboardPage.xaml.cs | 3 ++- .../Storage/FileIO/StorageProviderHelpers.cs | 17 ++++++++++++++++- .../Storage/StorageProviderExtensions.cs | 16 +++++++++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/samples/ControlCatalog/Pages/ClipboardPage.xaml.cs b/samples/ControlCatalog/Pages/ClipboardPage.xaml.cs index f3890aa49a..b6b2ac7181 100644 --- a/samples/ControlCatalog/Pages/ClipboardPage.xaml.cs +++ b/samples/ControlCatalog/Pages/ClipboardPage.xaml.cs @@ -9,6 +9,7 @@ using Avalonia.Interactivity; using Avalonia.Markup.Xaml; using Avalonia.Platform; using Avalonia.Platform.Storage; +using Avalonia.Platform.Storage.FileIO; namespace ControlCatalog.Pages { @@ -113,7 +114,7 @@ namespace ControlCatalog.Pages { var files = await clipboard.GetDataAsync(DataFormats.Files) as IEnumerable; - ClipboardContent.Text = files != null ? string.Join(Environment.NewLine, files.Select(f => f.Path)) : string.Empty; + ClipboardContent.Text = files != null ? string.Join(Environment.NewLine, files.Select(f => f.TryGetLocalPath() ?? f.Name)) : string.Empty; } } diff --git a/src/Avalonia.Base/Platform/Storage/FileIO/StorageProviderHelpers.cs b/src/Avalonia.Base/Platform/Storage/FileIO/StorageProviderHelpers.cs index a8cbffb417..608f924808 100644 --- a/src/Avalonia.Base/Platform/Storage/FileIO/StorageProviderHelpers.cs +++ b/src/Avalonia.Base/Platform/Storage/FileIO/StorageProviderHelpers.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; using System.Text; @@ -23,7 +24,7 @@ internal static class StorageProviderHelpers return null; } - + public static Uri FilePathToUri(string path) { var uriPath = new StringBuilder(path) @@ -35,6 +36,20 @@ internal static class StorageProviderHelpers return new UriBuilder("file", string.Empty) { Path = uriPath }.Uri; } + public static bool TryFilePathToUri(string path, [NotNullWhen(true)] out Uri? uri) + { + try + { + uri = FilePathToUri(path); + return true; + } + catch + { + uri = null; + return false; + } + } + public static string NameWithExtension(string path, string? defaultExtension, FilePickerFileType? filter) { var name = Path.GetFileName(path); diff --git a/src/Avalonia.Base/Platform/Storage/StorageProviderExtensions.cs b/src/Avalonia.Base/Platform/Storage/StorageProviderExtensions.cs index 1febb4506a..3933d23e4f 100644 --- a/src/Avalonia.Base/Platform/Storage/StorageProviderExtensions.cs +++ b/src/Avalonia.Base/Platform/Storage/StorageProviderExtensions.cs @@ -16,8 +16,13 @@ public static class StorageProviderExtensions { return Task.FromResult(StorageProviderHelpers.TryCreateBclStorageItem(filePath) as IStorageFile); } - - return provider.TryGetFileFromPathAsync(StorageProviderHelpers.FilePathToUri(filePath)); + + if (StorageProviderHelpers.TryFilePathToUri(filePath, out var uri)) + { + return provider.TryGetFileFromPathAsync(uri); + } + + return Task.FromResult(null); } /// @@ -29,7 +34,12 @@ public static class StorageProviderExtensions return Task.FromResult(StorageProviderHelpers.TryCreateBclStorageItem(folderPath) as IStorageFolder); } - return provider.TryGetFolderFromPathAsync(StorageProviderHelpers.FilePathToUri(folderPath)); + if (StorageProviderHelpers.TryFilePathToUri(folderPath, out var uri)) + { + return provider.TryGetFolderFromPathAsync(uri); + } + + return Task.FromResult(null); } ///