From 19b2aeb119c8fbee235c2ea4fa5b9f015de00ada Mon Sep 17 00:00:00 2001 From: kerams Date: Tue, 29 Jul 2025 14:27:09 +0200 Subject: [PATCH] Fix multiline selection crash (#19337) --- .../Platform/Input/AvaloniaInputConnection.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Android/Avalonia.Android/Platform/Input/AvaloniaInputConnection.cs b/src/Android/Avalonia.Android/Platform/Input/AvaloniaInputConnection.cs index 80d86f1c86..39e1574901 100644 --- a/src/Android/Avalonia.Android/Platform/Input/AvaloniaInputConnection.cs +++ b/src/Android/Avalonia.Android/Platform/Input/AvaloniaInputConnection.cs @@ -285,14 +285,14 @@ namespace Avalonia.Android.Platform.Input public ICharSequence? GetTextAfterCursorFormatted(int n, [GeneratedEnum] GetTextFlags flags) { var end = Math.Min(_editBuffer.Selection.End, _editBuffer.Text.Length); - return new Java.Lang.String(_editBuffer.Text.Substring(end, Math.Min(n, _editBuffer.Text.Length - end))); + return SafeSubstring(_editBuffer.Text, end, Math.Min(n, _editBuffer.Text.Length - end)); } public ICharSequence? GetTextBeforeCursorFormatted(int n, [GeneratedEnum] GetTextFlags flags) { var start = Math.Max(0, _editBuffer.Selection.Start - n); var length = _editBuffer.Selection.Start - start; - return _editBuffer.Text == null ? null : new Java.Lang.String(_editBuffer.Text.Substring(start, length)); + return SafeSubstring(_editBuffer.Text, start, length); } public bool PerformPrivateCommand(string? action, Bundle? data) @@ -330,5 +330,13 @@ namespace Avalonia.Android.Platform.Input EndBatchEdit(); } } + + private static ICharSequence? SafeSubstring(string? text, int start, int length) + { + if (text == null || text.Length < start + length) + return null; + else + return new Java.Lang.String(text.Substring(start, length)); + } } }