diff --git a/src/Android/Avalonia.Android/AndroidInputMethod.cs b/src/Android/Avalonia.Android/AndroidInputMethod.cs index cf966ba597..81b1e91285 100644 --- a/src/Android/Avalonia.Android/AndroidInputMethod.cs +++ b/src/Android/Avalonia.Android/AndroidInputMethod.cs @@ -95,11 +95,11 @@ namespace Avalonia.Android public void SetOptions(TextInputOptions options) { - _host.InitEditorInfo((_host, outAttrs) => - { - _inputConnection?.CommitText("", 0); + _inputConnection = new InputConnectionImpl(_host, this); - _inputConnection = new InputConnectionImpl(_host, this); + _host.InitEditorInfo((_host, outAttrs) => + { + _inputConnection?.FinishComposingText(); outAttrs.InputType = options.ContentType switch { diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs index d88c81653c..f4dbe091a9 100644 --- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs +++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs @@ -272,8 +272,20 @@ namespace Avalonia.Android.Platform.SkiaPlatform { } + public ComposingRegion ComposingRegion { get; private set; } + public string CompositionText { get; private set; } + public override bool SetSelection(int start, int end) + { + if (_inputMethod.IsActive) + { + _inputMethod.Client.SelectInSurroundingText(start, end); + } + + return base.SetSelection(start, end); + } + public override bool SetComposingRegion(int start, int end) { if (_inputMethod.IsActive) @@ -281,6 +293,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform var surroundingText = _inputMethod.Client.SurroundingText; System.Diagnostics.Debug.WriteLine($"Composing Region: [{start}|{end}] {surroundingText.Text?.Substring(start, end - start)}"); + + ComposingRegion = new ComposingRegion(start, end); } return base.SetComposingRegion(start, end); @@ -291,11 +305,6 @@ namespace Avalonia.Android.Platform.SkiaPlatform return base.CommitCorrection(correctionInfo); } - public override bool DeleteSurroundingTextInCodePoints(int beforeLength, int afterLength) - { - return base.DeleteSurroundingTextInCodePoints(beforeLength, afterLength); - } - public override bool DeleteSurroundingText(int beforeLength, int afterLength) { if (_inputMethod.IsActive && _inputMethod.Client.SupportsSurroundingText) @@ -320,7 +329,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform var text = surroundingText.Text.Substring(start, end - start); - System.Diagnostics.Debug.WriteLine($"Text Before: {text}"); + //System.Diagnostics.Debug.WriteLine($"Text Before: {text}"); return new Java.Lang.String(text); } @@ -343,7 +352,7 @@ namespace Avalonia.Android.Platform.SkiaPlatform var text = surroundingText.Text.Substring(start, end - start); - System.Diagnostics.Debug.WriteLine($"Text After: {text}"); + //System.Diagnostics.Debug.WriteLine($"Text After: {text}"); return new Java.Lang.String(text); } @@ -359,23 +368,50 @@ namespace Avalonia.Android.Platform.SkiaPlatform if (_inputMethod.IsActive) { _inputMethod.Client.SetPreeditText(CompositionText); + + if (!string.IsNullOrEmpty(CompositionText)) + { + ComposingRegion = default; + } } return base.SetComposingText(text, newCursorPosition); } public override bool CommitText(ICharSequence text, int newCursorPosition) - { + { CompositionText = null; if (_inputMethod.IsActive) { _inputMethod.Client.SetPreeditText(null); + + if (string.IsNullOrEmpty(CompositionText) && ComposingRegion.Start != ComposingRegion.End) + { + _inputMethod.Client.SelectInSurroundingText(ComposingRegion.Start, ComposingRegion.End); + } } + ComposingRegion = default; + return base.CommitText(text, newCursorPosition); } + public override bool PerformEditorAction([GeneratedEnum] ImeAction actionCode) + { + return base.PerformEditorAction(actionCode); + } + + public override bool PerformPrivateCommand(string action, Bundle data) + { + return base.PerformPrivateCommand(action, data); + } + + public override bool SendKeyEvent(KeyEvent e) + { + return base.SendKeyEvent(e); + } + public override bool FinishComposingText() { CompositionText = null; @@ -386,6 +422,19 @@ namespace Avalonia.Android.Platform.SkiaPlatform } return base.FinishComposingText(); + } + } + + public readonly struct ComposingRegion + { + public ComposingRegion(int start, int end) + { + Start = start; + End = end; } + + public int Start { get; } + + public int End { get; } } }