Skip to content

Commit c02b2b8

Browse files
emmaussMrJul
authored andcommitted
Fix insets on android 15 (#18844)
* fix insets on android 15 * add api diff * fix nit
1 parent b6b62f4 commit c02b2b8

File tree

7 files changed

+81
-30
lines changed

7 files changed

+81
-30
lines changed

api/Avalonia.nupkg.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,18 @@
103103
<Left>baseline/netstandard2.0/Avalonia.Controls.dll</Left>
104104
<Right>target/netstandard2.0/Avalonia.Controls.dll</Right>
105105
</Suppression>
106+
<Suppression>
107+
<DiagnosticId>CP0006</DiagnosticId>
108+
<Target>P:Avalonia.Controls.Platform.IInsetsManager.DisplayEdgeToEdgePreference</Target>
109+
<Left>baseline/netstandard2.0/Avalonia.Controls.dll</Left>
110+
<Right>target/netstandard2.0/Avalonia.Controls.dll</Right>
111+
</Suppression>
112+
<Suppression>
113+
<DiagnosticId>CP0006</DiagnosticId>
114+
<Target>P:Avalonia.Controls.Platform.IInsetsManager.DisplaysEdgeToEdge</Target>
115+
<Left>baseline/netstandard2.0/Avalonia.Controls.dll</Left>
116+
<Right>target/netstandard2.0/Avalonia.Controls.dll</Right>
117+
</Suppression>
106118
<Suppression>
107119
<DiagnosticId>CP0009</DiagnosticId>
108120
<Target>T:Avalonia.Diagnostics.StyleDiagnostics</Target>

samples/ControlCatalog/MainView.xaml.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,14 @@ protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
108108
ViewModel.SafeAreaPadding = insets.SafeAreaPadding;
109109
};
110110

111-
ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdge;
111+
ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdgePreference;
112112
ViewModel.IsSystemBarVisible = insets.IsSystemBarVisible ?? true;
113113

114114
ViewModel.PropertyChanged += async (sender, args) =>
115115
{
116116
if (args.PropertyName == nameof(ViewModel.DisplayEdgeToEdge))
117117
{
118-
insets.DisplayEdgeToEdge = ViewModel.DisplayEdgeToEdge;
118+
insets.DisplayEdgeToEdgePreference = ViewModel.DisplayEdgeToEdge;
119119
}
120120
else if (args.PropertyName == nameof(ViewModel.IsSystemBarVisible))
121121
{
@@ -124,7 +124,7 @@ protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
124124

125125
// Give the OS some time to apply new values and refresh the view model.
126126
await Task.Delay(100);
127-
ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdge;
127+
ViewModel.DisplayEdgeToEdge = insets.DisplayEdgeToEdgePreference;
128128
ViewModel.IsSystemBarVisible = insets.IsSystemBarVisible ?? true;
129129
};
130130
}

samples/SafeAreaDemo/ViewModels/MainViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public bool DisplayEdgeToEdge
7272

7373
if (_insetsManager != null)
7474
{
75-
_insetsManager.DisplayEdgeToEdge = value;
75+
_insetsManager.DisplayEdgeToEdgePreference = value;
7676
}
7777

