Browse Source

fix crash when accessing clipbord on android

pull/10743/head
Emmanuel Hansen 3 years ago
parent
commit
b9726fd381
  1. 2
      src/Android/Avalonia.Android/AndroidPlatform.cs
  2. 30
      src/Android/Avalonia.Android/Platform/ClipboardImpl.cs
  3. 5
      src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs

2
src/Android/Avalonia.Android/AndroidPlatform.cs

@ -38,7 +38,7 @@ namespace Avalonia.Android
Options = AvaloniaLocator.Current.GetService<AndroidPlatformOptions>() ?? new AndroidPlatformOptions(); Options = AvaloniaLocator.Current.GetService<AndroidPlatformOptions>() ?? new AndroidPlatformOptions();
AvaloniaLocator.CurrentMutable AvaloniaLocator.CurrentMutable
.Bind<IClipboard>().ToTransient<ClipboardImpl>() .Bind<IClipboard>().ToConstant(new ClipboardImpl())
.Bind<ICursorFactory>().ToTransient<CursorFactory>() .Bind<ICursorFactory>().ToTransient<CursorFactory>()
.Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformStub()) .Bind<IWindowingPlatform>().ToConstant(new WindowingPlatformStub())
.Bind<IKeyboardDevice>().ToSingleton<AndroidKeyboardDevice>() .Bind<IKeyboardDevice>().ToSingleton<AndroidKeyboardDevice>()

30
src/Android/Avalonia.Android/Platform/ClipboardImpl.cs

@ -2,32 +2,26 @@ using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Android.Content; using Android.Content;
using Android.Runtime;
using Android.Views;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.Platform; using Avalonia.Input.Platform;
using Avalonia.Platform;
namespace Avalonia.Android.Platform namespace Avalonia.Android.Platform
{ {
internal class ClipboardImpl : IClipboard internal class ClipboardImpl : IClipboard
{ {
private Context context = (AvaloniaLocator.Current.GetService<IWindowImpl>() as View).Context; private ClipboardManager? _clipboardManager;
private ClipboardManager ClipboardManager internal void SetClipboardManager(ClipboardManager? value)
{ {
get _clipboardManager = value;
{
return this.context.GetSystemService(Context.ClipboardService).JavaCast<ClipboardManager>();
}
} }
public Task<string> GetTextAsync() public Task<string> GetTextAsync()
{ {
if (ClipboardManager.HasPrimaryClip) if (_clipboardManager?.HasPrimaryClip == true)
{ {
return Task.FromResult<string>(ClipboardManager.PrimaryClip.GetItemAt(0).Text); return Task.FromResult<string>(_clipboardManager.PrimaryClip.GetItemAt(0).Text);
} }
return Task.FromResult<string>(null); return Task.FromResult<string>(null);
@ -35,15 +29,25 @@ namespace Avalonia.Android.Platform
public Task SetTextAsync(string text) public Task SetTextAsync(string text)
{ {
if(_clipboardManager == null)
{
return Task.CompletedTask;
}
ClipData clip = ClipData.NewPlainText("text", text); ClipData clip = ClipData.NewPlainText("text", text);
ClipboardManager.PrimaryClip = clip; _clipboardManager.PrimaryClip = clip;
return Task.FromResult<object>(null); return Task.FromResult<object>(null);
} }
public Task ClearAsync() public Task ClearAsync()
{ {
ClipboardManager.PrimaryClip = null; if (_clipboardManager == null)
{
return Task.CompletedTask;
}
_clipboardManager.PrimaryClip = null;
return Task.FromResult<object>(null); return Task.FromResult<object>(null);
} }

5
src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs

@ -29,6 +29,8 @@ using Window = Android.Views.Window;
using Android.Graphics.Drawables; using Android.Graphics.Drawables;
using Android.OS; using Android.OS;
using Android.Text; using Android.Text;
using Avalonia.Input.Platform;
using ClipboardManager = Android.Content.ClipboardManager;
namespace Avalonia.Android.Platform.SkiaPlatform namespace Avalonia.Android.Platform.SkiaPlatform
{ {
@ -55,6 +57,9 @@ namespace Avalonia.Android.Platform.SkiaPlatform
_gl = new EglGlPlatformSurface(this); _gl = new EglGlPlatformSurface(this);
_framebuffer = new FramebufferManager(this); _framebuffer = new FramebufferManager(this);
(AvaloniaLocator.Current.GetRequiredService<IClipboard>() as ClipboardImpl)?
.SetClipboardManager(avaloniaView.Context?.GetSystemService(Context.ClipboardService).JavaCast<ClipboardManager>());
RenderScaling = _view.Scaling; RenderScaling = _view.Scaling;
MaxClientSize = new PixelSize(_view.Resources.DisplayMetrics.WidthPixels, MaxClientSize = new PixelSize(_view.Resources.DisplayMetrics.WidthPixels,

Loading…
Cancel
Save