diff --git a/src/Android/Avalonia.Android/AndroidPlatform.cs b/src/Android/Avalonia.Android/AndroidPlatform.cs index daecb58a60..69fefb009a 100644 --- a/src/Android/Avalonia.Android/AndroidPlatform.cs +++ b/src/Android/Avalonia.Android/AndroidPlatform.cs @@ -38,7 +38,7 @@ namespace Avalonia.Android Options = AvaloniaLocator.Current.GetService() ?? new AndroidPlatformOptions(); AvaloniaLocator.CurrentMutable - .Bind().ToTransient() + .Bind().ToConstant(new ClipboardImpl()) .Bind().ToTransient() .Bind().ToConstant(new WindowingPlatformStub()) .Bind().ToSingleton() diff --git a/src/Android/Avalonia.Android/Platform/ClipboardImpl.cs b/src/Android/Avalonia.Android/Platform/ClipboardImpl.cs index d1a116345b..edad115615 100644 --- a/src/Android/Avalonia.Android/Platform/ClipboardImpl.cs +++ b/src/Android/Avalonia.Android/Platform/ClipboardImpl.cs @@ -2,32 +2,26 @@ using System; using System.Threading.Tasks; using Android.Content; -using Android.Runtime; -using Android.Views; using Avalonia.Input; using Avalonia.Input.Platform; -using Avalonia.Platform; namespace Avalonia.Android.Platform { internal class ClipboardImpl : IClipboard { - private Context context = (AvaloniaLocator.Current.GetService() as View).Context; + private ClipboardManager? _clipboardManager; - private ClipboardManager ClipboardManager + internal void SetClipboardManager(ClipboardManager? value) { - get - { - return this.context.GetSystemService(Context.ClipboardService).JavaCast(); - } + _clipboardManager = value; } public Task GetTextAsync() { - if (ClipboardManager.HasPrimaryClip) + if (_clipboardManager?.HasPrimaryClip == true) { - return Task.FromResult(ClipboardManager.PrimaryClip.GetItemAt(0).Text); + return Task.FromResult(_clipboardManager.PrimaryClip.GetItemAt(0).Text); } return Task.FromResult(null); @@ -35,15 +29,25 @@ namespace Avalonia.Android.Platform public Task SetTextAsync(string text) { + if(_clipboardManager == null) + { + return Task.CompletedTask; + } + ClipData clip = ClipData.NewPlainText("text", text); - ClipboardManager.PrimaryClip = clip; + _clipboardManager.PrimaryClip = clip; return Task.FromResult(null); } public Task ClearAsync() { - ClipboardManager.PrimaryClip = null; + if (_clipboardManager == null) + { + return Task.CompletedTask; + } + + _clipboardManager.PrimaryClip = null; return Task.FromResult(null); } diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index b8d80a50ff..6db436bd38 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -29,6 +29,8 @@ using Window = Android.Views.Window; using Android.Graphics.Drawables; using Android.OS; using Android.Text; +using Avalonia.Input.Platform; +using ClipboardManager = Android.Content.ClipboardManager; namespace Avalonia.Android.Platform.SkiaPlatform { @@ -55,6 +57,9 @@ namespace Avalonia.Android.Platform.SkiaPlatform _gl = new EglGlPlatformSurface(this); _framebuffer = new FramebufferManager(this); + (AvaloniaLocator.Current.GetRequiredService() as ClipboardImpl)? + .SetClipboardManager(avaloniaView.Context?.GetSystemService(Context.ClipboardService).JavaCast()); + RenderScaling = _view.Scaling; MaxClientSize = new PixelSize(_view.Resources.DisplayMetrics.WidthPixels,