7878
this.RaisePropertyChanged();
@@ -129,7 +129,7 @@ internal void Initialize(Control mainView, IInsetsManager? InsetsManager, IInput
129129
{
130130
_insetsManager.SafeAreaChanged += InsetsManager_SafeAreaChanged;
131131

132-
_displayEdgeToEdge = _insetsManager.DisplayEdgeToEdge;
132+
_displayEdgeToEdge = _insetsManager.DisplayEdgeToEdgePreference;
133133
_hideSystemBars = !(_insetsManager.IsSystemBarVisible ?? false);
134134
}
135135

src/Android/Avalonia.Android/Platform/AndroidInsetsManager.cs

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,20 @@ namespace Avalonia.Android.Platform
1717
{
1818
internal sealed class AndroidInsetsManager : WindowInsetsAnimationCompat.Callback, IInsetsManager, IOnApplyWindowInsetsListener, ViewTreeObserver.IOnGlobalLayoutListener, IInputPane
1919
{
20+
// For now, we check if running under net 9. TODO: remove runtime check when we target net 10
21+
private static bool IsDisplayEdgeToEdgeForced = System.Environment.Version.Major >=9 && Build.VERSION.SdkInt >= (BuildVersionCodes)35;
22+
2023
private readonly Activity _activity;
2124
private readonly TopLevelImpl _topLevel;
22-
private bool _displayEdgeToEdge;
25+
private bool _displaysEdgeToEdge;
2326
private bool? _systemUiVisibility;
2427
private SystemBarTheme? _statusBarTheme;
2528
private bool? _isDefaultSystemBarLightTheme;
2629
private Color? _systemBarColor;
2730
private InputPaneState _state;
2831
private Rect _previousRect;
2932
private Insets? _previousImeInset;
33+
private bool _displayEdgeToEdgePreference;
3034
private readonly bool _usesLegacyLayouts;
3135

3236
private AndroidWindow Window => _activity.Window ?? throw new InvalidOperationException("Activity.Window must be set.");
@@ -50,29 +54,42 @@ public InputPaneState State
5054
}
5155
}
5256

53-
public bool DisplayEdgeToEdge
57+
public bool DisplayEdgeToEdgePreference
5458
{
55-
get => _displayEdgeToEdge;
59+
get => _displayEdgeToEdgePreference;
5660
set
5761
{
58-
_displayEdgeToEdge = value;
62+
_displayEdgeToEdgePreference = value;
5963

60-
if (OperatingSystem.IsAndroidVersionAtLeast(28) && Window.Attributes is { } attributes)
61-
{
62-
attributes.LayoutInDisplayCutoutMode = value ? LayoutInDisplayCutoutMode.ShortEdges : LayoutInDisplayCutoutMode.Default;
63-
}
64+
UpdateDisplayEdgeToEgdeState();
65+
}
66+
}
6467

65-
WindowCompat.SetDecorFitsSystemWindows(Window, !value);
68+
private void UpdateDisplayEdgeToEgdeState()
69+
{
70+
if (IsDisplayEdgeToEdgeForced)
71+
{
72+
_displaysEdgeToEdge = true;
73+
return;
74+
}
6675

67-
if (value)
68-
{
69-
Window.AddFlags(WindowManagerFlags.TranslucentStatus);
70-
Window.AddFlags(WindowManagerFlags.TranslucentNavigation);
71-
}
72-
else
73-
{
74-
SystemBarColor = _systemBarColor;
75-
}
76+
_displaysEdgeToEdge = _displayEdgeToEdgePreference;
77+
78+
if (OperatingSystem.IsAndroidVersionAtLeast(28) && Window.Attributes is { } attributes)
79+
{
80+
attributes.LayoutInDisplayCutoutMode = _displayEdgeToEdgePreference ? LayoutInDisplayCutoutMode.ShortEdges : LayoutInDisplayCutoutMode.Default;
81+
}
82+
83+
WindowCompat.SetDecorFitsSystemWindows(Window, !_displayEdgeToEdgePreference);
84+
85+
if (_displayEdgeToEdgePreference)
86+
{
87+
Window.AddFlags(WindowManagerFlags.TranslucentStatus);
88+
Window.AddFlags(WindowManagerFlags.TranslucentNavigation);
89+
}
90+
else
91+
{
92+
SystemBarColor = _systemBarColor;
7693
}
7794
}
7895

@@ -89,7 +106,7 @@ internal AndroidInsetsManager(Activity activity, TopLevelImpl topLevel) : base(D
89106
_activity.Window?.DecorView.ViewTreeObserver?.AddOnGlobalLayoutListener(this);
90107
}
91108

92-
DisplayEdgeToEdge = false;
109+
DisplayEdgeToEdgePreference = false;
93110

94111
ViewCompat.SetWindowInsetsAnimationCallback(Window.DecorView, this);
95112
}
@@ -105,11 +122,11 @@ public Thickness SafeAreaPadding
105122
var renderScaling = _topLevel.RenderScaling;
106123

