From 810c294a7424aea2275ddeb56d024322172faf9e Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Mon, 12 Jan 2026 12:43:19 +0000 Subject: [PATCH] android - cancel back callbacks when handled (#20452) --- .../Avalonia.Android/AvaloniaActivity.cs | 17 +++++++++++++++++ .../Avalonia.Android/BackPressedCallback.cs | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/src/Android/Avalonia.Android/AvaloniaActivity.cs b/src/Android/Avalonia.Android/AvaloniaActivity.cs index 6ecd8367ae..c51edb00f4 100644 --- a/src/Android/Avalonia.Android/AvaloniaActivity.cs +++ b/src/Android/Avalonia.Android/AvaloniaActivity.cs @@ -29,6 +29,7 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity private bool _contentViewSet; internal AvaloniaView? _view; private BackPressedCallback? _currentBackPressedCallback; + private bool _shouldNavigateBack; public Action? ActivityResult { get; set; } public Action? RequestPermissionsResult { get; set; } @@ -65,6 +66,20 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity } } + /// + /// Gets whether to call the default back handler after our back handler is called. + /// + internal bool ShouldNavigateBack + { + get + { + var goBack = _shouldNavigateBack; + _shouldNavigateBack = false; + + return goBack; + } + } + event EventHandler? IAvaloniaActivity.Activated { add { _onActivated += value; } @@ -214,6 +229,8 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity var eventArgs = new AndroidBackRequestedEventArgs(); BackRequested?.Invoke(this, eventArgs); + + _shouldNavigateBack = !eventArgs.Handled; } private class GlobalLayoutListener : Java.Lang.Object, ViewTreeObserver.IOnGlobalLayoutListener diff --git a/src/Android/Avalonia.Android/BackPressedCallback.cs b/src/Android/Avalonia.Android/BackPressedCallback.cs index 18c8c4b0bc..993c19b700 100644 --- a/src/Android/Avalonia.Android/BackPressedCallback.cs +++ b/src/Android/Avalonia.Android/BackPressedCallback.cs @@ -10,6 +10,14 @@ namespace Avalonia.Android public override void HandleOnBackPressed() { activity.OnBackInvoked(); + + if (activity.ShouldNavigateBack) + { + this.Enabled = false; + activity.OnBackPressedDispatcher?.OnBackPressed(); + } + + this.Enabled = true; } } }