From 86b709db0b7dc91cd8a55785b8b18796e1a08dbd Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Thu, 20 Nov 2025 14:31:05 +0000 Subject: [PATCH] Android - fix api 36 compat (#20112) --- .../Avalonia.Android/AvaloniaActivity.cs | 29 ++++++++++++++++++- .../Platform/AndroidInsetsManager.cs | 4 ++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/Android/Avalonia.Android/AvaloniaActivity.cs b/src/Android/Avalonia.Android/AvaloniaActivity.cs index cf425d279e..e810de050c 100644 --- a/src/Android/Avalonia.Android/AvaloniaActivity.cs +++ b/src/Android/Avalonia.Android/AvaloniaActivity.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Runtime.Versioning; using Android.App; @@ -7,6 +8,7 @@ using Android.Content.PM; using Android.OS; using Android.Runtime; using Android.Views; +using Android.Window; using AndroidX.AppCompat.App; using Avalonia.Android.Platform; using Avalonia.Android.Platform.Storage; @@ -19,7 +21,7 @@ namespace Avalonia.Android; /// Common implementation of android activity that is integrated with Avalonia views. /// If you need a base class for main activity of Avalonia app, see or . /// -public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity +public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity, IOnBackInvokedCallback { private EventHandler? _onActivated, _onDeactivated; private GlobalLayoutListener? _listener; @@ -77,6 +79,13 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity [ObsoletedOSPlatform("android33.0")] public override void OnBackPressed() { + // For now, if target sdk version is api 36, skip raising BackRequested on OnBackPressed. + // This behavior would be different for Net 10 + if (OperatingSystem.IsAndroidVersionAtLeast(33) + && Build.VERSION.SdkInt >= (BuildVersionCodes)36 + && ApplicationContext?.ApplicationInfo?.TargetSdkVersion >= (BuildVersionCodes)36) + return; + var eventArgs = new AndroidBackRequestedEventArgs(); BackRequested?.Invoke(this, eventArgs); @@ -120,12 +129,23 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity protected override void OnStop() { _onDeactivated?.Invoke(this, new ActivatedEventArgs(ActivationKind.Background)); + + if (OperatingSystem.IsAndroidVersionAtLeast(33)) + { + OnBackInvokedDispatcher.UnregisterOnBackInvokedCallback(this); + } + base.OnStop(); } protected override void OnStart() { _onActivated?.Invoke(this, new ActivatedEventArgs(ActivationKind.Background)); + + if (OperatingSystem.IsAndroidVersionAtLeast(33)) + { + OnBackInvokedDispatcher.RegisterOnBackInvokedCallback(IOnBackInvokedDispatcher.PriorityDefault, this); + } base.OnStart(); } @@ -186,6 +206,13 @@ public class AvaloniaActivity : AppCompatActivity, IAvaloniaActivity _view = new AvaloniaView(this) { Content = initialContent }; } + public void OnBackInvoked() + { + var eventArgs = new AndroidBackRequestedEventArgs(); + + BackRequested?.Invoke(this, eventArgs); + } + private class GlobalLayoutListener : Java.Lang.Object, ViewTreeObserver.IOnGlobalLayoutListener { private readonly AvaloniaView _view; diff --git a/src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs b/src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs index 8a3685b65e..f5e2ae09ef 100644 --- a/src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs +++ b/src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs @@ -285,7 +285,9 @@ namespace Avalonia.Android.Platform if (_isDisplayEdgeToEdgeForced) { // Allow having fully transparent navbars when on api level 35 - if (OperatingSystem.IsAndroidVersionAtLeast(35)) + if (OperatingSystem.IsAndroidVersionAtLeast(36)) + Window.NavigationBarContrastEnforced = false; + else if (OperatingSystem.IsAndroidVersionAtLeast(35)) Window.NavigationBarContrastEnforced = _systemBarColor != Colors.Transparent; return; }