Browse Source

clean up; apply only changed text to editable

pull/12270/head
Emmanuel Hansen 3 years ago
parent
commit
368de7e79f
  1. 32
      src/Android/Avalonia.Android/AndroidInputMethod.cs
  2. 16
      src/Android/Avalonia.Android/Platform/SkiaPlatform/TopLevelImpl.cs

32
src/Android/Avalonia.Android/AndroidInputMethod.cs

@ -114,16 +114,42 @@ namespace Avalonia.Android
private void _client_SurroundingTextChanged(object sender, EventArgs e)
{
var surroundingText = _client.SurroundingText ?? "";
var editableText = _inputConnection.EditableWrapper.ToString();
_inputConnection.EditableWrapper.IgnoreChange = true;
if (editableText != surroundingText)
{
_inputConnection.EditableWrapper.IgnoreChange = true;
var diff = GetDiff();
_inputConnection.Editable.Replace(0, _inputConnection.Editable.Length(), surroundingText);
_inputConnection.Editable.Replace(diff.index, editableText.Length, diff.diff);
_inputConnection.EditableWrapper.IgnoreChange = false;
_inputConnection.EditableWrapper.IgnoreChange = false;
}
var selection = Client.Selection;
_imm.UpdateSelection(_host, selection.Start, selection.End, selection.Start, selection.End);
(int index, string diff) GetDiff()
{
int index = 0;
var longerLength = Math.Max(surroundingText.Length, editableText.Length);
for(int i = 0; i < longerLength; i++)
{
if (surroundingText.Length == i || editableText.Length == i || surroundingText[i] != editableText[i])
{
index = i;
break;
}
}
var diffString = surroundingText.Substring(index, surroundingText.Length - index);
return (index, diffString);
}
}
public void SetCursorRect(Rect rect)

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

@ -447,6 +447,8 @@ namespace Avalonia.Android.Platform.SkiaPlatform
{
private readonly AvaloniaInputConnection _inputConnection;
public event EventHandler<int> SelectionChanged;
public EditableWrapper(AvaloniaInputConnection inputConnection)
{
_inputConnection = inputConnection;
@ -458,8 +460,6 @@ namespace Avalonia.Android.Platform.SkiaPlatform
{
if (!IgnoreChange && start != end)
{
var text = tb.SubSequence(0, tb.Length());
SelectSurroundingTextForDeletion(start, end);
}
@ -470,8 +470,6 @@ namespace Avalonia.Android.Platform.SkiaPlatform
{
if (!IgnoreChange && start != end)
{
var text = tb.SubSequence(tbstart, tbend);
SelectSurroundingTextForDeletion(start, end);
}
@ -482,6 +480,11 @@ namespace Avalonia.Android.Platform.SkiaPlatform
{
_inputConnection.InputMethod.Client.Selection = new TextSelection(start, end);
}
public override void SetSpan(Java.Lang.Object what, int start, int end, [GeneratedEnum] SpanTypes flags)
{
base.SetSpan(what, start, end, flags);
}
}
internal class AvaloniaInputConnection : BaseInputConnection
@ -548,11 +551,6 @@ namespace Avalonia.Android.Platform.SkiaPlatform
if (_inputMethod.IsActive && !string.IsNullOrEmpty(committedText))
{
if(_composingRegion != null)
{
_inputMethod.Client.Selection = new TextSelection(_composingRegion.Value.Start, _composingRegion.Value.End);
}
_toplevel.TextInput(committedText);
_composingRegion = null;

Loading…
Cancel
Save