107124
var inset = insets.GetInsets(
108-
_displayEdgeToEdge ?
125+
DisplaysEdgeToEdge ?
109126
WindowInsetsCompat.Type.StatusBars() | WindowInsetsCompat.Type.NavigationBars() |
110127
WindowInsetsCompat.Type.DisplayCutout() : 0);
111128

112-
return new Thickness(inset.Left / renderScaling,
129+
return new Thickness(inset.Left / renderScaling,
113130
inset.Top / renderScaling,
114131
inset.Right / renderScaling,
115132
inset.Bottom / renderScaling);
@@ -264,7 +281,10 @@ public Color? SystemBarColor
264281
{
265282
_systemBarColor = value;
266283

267-
if (_systemBarColor is { } color && !_displayEdgeToEdge && _activity.Window != null)
284+
if (IsDisplayEdgeToEdgeForced)
285+
return;
286+
287+
if (_systemBarColor is { } color && !_displaysEdgeToEdge && _activity.Window != null)
268288
{
269289
_activity.Window.ClearFlags(WindowManagerFlags.TranslucentStatus);
270290
_activity.Window.ClearFlags(WindowManagerFlags.TranslucentNavigation);
@@ -282,6 +302,10 @@ public Color? SystemBarColor
282302
}
283303
}
284304

305+
public bool DisplayEdgeToEdge { get => DisplaysEdgeToEdge; set => DisplayEdgeToEdgePreference = value; }
306+
307+
public bool DisplaysEdgeToEdge => _displaysEdgeToEdge;
308+
285309
internal void ApplyStatusBarState()
286310
{
287311
IsSystemBarVisible = _systemUiVisibility;

src/Avalonia.Controls/Platform/IInsetsManager.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,20 @@ public interface IInsetsManager
1717
/// <summary>
1818
/// Gets or sets whether the window draws edge to edge. behind any visible system bars.
1919
/// </summary>
20+
bool DisplayEdgeToEdgePreference { get; set; }
21+
22+
23+
/// <summary>
24+
/// Gets or sets whether the window draws edge to edge. behind any visible system bars.
25+
/// </summary>
26+
[Obsolete("Use DisplayEdgeToEdgePreference")]
2027
bool DisplayEdgeToEdge { get; set; }
2128

29+
/// <summary>
30+
/// Gets whether the window is currently displaying edge to edge.
31+
/// </summary>
32+
bool DisplaysEdgeToEdge { get; }
33+
2234
/// <summary>
2335
/// Gets the current safe area padding.
2436
/// </summary>
@@ -39,9 +51,12 @@ public interface IInsetsManager
3951
public abstract class InsetsManagerBase : IInsetsManager
4052
{
4153
public virtual bool? IsSystemBarVisible { get; set; }
42-
public virtual bool DisplayEdgeToEdge { get; set; }
54+
public virtual bool DisplayEdgeToEdgePreference { get; set; }
55+
public virtual bool DisplayEdgeToEdge { get => DisplaysEdgeToEdge; set => DisplayEdgeToEdgePreference = value; }
4356
public virtual Thickness SafeAreaPadding { get; protected set; }
4457
public virtual Color? SystemBarColor { get; set; }
58+
public virtual bool DisplaysEdgeToEdge => DisplayEdgeToEdgePreference;
59+
4560
public event EventHandler<SafeAreaChangedArgs>? SafeAreaChanged;
4661

4762
protected void OnSafeAreaChanged(SafeAreaChangedArgs eventArgs)

src/Browser/Avalonia.Browser/BrowserInsetsManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public override bool? IsSystemBarVisible
1818
}
1919
}
2020

21-
public override bool DisplayEdgeToEdge { get; set; }
21+
public override bool DisplayEdgeToEdgePreference { get; set; }
2222

2323
public override Thickness SafeAreaPadding
2424
{

src/iOS/Avalonia.iOS/InsetsManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public override bool? IsSystemBarVisible
3535
}
3636
public event EventHandler<bool>? DisplayEdgeToEdgeChanged;
3737

38-
public override bool DisplayEdgeToEdge
38+
public override bool DisplayEdgeToEdgePreference
3939
{
4040
get => _displayEdgeToEdge;
4141
set

0 commit comments

Comments
 (0)