|
|
@@ -2,11 +2,10 @@
|
|
|
using System.Collections.Generic;
|
|
|
using Android.OS;
|
|
|
using Android.Views;
|
|
|
-using AndroidX.AppCompat.App;
|
|
|
using AndroidX.Core.View;
|
|
|
using Avalonia.Android.Platform.SkiaPlatform;
|
|
|
using Avalonia.Controls.Platform;
|
|
|
-using static Avalonia.Controls.Platform.IInsetsManager;
|
|
|
+using Avalonia.Media;
|
|
|
|
|
|
namespace Avalonia.Android.Platform
|
|
|
{
|
|
|
@@ -20,6 +19,7 @@ namespace Avalonia.Android.Platform
|
|
|
private bool? _systemUiVisibility;
|
|
|
private SystemBarTheme? _statusBarTheme;
|
|
|
private bool? _isDefaultSystemBarLightTheme;
|
|
|
+ private Color? _systemBarColor;
|
|
|
|
|
|
public event EventHandler<SafeAreaChangedArgs> SafeAreaChanged;
|
|
|
|
|
|
@@ -36,6 +36,16 @@ namespace Avalonia.Android.Platform
|
|
|
}
|
|
|
|
|
|
WindowCompat.SetDecorFitsSystemWindows(_activity.Window, !value);
|
|
|
+
|
|
|
+ if(value)
|
|
|
+ {
|
|
|
+ _activity.Window.AddFlags(WindowManagerFlags.TranslucentStatus);
|
|
|
+ _activity.Window.AddFlags(WindowManagerFlags.TranslucentNavigation);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SystemBarColor = _systemBarColor;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -93,6 +103,7 @@ namespace Avalonia.Android.Platform
|
|
|
public WindowInsetsCompat OnApplyWindowInsets(View v, WindowInsetsCompat insets)
|
|
|
{
|
|
|
NotifySafeAreaChanged(SafeAreaPadding);
|
|
|
+ insets = ViewCompat.OnApplyWindowInsets(v, insets);
|
|
|
return insets;
|
|
|
}
|
|
|
|
|
|
@@ -146,8 +157,6 @@ namespace Avalonia.Android.Platform
|
|
|
|
|
|
compat.AppearanceLightStatusBars = value == Controls.Platform.SystemBarTheme.Light;
|
|
|
compat.AppearanceLightNavigationBars = value == Controls.Platform.SystemBarTheme.Light;
|
|
|
-
|
|
|
- AppCompatDelegate.DefaultNightMode = isDefault ? AppCompatDelegate.ModeNightFollowSystem : compat.AppearanceLightStatusBars ? AppCompatDelegate.ModeNightNo : AppCompatDelegate.ModeNightYes;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -190,10 +199,36 @@ namespace Avalonia.Android.Platform
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public Color? SystemBarColor
|
|
|
+ {
|
|
|
+ get => _systemBarColor;
|
|
|
+ set
|
|
|
+ {
|
|
|
+ _systemBarColor = value;
|
|
|
+
|
|
|
+ if (_systemBarColor is { } color && !_displayEdgeToEdge && _activity.Window != null)
|
|
|
+ {
|
|
|
+ _activity.Window.ClearFlags(WindowManagerFlags.TranslucentStatus);
|
|
|
+ _activity.Window.ClearFlags(WindowManagerFlags.TranslucentNavigation);
|
|
|
+ _activity.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
|
|
|
+
|
|
|
+ var androidColor = global::Android.Graphics.Color.Argb(color.A, color.R, color.G, color.B);
|
|
|
+ _activity.Window.SetStatusBarColor(androidColor);
|
|
|
+
|
|
|
+ if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
|
|
|
+ {
|
|
|
+ // As we can only change the navigation bar's foreground api 26 and newer, we only change the background color if running on those versions
|
|
|
+ _activity.Window.SetNavigationBarColor(androidColor);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
internal void ApplyStatusBarState()
|
|
|
{
|
|
|
IsSystemBarVisible = _systemUiVisibility;
|
|
|
SystemBarTheme = _statusBarTheme;
|
|
|
+ SystemBarColor = _systemBarColor;
|
|
|
}
|
|
|
|
|
|
private class InsetsAnimationCallback : WindowInsetsAnimationCompat.Callback
|