From cadc9b18c7a93853070ab705c6ad030edd210267 Mon Sep 17 00:00:00 2001 From: ijklam <43789618+Tangent-90@users.noreply.github.com> Date: Sun, 5 May 2024 01:14:35 +0800 Subject: [PATCH 1/3] support PerformContextMenuAction --- .../Platform/SkiaPlatform/TopLevelImpl.cs | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index c790d658bfd..e8ebbdba8e2 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -54,7 +54,7 @@ public TopLevelImpl(AvaloniaView avaloniaView, bool placeOnTop = false) { throw new ArgumentException("AvaloniaView.Context must not be null"); } - + _view = new ViewImpl(avaloniaView.Context, this, placeOnTop); _textInputMethod = new AndroidInputMethod(_view); _keyboardHelper = new AndroidKeyboardEventsHelper(this); @@ -85,7 +85,7 @@ public TopLevelImpl(AvaloniaView avaloniaView, bool placeOnTop = false) public virtual Size ClientSize => _view.Size.ToSize(RenderScaling); public Size? FrameSize => null; - + public Action? Closed { get; set; } public Action? Input { get; set; } @@ -136,7 +136,7 @@ public void SetInputRoot(IInputRoot inputRoot) { InputRoot = inputRoot; } - + public virtual void Show() { _view.Visibility = ViewStates.Visible; @@ -148,7 +148,7 @@ void Draw() { Paint?.Invoke(new Rect(new Point(0, 0), ClientSize)); } - + public virtual void Dispose() { _systemNavigationManager.Dispose(); @@ -264,11 +264,11 @@ public sealed override IInputConnection OnCreateInputConnection(EditorInfo? outA } public IPopupImpl? CreatePopup() => null; - + public Action? LostFocus { get; set; } public Action? TransparencyLevelChanged { get; set; } - public WindowTransparencyLevel TransparencyLevel + public WindowTransparencyLevel TransparencyLevel { get => _transparencyLevel; private set @@ -679,5 +679,27 @@ public override bool PerformEditorAction([GeneratedEnum] ImeAction actionCode) return extract; } + + public override bool PerformContextMenuAction(int id) + { + switch (id) + { + case global::Android.Resource.Id.SelectAll: + Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.A, RawInputModifiers.Control, PhysicalKey.A, "a")); + return true; + case global::Android.Resource.Id.Cut: + Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.X, RawInputModifiers.Control, PhysicalKey.X, "x")); + return true; + case global::Android.Resource.Id.Copy: + Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.C, RawInputModifiers.Control, PhysicalKey.C, "c")); + return true; + case global::Android.Resource.Id.Paste: + Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.V, RawInputModifiers.Control, PhysicalKey.V, "v")); + return true; + default: + break; + } + return base.PerformContextMenuAction(id); + } } } From 53ab0839842586c5a7949f6eeb05a7bba308003b Mon Sep 17 00:00:00 2001 From: ijklam <43789618+Tangent-90@users.noreply.github.com> Date: Sun, 5 May 2024 01:49:13 +0800 Subject: [PATCH 2/3] update --- .../Platform/SkiaPlatform/TopLevelImpl.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index e8ebbdba8e2..ff823a4a958 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -685,16 +685,16 @@ public override bool PerformContextMenuAction(int id) switch (id) { case global::Android.Resource.Id.SelectAll: - Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.A, RawInputModifiers.Control, PhysicalKey.A, "a")); + Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.A, RawInputModifiers.Control, PhysicalKey.None, "a")); return true; case global::Android.Resource.Id.Cut: - Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.X, RawInputModifiers.Control, PhysicalKey.X, "x")); + Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.X, RawInputModifiers.Control, PhysicalKey.None, "x")); return true; case global::Android.Resource.Id.Copy: - Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.C, RawInputModifiers.Control, PhysicalKey.C, "c")); + Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.C, RawInputModifiers.Control, PhysicalKey.None, "c")); return true; case global::Android.Resource.Id.Paste: - Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.V, RawInputModifiers.Control, PhysicalKey.V, "v")); + Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.V, RawInputModifiers.Control, PhysicalKey.None, "v")); return true; default: break; From 66909c0df6b795e893f625fbac22d130c0e51168 Mon Sep 17 00:00:00 2001 From: ijklam <43789618+Tangent-90@users.noreply.github.com> Date: Thu, 9 May 2024 23:04:50 +0800 Subject: [PATCH 3/3] update to new api --- .../Platform/SkiaPlatform/TopLevelImpl.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index db457d07f84..d3b38c8da21 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -684,19 +684,21 @@ public override bool PerformEditorAction([GeneratedEnum] ImeAction actionCode) public override bool PerformContextMenuAction(int id) { + if (InputMethod.Client is not { } client) return false; + switch (id) { case global::Android.Resource.Id.SelectAll: - Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.A, RawInputModifiers.Control, PhysicalKey.None, "a")); + client.ExecuteContextMenuAction(ContextMenuAction.SelectAll); return true; case global::Android.Resource.Id.Cut: - Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.X, RawInputModifiers.Control, PhysicalKey.None, "x")); + client.ExecuteContextMenuAction(ContextMenuAction.Cut); return true; case global::Android.Resource.Id.Copy: - Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.C, RawInputModifiers.Control, PhysicalKey.None, "c")); + client.ExecuteContextMenuAction(ContextMenuAction.Copy); return true; case global::Android.Resource.Id.Paste: - Toplevel.Input?.Invoke(new RawKeyEventArgs(AndroidKeyboardDevice.Instance!, (ulong)DateTime.Now.Ticks, Toplevel.InputRoot!, RawKeyEventType.KeyDown, Key.V, RawInputModifiers.Control, PhysicalKey.None, "v")); + client.ExecuteContextMenuAction(ContextMenuAction.Paste); return true; default: break;